Hamburg/Gateway
Anforderungen
Grundsätzlich kann man keine idealen Mindestanforderungen vorgeben. Um einen kleinen Überblick darüber zu bieten was aber in etwa notwendig ist, haben wir eine kleine Zusammenfassung gebastelt.
Übersicht
Netze
Netzwerk | IP-Bereich | ASN |
---|---|---|
ICVPN | 10.112.0.0/18 | 65112 |
ULA | fd51:2bb2:fd0d::/64 | 65112 |
Förderverein | 2001:bf7:180::/44 | |
Rheinland | 2a03:2267::/32 | 49009 |
Richtfunk | 10.112.62.1 – 10.112.63.255 | n/a |
IPv4
Hamburg ist das Netz 10.112.0.0/16 zugeteilt. Daraus nutzen wir im Mesh das Netz 10.112.0.0/18. (Temporär für das Kampnagel-GW: 10.112.64.0/18)
IPv6
Uns sind in Hamburg folgende Netze zugeteilt (siehe hier und hier):
- Unique Local Unicast Netz: fd51:2bb2:fd0d::/48
- Öffentliche Netze 2001:bf7:180::/44, 2001:bf7:190::/44, 2001:bf7:200::/44, 2001:bf7:210::/44, 2001:bf7:220::/44 und 2001:bf7:230::/44
Im Mesh werden davon fd51:2bb2:fd0d::/64 und 2001:bf7:180::/64 genutzt, wobei letzteres auch ins Internet geroutet wird. Dadurch ist Internetzugang per IPv6 ohne VPN ins Ausland möglich. Gleichzeitig ist das gesamte Freifunk Netz aus dem Internet erreichbar.
(Temporär für das Kampnagel-GW benutzen wir das jeweils nächste /64, also: fd51:2bb2:fd0d:a0b::/64 und 2001:bf7:180:a0b::/64)
Infrastruktur
Element | IPv6 | ULA | RFC1918 | DHCP | ICVPN-Transit | B.A.T.M.A.N.-adv. MAC(s) | Dienste | Standort | Betreuer | Internet-Gateway |
---|---|---|---|---|---|---|---|---|---|---|
srv01 | 2a03:2267::101 | fd51:2bb2:fd0d::101 | 10.112.1.1 | n/a | de:ad:be:ef:08:15 | Primary DNS: hamburg.freifunk.net., ffhh. postmaster, mail, smtp, imap meta. www. formular. graph. git. media. 1.ntp.services.ffhh 1.updates.services.ffhh |
VM auf worker | NOC | n/a | |
srv02 | 2a03:2267::102 | fd51:2bb2:fd0d::102 | 10.112.1.2 | n/a | de:ad:be:ef:08:16 | 2.ntp.services.ffhh 2.updates.services.ffhh media. |
NOC | n/a | ||
gw01 | 2a03:2267::202 | fd51:2bb2:fd0d::202 | 10.112.1.11 | 10.112.2.2 – 10.112.9.254 | n/a | de:ad:be:ef:01:01 | n/a | artfiles | NOC | IPv4: Rheinland IPv6: peering |
gw02 | 2a03:2267::201 | fd51:2bb2:fd0d::201 | 10.112.42.1 | 10.112.10.2 – 10.112.17.254 | n/a | de:ad:be:ef:05:05 | n/a | n@work | NOC | IPv4: Rheinland IPv6: peering |
gw03 | 2a03:2267::301 | fd51:2bb2:fd0d::301 | 10.112.1.3 | 10.112.18.2 – 10.112.25.254 | n/a | de:ad:be:ef:03:03 | n/a | IPHH | NOC | IPv4: Rheinland IPv6: peering |
gw05 | 2a03:2267::d01 | 10.112.1.5 | 10.112.34.2 – 10.112.41.254 | de:ad:be:ef:22:22 de:ad:be:ef:22:23 |
n/a | VM auf priv. Host bei Hetzner | leo | IPv4: Rheinland | ||
gw08 | 2a03:2267::b01 | fd51:2bb2:fd0d::b01 | 10.112.1.8 | 10.112.50.2 – 10.112.53.254 | n/a | de:ad:be:ef:88:88 de:ad:be:ef:88:89 |
n/a | VM auf priv. Host bei Hetzner, RZ20 | peter | Mullvad 2 |
gw09 | 2a03:2267::901 2a01:4f8:120:438c::2 |
fd51:2bb2:fd0d::901 | 10.112.1.9 | 10.112.54.2 – 10.112.57.254 | n/a | de:ad:be:ef:66:66 de:ad:be:ef:66:67 |
n/a | Dedizierter Server bei Hetzner | thomas | Mullvad 2 |
gw12 | 2a03:2267::501 | fd51:2bb2:fd0d::501 | 10.112.1.12 | 10.112.58.2 – 10.112.61.254 | n/a | de:ad:be:ef:01:14 de:ad:be:ef:01:15 |
n/a | VM bei netcup | martin | Mullvad 2 |
wandale0 | 2a00:ea8:100:8::2 | eBGP | n@work | NOC | ||||||
wende0 | 2001:868:100:d00::10 | eBGP | IPHH | NOC | ||||||
suede0 | 2a00:1f78:c:e::e | eBGP | artfiles | NOC |
Benutzerverwaltung
Zunächst sollte die Benutzer eingerichtet werden, die Zugriff auf das gateway haben sollen. Nehmen wir an, ein Nutzer soll sudo-Rechte bekommen wird er wie folgt angelegt
useradd -m -G sudo **BENUTZERNAME**
Zunächst wird ein dummy-Kennwort vergeben, dass dem Benutzer mitgeteilt wird:
passwd **BENUTZERNAME**
Das Kennwort wird auf abgelaufen gesetzt, damit er sich bei der ersten Anmeldung gleich selbst ein neues geben muss:
chage -d0 **BENUTZERNAME**
Die öffentlichen ssh-Schlüssel der freifunker liegen auf github. Der Schlüssel wird für einen Benutzer autorisiert:
mkdir /home/**BENUTZERNAME**/.ssh touch /home/**BENUTZERNAME**/.ssh/authorized_keys vi /home/**BENUTZERNAME**/.ssh/authorized_keys
Dann den Schlüssel einfügen. Auf die Datei darf nur die vom jeweiligen Benutzer zugegriffen werden:
chown **BENUTZERNAME**:**BENUTZERNAME** /home/**BENUTZERNAME**/.ssh -R
Sind die wichtigen Benutzer angelegt und sind alle Anmeldungen erfolgreich getestet, sollte aus Sicherheitsgründen verhindert werden, dass sich root direkt anmelden kann und dass Benutzer sich über ihr Kennwort anmelden können. Sie sollen sich also nur noch über ihren ssh-Schlüssel anmelden:
vi /etc/ssh/sshd_config
Das geschieht, indem die folgenden drei Parameter gesetzt werden.
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes
Einwahlknoten
Im ersten Schritt der gateway-Konfiguration wird zunächst nur sicher gestellt, dass er die Knoten untereinander vernetzt, ohne das bereits ein Internetzugang bereitgestellt wird. Dazu werden folgende Tätigkeiten durchgeführt:
- Quell-Listen für fastd und B.A.T.M.A.N. definieren
- Installation von fastd, B.A.T.M.A.N. und bridge-utils
- Konfiguration der Netzwerkschnittstellen
- Installation von git
- Clonenen des Schlüssel-repos
- Automatisches importieren der fastd-Schlüssel der Knoten
- Hochfahren
Quell-Listen definieren
$ vim /etc/apt/sources.list
deb http://security.debian.org/ wheezy/updates main contrib non-free deb-src http://security.debian.org/ wheezy/updates main contrib non-free # fastd deb http://ftp.de.debian.org/debian wheezy-backports main deb https://repo.universe-factory.net/debian/ sid main
Schlüssel für repo importieren:
gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
gpg -a --export 16EF3F64CB201D9C | apt-key add -
sudo apt-key adv --recv-keys --keyserver keys.gnupg.net 16EF3F64CB201D9C
Installation von fastd, B.A.T.M.A.N. und bridge-utils
Packetmanager aktualisieren:
# apt-get update
Installieren:
# apt-get install batctl batman-adv-dkms fastd bridge-utils
Neue Datei, Autostart des B.A.T.M.A.N.-Moduls
# vim /etc/modules
batman-adv
Konfiguration der Netzwerkschnittstellen
fastd
$ mkdir /etc/fastd/ffhh-mesh-vpn
Neue Datei anlegen und eine ausgedachte MAC einsetzen (mit : als Trennzeichen). Die MAC-Adressen sollten dem de:ad:be:ef
Schema folgen und sollte hier vermerkt werden. Sie muss der gateway-AG mitgeteilt werden, damit sie die in die Schlüsseldatei des neuen gateways in fastd-Schlüsselrepo eintragen.
$ vim /etc/fastd/ffhh-mesh-vpn/fastd.conf
log to syslog level debug; interface "ffhh-mesh-vpn"; method "salsa2012+gmac"; # new method, between gateways for the moment (faster) method "xsalsa20-poly1305"; # old method bind 0.0.0.0:10000; hide ip addresses yes; hide mac addresses yes; include "secret.conf"; mtu 1426; # 1492 - IPv4 Header - fastd Header... include peers from "peers"; on up " ifup bat0 ip link set address **HIER AUSGEDACHTE MAC EINSETZEN** up dev $INTERFACE ";
Einen fastd Schlüsselpaar erzeugen kann man über:
$ fastd --generate-key
ABER, dies ist bei der Einrichtung eines neuen gateways idR. nicht notwendig(!). Damit nicht bei jedem hinzukommenden gateway eine Aktualisierung der firmware über alle router gefahren werden muss, wurden Schlüsselpaare für 20 gateways vorgeneriert und die öffentl. Schlüssel bereits in die firmware integriert. Es gilt also den passenden privaten Schlüssel für das aufzusetzende gateway von der gateway AG zu bekommen (Freifunk_Hamburg/FastdKeys). Dieser geheime Schlüssel wird dann in eine neue Datei eingetragen (Anführungszeichen & Semikolon nicht vergessen). Der dazugehörige öffentliche Schlüssel muss wie die MAC ebenfalls Sie von der gateway-AG in die Schlüsseldatei des neuen gateways in fastd-Schlüsselrepo eintragen werden.
$ vim /etc/fastd/ffhh-mesh-vpn/secret.conf
secret "**HIER GEHEIMEN SCHLUESSEL EINSETZEN**";
Pubkey kann anschliessend mit $ fastd -c /etc/fastd/ffhh-mesh-vpn/fastd.conf --show-key
angezeigt werden.
SSH-Schlüsselpaar erzeugen zur Verbindung des gateways mit dem geschlossenen git repo, welches die fastd Schlüssel der nodes enthält:
Damit das neue gateway das fastd-Schlüsselrepo lesen kann, muss es sich identifizieren. Dafür wird ein ssh-Schlüssel erzeugt:
$ ssh-keygen
Den öffentlichen Schlüssel an gateway-AG senden. Der nächste Schritt (Klonen des repos) funktioniert erst, wenn der Schlüssel von der gateways AG eingetragen wurde.
Brückenschnittstelle
Brückenschnittstelle anlegen. Verwendete IP Adressen (v4 & v6) müssen dokumentiert werden. An die Datei interfaces wird angehängt:
$ vim /etc/network/interfaces
auto br-ffhh iface br-ffhh inet6 static bridge-ports none address **STATISCHE IPv6 DES GATEWAYS EINSETZEN; BEISPIEL FÜR GW03 fd51:2bb2:fd0d:0::c01** netmask 64 iface br-ffhh inet static address **STATISCHE IPv4 DES GATEWAYS EINSETZEN; BEISPIEL FÜR GW02 10.112.12.1** netmask 255.255.192.0 allow-hotplug bat0 iface bat0 inet6 manual pre-up modprobe batman-adv pre-up batctl if add ffhh-mesh-vpn up ip link set $IFACE up post-up brctl addif br-ffhh $IFACE post-up batctl it 10000 post-up /sbin/ip rule add from all fwmark 0x1 table 42 pre-down brctl delif br-ffhh $IFACE || true down ip link set $IFACE down
git installieren
$ apt-get install git
Klonen des Schlüssel-repos
$ cd /etc/fastd/ffhh-mesh-vpn/
$ git clone git@git.hamburg.freifunk.net:fastdkeys peers
Automatisches Shell Skripte
Automatisches importieren der fastd-Schlüssel der Knoten
autoupdate_fastd_keys.sh erstellen, welches sich die fastd-Schlüssel von github holt. (Quelle: http://freifunk.in-kiel.de/debian/fastd-update)
$ mkdir /root/bin
Neues shell-Skript erzeugen:
$ vim /root/bin/autoupdate_fastd_keys.sh
#!/bin/bash # Simple script to update fastd peers from git upstream # and only send HUP to fastd when changes happend. # CONFIGURE THIS TO YOUR PEER DIRECTORY FASTD_PEERS=/etc/fastd/ffhh-mesh-vpn/peers function getCurrentVersion() { # Get hash from latest revision git log --format=format:%H -1 } cd $FASTD_PEERS # Get current version hash GIT_REVISION=$(getCurrentVersion) # Automagically commit local changes # This preserves local changes git commit -m "CRON: auto commit" # Pull latest changes from upstream git fetch git merge origin/master -m "Auto Merge" # Get new version hash GIT_NEW_REVISION=$(getCurrentVersion) if [ $GIT_REVISION != $GIT_NEW_REVISION ] then # Version has changed we need to update echo "Reload fastd peers" kill -HUP $(pidof fastd) fi
Ausführbar machen:
$ chmod +x /root/bin/autoupdate_fastd_keys.sh
Automatisches Prüfen, ob das gateway (noch) ein gateway in das Internet ist
cd /usr/local/bin
wget https://raw.githubusercontent.com/freifunkhamburg/puppet-ff_gw/master/files/usr/local/bin/check_gateway
Ausführbar machen:
chmod +x check_gateway
cronjob
cronjob erstellen, der autoupdate_fastd_keys.sh alle 5min ausführt, sowie check_gateway hinzufügen. Dazu folgende zwei Zeilen hinzufügen
$ crontab -e
*/5 * * * * /root/bin/autoupdate_fastd_keys.sh > /dev/null 2>&1 * * * * * /usr/local/bin/check_gateway > /dev/null 2>&1
Hochfahren
bridge-Schnittstelle hochfahren
$ brctl addbr br-ffhh
$ ifup br-ffhh
B.A.T.M.A.N. kernel-Modul laden
$ modprobe batman-adv
fastd starten
$ service fastd start
Exit Node Gateway
Im zweiten Schritt wird das gateway auch zum gateway ins Internet und zum DHCP-server.
Benötigte software:
- IPv4: dhcpd
- rooting daemon für IPv6: radvd
- VPN: openvpn
- firewall: IPtables
- DNS: dnsmasq
Konfigurationsdateien:
- dhcp.conf
- radvd.conf
- openvpn.conf
- iptables (NAT 44)
Installieren
$ apt-get install isc-dhcp-server radvd openvpn iptables-persistent dnsmasq
IPv4 DHCP konfigurieren
Dabei wird pro gateway ein /18er-Netz in der ffhh-IP-range 10.112.x.x vergeben. Die bereits vergebenen Subnetze sind unter https://wiki.freifunk.net/Freifunk_Hamburg/%C3%9Cber#Subnetze aufgeführt.
dhcpd.conf Inhalt ersetzen:
$ vim /etc/dhcp/dhcpd.conf
# The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the # behavior of the version 2 packages ('none', since DHCP v2 didn't # have support for DDNS.) ddns-update-style none; # option definitions common to all supported networks... option domain-name ".ffhh"; default-lease-time 600; max-lease-time 3600; log-facility local7; subnet 10.112.0.0 netmask 255.255.192.0 { authoritative; range 10.112.**START-IP-BEREICH** 10.112.**ENDE-IP-BEREICH**; # DNS: srv01 (10.112.1.1) & gw01 (10.112.14.1) option domain-name-servers **EIGENE IPv4 DES GATEWAYS im FF-NETZ**, 10.112.1.1; option routers **EIGENE IPv4 DES GATEWAYS im FF-NETZ**; } include "/etc/dhcp/static.conf";
Für die Vergabe der statischen IPs gibt's ein https://github.com/freifunkhamburg/dhcp-static. Um die Konfiguration aus dem repo zu bekommen wird der Benutzer dhcpstatic angelegt:
useradd -m -s /bin/bash dhcpstatic
Dann wird in seinem Heimverzeichnis das git repo geconet.
cd /home/dhcpstatic git clone https://github.com/freifunkhamburg/dhcp-static chown dhcpstatic:dhcpstatic dhcp-static -R /home/dhcpstatic/dhcp-static/updateStatics.sh
Ein cronjob soll die Konfiguration aus dem repo übernehmen.
crontab -e
*/5 * * * * /home/dhcpstatic/dhcp-static/updateStatics.sh > /dev/null 2>&1
Das Logging des dhcpd wird nun konfiguriert. Die Datei /etc/rsyslog.d/dhcpd.conf anlegen mit dem Inhalt
local7.warn /var/log/dhcpd.log
Danach die Logdatei anlegen
touch /var/log/dhcpd.log chown root:adm /var/log/dhcpd.log chmod 600 /var/log/dhcpd.log
Nun in der Datei /etc/rsyslog.conf die Zeile
mail,news.none; -/var/log/messages
in
mail,news.none;local7.none -/var/log/messages
ändern. Und die Zeile
*.*;auth,authpriv.none; -/var/log/syslog
in
*.*;auth,authpriv.none;local7.none -/var/log/syslog
ändern.
Nun rsyslog neustarten
service rsyslog restart
Der DHCP-Dienst wird gestartet.
service isc-dhcp-server restart
DNS per dnsmasq konfigurieren
Für die Konfiguration der DNS Auflösung gibt es ein git [1]. Um die Konfiguration aus dem repo zu bekommen wird der Benutzer ffdnsmasq angelegt:
useradd -m -s /bin/bash ffdnsmasq
Dann wird in seinem Heimverzeichnis das git repo gecloned.
cd /home/ffdnsmasq git clone https://github.com/freifunkhamburg/dnsmasq chown ffdnsmasq:ffdnsmasq dnsmasq -R /home/ffdnsmasq/dnsmasq/updateDnsmasq.sh
Ein cronjob soll die Konfiguration aus dem repo übernehmen.
crontab -e
*/5 * * * * /home/ffdnsmasq/dnsmasq/updateDnsmasq.sh > /dev/null 2>&1
Nun dnsmasq startet über
service dnsmasq restart
IPv6 radvd konfigurieren
radvd.conf neu anlegen:
$ vim /etc/radvd.conf
interface br-ffhh { AdvSendAdvert on; MaxRtrAdvInterval 200; prefix fd51:2bb2:fd0d::/64 { }; RDNSS **STATISCHE IPv6 DES GATEWAYS; BEISPIEL FÜR GW03 fd51:2bb2:fd0d::c01** { }; }; # vim: noai:ts=4:sw=4:ff=unix:ft=text:fdm=marker
IPv4 & IPv6 forwarding aktivieren. Dazu folgende Zeilen in der sysctl.conf einkommentieren
$ vim /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding = 1
VPN konfigurieren
Vorsicht! Bei Hetzernrechnern muss vorher eine Konfigurationsdatei entfernt werden:
mv /etc/sysctl.d/99-hetzner.conf /root
Als VPN-Dienste ins Internet werden Mullvad oder hide.me oder IPredator genutzt.
Wenn OpenVPN gestartet wird, öffnet es standardmäßig alle Tunnel, die unter /etc/openvpn konfiguriert sind. In unserem Fall brauchen wir natürlich nur einen Tunnel zum Internet, selbst wenn sowohl mullvad als auch hide.me hinterlegt sein sollten. Welcher der beiden Tunnel gestartet wird, wird eingestellt unter:
vi /etc/default/openvpn
Mullvad
mullvad Dateien bekommt man von Andre. Diese kopieren nach
cp -r **KUNDENNUMMER** /etc/openvpn/mullvad
Dann mullvad up skript editieren
vim /etc/openvpn/mullvad/mullvad-up
#!/bin/bash /sbin/ip route replace 0.0.0.0/1 via $5 table 42 /sbin/ip route replace 128.0.0.0/1 via $5 table 42 /usr/sbin/service dnsmasq restart exit 0
Es gibt Berichte, wonach mit bestimmten OpenVPN Versionen hier jeweils $4 anstatt $5 stehen muss, dass konnten wir aber bisher nicht verifizieren. Wir nutzen OpenVPN aus den Debian Backports.
Ausführbar machen:
chmod +x /etc/openvpn/mullvad/mullvad-up
OpenVPN Konfigurationsdatei schreiben
vim /etc/openvpn/mullvad.conf
client dev-type tun dev mullvad proto udp #proto tcp #remote openvpn.mullvad.net 1194 #remote openvpn.mullvad.net 443 #remote openvpn.mullvad.net 53 #remote se.mullvad.net # Servers in Sweden remote nl.mullvad.net # Servers in the Netherlands # Keep trying indefinitely to resolve the # host name of the OpenVPN server. Very useful # on machines which are not permanently connected # to the internet such as laptops. resolv-retry infinite # Most clients don't need to bind to # a specific local port number. nobind # Try to preserve some state across restarts. persist-key persist-tun # Enable compression on the VPN link. comp-lzo # Set log file verbosity. verb 3 remote-cert-tls server ping-restart 60 # Allow calling of built-in executables and user-defined scripts. script-security 2 # Parses DHCP options from openvpn to update resolv.conf route-noexec up /etc/openvpn/mullvad/mullvad-up ping 10 ca /etc/openvpn/mullvad/master.mullvad.net.crt cert /etc/openvpn/mullvad/mullvad.crt key /etc/openvpn/mullvad/mullvad.key
hide.me
hide.me Dateien bekommt man von Andre. Diese kopieren nach
cp -r /etc/openvpn/hideme
Dann hideme up skript editieren
vim /etc/openvpn/hideme/hideme-up
#!/bin/bash /sbin/ip route replace 0.0.0.0/1 via $4 table 42 /sbin/ip route replace 128.0.0.0/1 via $4 table 42 /usr/sbin/service dnsmasq restart exit 0
Ausführbar machen:
chmod +x /etc/openvpn/hideme/hideme-up
OpenVPN Konfigurationsdatei schreiben
vim /etc/openvpn/hideme.conf
client dev-type tun proto udp remote nl.hide.me 3478 cipher AES-128-CBC resolv-retry infinite nobind persist-key persist-tun mute-replay-warnings ca /etc/openvpn/hideme/TrustedRoot.pem verb 3 auth-user-pass /etc/openvpn/hideme/auth.txt reneg-sec 0 # ping 5 # this is pushed by hideme # ping-restart 15 # this is pushed by hideme ## the following options originate from mullvad.conf dev mullvad # this is important because other scripts rely on this device name # Allow calling of built-in executables and user-defined scripts. script-security 3 system # Parses DHCP options from openvpn to update resolv.conf route-noexec # use our script (next option) up /etc/openvpn/hideme/hideme-up # this sets the default route for freifunk traffic, is the same for hideme and mullvad
IPredator
Die IPredator Dateien kopieren nach
cp -r /etc/openvpn/ipredator
Dann das ipredator-up Script editieren
vim /etc/openvpn/ipredator/ipredator-up
#!/bin/sh
IP=$4 BASE="$(echo $IP | cut -d. -f1-3)" LSV="$(echo $IP | cut -d. -f4)" if test $LSV -gt 128; then LSV=128 else LSV=0 fi echo $LSV GW=$BASE.$((LSV+1)) SERVER=$BASE.$((LSV+2)) ip route add $SERVER/32 via 212.12.51.129 ip route del 0.0.0.0/1 table 42 ip route del 128.0.0.0/1 table 42 ip route add 0.0.0.0/1 via $GW table 42 ip route add 128.0.0.0/1 via $GW table 42 exit 0
Ausführbar machen:
chmod +x /etc/openvpn/ipredator/ipredator-up
OpenVPN Konfigurationsdatei schreiben und die entsprechenden Zertifikate einsetzen.
vim /etc/openvpn/ipredator.conf
client dev mullvad dev-type tun proto udp remote pw.openvpn.ipredator.se 1194 remote pw.openvpn.ipredator.me 1194 remote pw.openvpn.ipredator.es 1194 resolv-retry infinite nobind auth-user-pass /etc/openvpn/ipredator/IPredator.auth auth-retry nointeract ca [inline] tls-client tls-auth [inline] ns-cert-type server keepalive 10 30 cipher AES-256-CBC persist-key persist-tun comp-lzo tun-mtu 1500 mssfix 1200 passtos verb 3 route-noexec script-security 2 up /etc/openvpn/ipredator/ipredator-up <ca> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </ca> <tls-auth> -----BEGIN OpenVPN Static key V1----- ... -----END OpenVPN Static key V1----- </tls-auth>
In der Datei /etc/openvpn/ipredator/IPredator.auth
Username (in der ersten Zeile) und Passwort (in der zweiten Zeile) hinterlegen.
IPtables anpassen
$ vim /etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Sun Mar 24 14:14:50 2013 *filter :INPUT ACCEPT [273:40363] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [194:28568] COMMIT # Completed on Mon Mar 25 19:41:40 2013 # Generated by iptables-save v1.4.14 on Mon Mar 25 19:41:40 2013 *mangle :PREROUTING ACCEPT [286:41734] :INPUT ACCEPT [273:40363] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [194:28568] :POSTROUTING ACCEPT [194:28568] -A PREROUTING -i br-ffhh -j MARK --set-xmark 0x1/0xffffffff COMMIT # Completed on Mon Mar 25 19:41:40 2013 # Generated by iptables-save v1.4.14 on Mon Mar 25 19:41:40 2013 *nat :PREROUTING ACCEPT [15:1459] :INPUT ACCEPT [2:88] :OUTPUT ACCEPT [1:74] :POSTROUTING ACCEPT [1:74] -A POSTROUTING -o mullvad -j MASQUERADE COMMIT # Completed on Mon Mar 25 19:41:40 2013
rc.local editieren. Alle 0x1 makierten Pakete nach Regel 42 behandeln
$ vim /etc/rc.local
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /sbin/ip route add unreachable default table 42 /sbin/ip rule add from all fwmark 0x1 table 42 exit 0
IPtables starten
/etc/init.d/iptables-persistent start
Peering
Diese Anleitung ermöglicht es den gateways über ICPVN mit anderen Städten Verbindung auf zu bauen. ICVPN nutzt tinc als VPN. bird6 dient zum Routenaustausch zwischen den gateways. Alle folgenden Beispiele beziehen sich auf das gateway03. Die Einträge müssen bei neuen gateways entsprechend angepasst werden.
Tinc ist ein VPN client, der die Städte untereinander verbindet. Er muss also nur installiert werden, wenn das gateway externes peering zu anderen Städten machen soll. Internes peering geht ohne tinc über die bestehenden fastd Tunnel. In beiden fällen erfolgt der Routenaustausch über BGP. In der Regel recht es, wenn zwei gateways extern peeren. Denn für jede Änderung der Konfiguration müssen alle teilnehmenden Städte ihre Konfiguration anpassen.
Installieren:
$ aptitude install tinc bird bird6
tinc
Im freifunk-Wiki unter Intercity VPN im Abschnitt BGP einrichten freie IPv4 10.207.0.x wählen und eintragen. Letzten 32bit der IPv6 (also alles nach fec0::) ist die IPv4-Adresse übersetzt in Hex. Viele der anderen IC-VPN-Teilnehmer nutzen übrigens quagga als BGP-Dienst anstatt bird. Deshalb steht im IC-VPN die quagga-Konfiguration:
neighbor **IPv4 WÄHLEN** remote-as 65112 # Beispiel für gw03: 10.207.0.61 neighbor **IPv4 WÄHLEN** description **NAME WÄHLEN** #Beispiel für gw03 IP: 10.207.0.61 und Name: Hamburg03 neighbor **IPv4 WÄHLEN** peer-group icvpn4 #Beispiel für gw03: 10.207.0.61 neighbor **IPv6 WÄHLEN** remote-as 65112 # Beispiel für gw03: fec0::a:cf:0:3d neighbor **IPv6 WÄHLEN** description **NAME WÄHLEN** #Beispiel für gw03 IP: fec0::a:cf:0:3d und Name: Hamburg03 neighbor **IPv6 WÄHLEN** peer-group icvpn6 # Beispiel für gw03: fec0::a:cf:0:3d
Im Abschnitt Netzübersicht das Netzwerk eintragen. Hier wieder die Beispiele für gw03 - bitte entsprechend anpassen.
Hamburg03 65112 10.207.0.61 fec0::a:cf:0:3d/96 gw03.hamburg.freifunk.net kontakt at hamburg.freifunk.net 10.112.0.0/16, fd51:2bb2:fd0d::/48
Testen, ob tinc läuft.
Der erzeugte öffentliche Schlüssel wird auf ein anderes gateway, welches bereits im ICVPN ist, nach /etc/tinc/icvpn/hosts/ kopiert. Auf dem eigenen host wird geschaut, ob die Netzwerkschnittstelle da ist:
$ ip a
Beispiel:
icvpn: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500 link/ether 36:35:c8:9b:be:5d brd ff:ff:ff:ff:ff:ff inet6 fec0::a:cf:0:3d/96 scope site deprecated valid_lft forever preferred_lft forever inet6 fe80::3435:c8ff:fe9b:be5d/64 scope link valid_lft forever preferred_lft forever
Zum Test Kiel anpingen (Adresse aus der Netzwerkübersicht):
$ ping6 fec0::a:cf:0:3a
bird6 routing daemon
Jetzt ist die VPN-Verbindung fertig und das IPv6 routing kann erstellt werden. Dabei muss jedes gateway die anderen gateways eingetragen haben. Für die anderen gateways und server muss die gateway-AG dies also nachholen. Die internen gateways werden unter # iBGP peerings eingetragen, die der anderen Städte unter # eBGP peerings.
$ vim /etc/bird6.conf
# the ff ip of the gateway router id 10.112.10.1; # edit for new gateway # routing tables table ffhh; # filter to check ulas function is_ula() { return (net ~ [ fc00::/7{48,64} ]); } function is_self() { return (proto = "static_ffhh"); } filter ffhh_internal_export { if (proto = "local_ffhh") then accept; if (source != RTS_BGP) then reject; if (is_ula() && proto != "static_ffhh") then accept; else reject; } # don't use kernel's routes for bird, but export bird's routes to kernel protocol kernel { scan time 20; # Scan kernel routing table every 20 seconds import none; # Default is import all export all; } # This pseudo-protocol watches all interface up/down events. protocol device { scan time 10; # Scan interfaces every 10 seconds } # define our routes protocol static static_ffhh { table ffhh; # reject route if announced from external route fd51:2bb2:fd0d::/48 reject; }; protocol static local_ffhh { table ffhh; route fd51:2bb2:fd0d::/64 via "br-ffhh"; }; protocol pipe pipe_ffhh { peer table ffhh; import all; export none; }; # template for internal routing template bgp bgp_ibgp { table ffhh; local as 65112; source address fd51:2bb2:fd0d::c01; # edit: own ip of gateway import all; export where source = RTS_BGP; gateway direct; next hop self; }; # icvpn template for hamburg03 template bgp bgp_icvpn { local as 65112; source address fec0::a:cf:0:3d; # edit for new gateway table ffhh; import where is_ula(); export where is_self() || (source = RTS_BGP); }; # iBGP peerings protocol bgp srv01 from bgp_ibgp { neighbor fd51:2bb2:fd0d::101 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg01 from bgp_ibgp { neighbor fd51:2bb2:fd0d::e01 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg04 from bgp_ibgp { neighbor fd51:2bb2:fd0d::801 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg05 from bgp_ibgp { neighbor fd51:2bb2:fd0d::d01 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg06 from bgp_ibgp { neighbor fd51:2bb2:fd0d::f01 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg07 from bgp_ibgp { neighbor fd51:2bb2:fd0d::a01 as 65112; # edit: ip of remote gateway }; protocol bgp hamburg08 from bgp_ibgp { neighbor fd51:2bb2:fd0d::b01 as 65112; # edit: ip of remote gateway }; # eBGP peerings protocol bgp Augsburg1 from bgp_icvpn { neighbor fec0::a:cf:0:a as 65050; }; protocol bgp Bayreuth from bgp_icvpn { neighbor fec0::a:cf:0:19 as 65025; }; protocol bgp Berlin1 from bgp_icvpn { neighbor fec0::a:cf:0:5 as 44194; }; protocol bgp Bielefeld1 from bgp_icvpn { neighbor fec0::a:cf:0:59 as 65529; }; protocol bgp Bielefeld2 from bgp_icvpn { neighbor fec0::a:cf:0:60 as 65529; }; protocol bgp diac24 from bgp_icvpn { neighbor fec0::a:cf:ac:16 as 64600; }; protocol bgp Franken1 from bgp_icvpn { neighbor fec0::a:cf:0:17 as 65024; }; protocol bgp Franken2 from bgp_icvpn { neighbor fec0::a:cf:0:18 as 65024; }; protocol bgp Freiburg1 from bgp_icvpn { neighbor fec0::a:cf:0:21 as 65060; }; protocol bgp Gronau1 from bgp_icvpn { neighbor fec0::a:cf:0:50 as 65526; }; protocol bgp Gronau2 from bgp_icvpn { neighbor fec0::a:cf:0:51 as 65526; }; protocol bgp Kiel1 from bgp_icvpn { neighbor fec0::a:cf:0:35 as 65525; }; protocol bgp Kiel3 from bgp_icvpn { neighbor fec0::a:cf:0:36 as 65525; }; protocol bgp Kiel4 from bgp_icvpn { neighbor fec0::a:cf:0:3a as 65525; }; protocol bgp Koeln from bgp_icvpn { neighbor fec0::a:cf:0:57 as 65528; }; protocol bgp Ljubljana1 from bgp_icvpn { neighbor fec0::a:cf:3:23 as 65023; }; protocol bgp Ljubljana2 from bgp_icvpn { neighbor fec0::a:cf:3:30 as 64768; }; protocol bgp Luebeck1 from bgp_icvpn { neighbor fec0::a:cf:0:82 as 65052; }; protocol bgp Luebeck2 from bgp_icvpn { neighbor fec0::a:cf:0:83 as 65052; }; protocol bgp Schwarzach from bgp_icvpn { neighbor fec0::a:cf:0:56 as 65527; }; protocol bgp Weimar1 from bgp_icvpn { neighbor fec0::a:cf:0:3 as 65042; }; protocol bgp Wermelskirchen1 from bgp_icvpn { neighbor fec0::a:cf:0:7 as 65530; };
Das Hamburger gateway muss nun auch auf gateways der zu peer-enden Städte eingetragen werden (in deren bird6.conf).
bird6 starten:
$ service bird6 start
bird6 testen
Gucken ob's läuft:
$ birdc6 show protocols
Routen anzeigen:
$ birdc6 show route
Konfiguration neu laden:
$ birdc6 configure
bird4 routing daemon
$ vim /etc/bird.conf
router id 10.112.10.1; table ffhh; # BGP Peerings table ibgp; table icvpn; # BGP Peerings (ICVPN) table freifunk; # Kernel table 42 (Routing from Freifunk networks) function is_freifunk_dn42() { return (net ~ [ 10.0.0.0/8{12,32}, 10.100.0.0/14, 172.22.0.0/15+, 172.31.0.0/16 ]); } function is_freifunk() { return (net ~ [10.0.0.0/8+]); } function is_chaosvpn() { return (net ~ [172.31.0.0/16+]); } function is_self_net() { return (net ~ [10.112.0.0/16+]); } function is_self() { return (proto = "static_ffhh"); } function is_dn42_aggregate() { return (net ~ [172.22.0.0/15{16,32}]); } filter ffhh_internal_export { if (proto = "dn42_aggregate_ffhh" || proto = "local_ffhh") then accept; if (source != RTS_BGP && proto != "pipe_icvpn") then reject; if (proto ~ "bgp_ibgp_*") then reject; if (is_dn42_aggregate()) then reject; accept; } protocol pipe pipe_ffhh { peer table ffhh; import all; export none; }; protocol pipe pipe_icvpn { table ffhh; peer table icvpn; export where is_self(); import all; mode opaque; }; protocol pipe pipe_freifunk { peer table freifunk; import none; export all; }; protocol pipe pipe_ibgp { peer table ibgp; import all; export where !is_self_net(); mode opaque; }; protocol kernel kernel_master { scan time 20; import none; export filter { krt_prefsrc = 10.112.10.1; accept; }; }; protocol kernel kernel_freifunk { scan time 20; import none; export filter { krt_prefsrc = 10.112.10.1; accept; }; table freifunk; device routes; kernel table 42; }; # This pseudo-protocol watches all interface up/down events. protocol device { scan time 10; # Scan interfaces every 10 seconds }; protocol static unreachable_default { table freifunk; route 0.0.0.0/0 reject; }; protocol static static_ffhh { table ffhh; route 10.112.0.0/16 reject; }; protocol static local_ffhh { table ffhh; route 10.112.0.0/18 via "freifunk"; }; protocol static dn42_aggregate_ffhh { table ffhh; route 172.22.0.0/15 reject; }; template bgp bgp_ibgp { local as 65112; table ibgp; import filter { preference = 99; accept; }; export all; gateway direct; next hop self; }; template bgp bgp_icvpn { local as 65112; table icvpn; import where (is_freifunk_dn42() && !is_self_net()); export all; }; # iBGP (siehe IPv6; ggf. eigenen Eintrag entfernen, falls von anderem gateway übernommen, bzw. neuen gateway ) protocol bgp srv01 from bgp_ibgp { neighbor 10.112.1.1 as 65112; }; protocol bgp hamburg01 from bgp_ibgp { neighbor 10.112.14.1 as 65112; }; protocol bgp hamburg04 from bgp_ibgp { neighbor 10.112.8.1 as 65112; }; protocol bgp hamburg05 from bgp_ibgp { neighbor 10.112.18.1 as 65112; }; protocol bgp hamburg06 from bgp_ibgp { neighbor 10.112.20.1 as 65112; }; protocol bgp hamburg07 from bgp_ibgp { neighbor 10.112.16.1 as 65112; }; protocol bgp hamburg08 from bgp_ibgp { neighbor 10.112.22.1 as 65112; }; # eBGP (siehe IPv6) protocol bgp Augsburg1 from bgp_icvpn { neighbor 10.207.0.17 as 65050; }; protocol bgp Augsburg2 from bgp_icvpn { neighbor 10.207.0.177 as 65070; }; protocol bgp Aurich1 from bgp_icvpn { neighbor 10.207.0.15 as 65047; }; protocol bgp BadZwischenahn1 from bgp_icvpn { neighbor 10.207.0.26 as 65512; }; protocol bgp Bayreuth1 from bgp_icvpn { neighbor 10.207.0.28 as 65025; }; protocol bgp Berlin1 from bgp_icvpn { neighbor 10.207.0.5 as 44194; }; protocol bgp Bielefeld1 from bgp_icvpn { neighbor 10.207.0.59 as 65529; }; protocol bgp Bielefeld2 from bgp_icvpn { neighbor 10.207.0.67 as 65529; }; protocol bgp Chemnitz1 from bgp_icvpn { neighbor 10.207.0.36 as 65053; }; protocol bgp diac24_net from bgp_icvpn { neighbor 10.207.2.0 as 64600; }; protocol bgp Dresden1 from bgp_icvpn { neighbor 10.207.0.19 as 65051; }; protocol bgp Franken1 from bgp_icvpn { neighbor 10.207.0.23 as 65024; }; protocol bgp Franken2 from bgp_icvpn { neighbor 10.207.0.24 as 65024; }; protocol bgp Franken3 from bgp_icvpn { neighbor 10.207.0.31 as 65024; }; protocol bgp Frankfurt1 from bgp_icvpn { neighbor 10.207.0.35 as 65026; }; protocol bgp Freiburg1 from bgp_icvpn { neighbor 10.207.0.21 as 65026; }; protocol bgp Gronau1 from bgp_icvpn { neighbor 10.207.0.55 as 65526; }; protocol bgp Gronau2 from bgp_icvpn { neighbor 10.207.0.60 as 65526; }; protocol bgp Grossdraxdorf from bgp_icvpn { neighbor 10.207.0.25 as 65025; }; protocol bgp Halle1 from bgp_icvpn { neighbor 10.207.0.13 as 65046; }; protocol bgp Halle2 from bgp_icvpn { neighbor 10.207.0.14 as 65046; }; protocol bgp Hannover1 from bgp_icvpn { neighbor 10.207.0.22 as 65511; }; protocol bgp Jena1 from bgp_icvpn { neighbor 10.207.0.33 as 65055; }; protocol bgp Jena2 from bgp_icvpn { neighbor 10.207.0.66 as 65055; }; protocol bgp Kiel4 from bgp_icvpn { neighbor 10.207.0.58 as 65525; }; protocol bgp Koblenz from bgp_icvpn { neighbor 10.207.0.32 as 65032; }; protocol bgp Koeln1 from bgp_icvpn { neighbor 10.207.0.57 as 65528; }; protocol bgp Leipzig1 from bgp_icvpn { neighbor 10.207.0.1 as 65041; }; protocol bgp Leipzig2 from bgp_icvpn { neighbor 10.207.0.2 as 65041; }; protocol bgp Ljubljana1 from bgp_icvpn { neighbor 10.207.3.23 as 65023; }; protocol bgp Ljubljana2 from bgp_icvpn { neighbor 10.207.3.30 as 64768; }; protocol bgp Luebeck1 from bgp_icvpn { neighbor 10.207.0.130 as 65052; }; protocol bgp Luebeck2 from bgp_icvpn { neighbor 10.207.0.131 as 65052; }; protocol bgp Mainz1 from bgp_icvpn { neighbor 10.207.0.37 as 65037; }; protocol bgp Oldenburg1 from bgp_icvpn { neighbor 10.207.0.27 as 65513; }; protocol bgp Schwarzach1 from bgp_icvpn { neighbor 10.207.0.56 as 65527; }; protocol bgp Treuenbrietzen from bgp_icvpn { neighbor 10.207.0.18 as 65045; }; protocol bgp Weimar1 from bgp_icvpn { neighbor 10.207.0.3 as 65042; }; protocol bgp Weimar2 from bgp_icvpn { neighbor 10.207.0.4 as 65042; }; protocol bgp Wermelskirchen1 from bgp_icvpn { neighbor 10.207.0.7 as 65530; };
Monitoring
Um den Gesundheitszustand der gateways zu überwachen wird der Dienst munin eingerichtet.
apt-get install munin-node vnstat
Konfigurieren:
vim /etc/munin/munin-node.conf
host_name gw**NUMMER DES GATEWAYS EINSETZEN**.hamburg.freifunk.net cidr_allow 78.47.49.236/32 host **IPv4 DES GATEWAYS IM INTERNET EINSETZEN**
Welche Parameter genau von munin überwacht werden, wir über plugins gesteuert. Zunächst wird das plugin für vnstat nachgeladen und ausführbar gemacht:
cd /usr/share/munin/plugins wget https://raw.github.com/bram85/munin-plugins/master/vnstat/vnstat_ chmod +x vnstat_
Das gleiche erfolgt für udp-statistics
wget https://raw.github.com/munin-monitoring/contrib/master/plugins/network/udp-statistics chmod +x udp-statistics
Ausgeführt werden die plugins, die einen softlink im Verzeichnis
cd /etc/munin/plugins
haben. Also müssen wir dort für die beiden nachgeladenen plugins jeweils einen anlegen.
ln -s /usr/share/munin/plugins/udp-statistics udp-statistics
Mit Unterstrich können manchen Plugins Parameter übergeben werden. Hier wird vnstat gesagt, den monatlichen eingehenden und ausgehenden Verkehr der Schnittstelle eth0 anzuzeigen.
ln -s /usr/share/munin/plugins/vnstat_ vnstat_eth0_monthly_rxtx
In dem Verzeichnis können alle Plugins ausser die folgenden gelöscht werden:
cpu df df_inode diskstats entropy forks fw_conntrack fw_forwarded_local fw_packets if_bat0 if_br-ffhh if_err_bat0 if_err_br-ffhh if_err_eth0 if_err_ffhh-mesh-vpn if_err_mullvad if_eth0 if_ffhh-mesh-vpn if_mullvad interrupts irqstats load memory open_files open_inodes processes swap threads udp-statistics vmstat vnstat_eth0_monthly_rxtx
Zum Schluss wird noch das vnstat Plugin konfiguriert
vim /etc/munin/plugin-conf.d/vnstat
indem man folgende Zeilen einträgt:
[vnstat_eth0_monthly_rxtx] env.estimate 1
Jetzt wird munin neu gestartet:
service munin-node restart
Nun Leo bitte, das Gateway in das Monitoring aufzunehmen. Das Monitoring kann unter http://www.ohrensessel.net/mstats begutachtet werden.
Aufgaben der gateway AG
DNS-Einträge
Auf srv01:
cd /etc/bind/master rndc freeze vi db.ffhh
Änderungen machen (Zähler hoch zählen nicht vergessen).
vi db.net.freifunk.hamburg
Änderungen machen (Zähler hoch zählen nicht vergessen).
rndc thaw rndc reload
MAC der ffhh-mesh-vpn Schnittstelle im fastd Schlüsselrepo
Für die neue MAC muss ein Eintrag im fastd Schlüsselrepo erstellt werden. Der zugehörige öffentliche fastd Schlüssel findet sich auf gw01 unter /home/freifunker/fastd-keys/backup
.
Gatewaybetreiben den privaten gateway-Schlüssel zur Verfügung stellen
Die privaten fastd Schlüssel befinden sich auf gw01 unter /home/freifunker/fastd-keys/backup
.
Öffentlicher ssh Schlüssel des gatways eintragen
Der öffentliche ssh Schlüssel des gateways muss zu den berechtigen Zugängen des fastd-Schlüsselrepos eingetragen werden, damit das neue gateway das repo clonen darf.
Gatway auf srv01 anmelden
Damit srv01 sich mit dem neuen gateway verbinden kann (und umgekehrt), muss der öffentliche fastd-Schlüssel des gateways unter /etc/fastd/ffhh-mesh-vpn/backbones
angelegt werden.