OpenVPN Verbindung zum Freifunk Hannover Netzwerk
Aus Freifunk Hannover
Diese Anleitung beschreibt Schritt für Schritt die Konfiguration einer Freifunk-Node für die Verbindung zum OpenVPN Server von Freifunk Hannover.Ziel dieser Tunnelgrabungen ist es, die vorhandenen "Inseln" über eine Art Backbone miteinander zu vernetzen, bis die einzelnen WLAN-Wolken auf "natürliche Weise" miteinander verwachsen sind.
Inhaltsverzeichnis |
Software automatisch installieren
Zunächst müssen die benötigten Software Pakete installiert werden. Dazu logge Dich auf Deinem Router ein und gib ein:
ipkg update ipkg install openvpn-ssl-nolzo
Alle zusätzlich benötigten Pakete werden von ipkg automatisch ermittelt und nachinstalliert.
(Falls Du nicht weisst, wie Du Dich "einloggen" kannst, solltest Du zuerst den Eintrag über SSH lesen.)
Software manuell installieren
Falls man die Pakete manuell installieren möchte, dann muss man folgende Pakete herunter laden:
kmod-tun libssl busybox-awk busybox-crontab freifunk-iptables-missing freifunk-openwrt-compat openvpn-ssl-nolzo
Diese können dann per Freifunk Webadmin oder mit scp und ipkg installiert werden.
Client-Zertifikat anfordern
Um einen OpenVPN Tunnel ins Freifunk-Hannover Netz aufbauen zu können, benötigt man ein Client-Zertifikat, das man beim Freifunker seines Vertrauens auf einem der nächsten Freifunk-Treffen beantragen kann.
Das eigene Zertifikat zusammen mit dem privaten Schlüssel und dem Zertifikat der Root-CA muss man dann auf dem Router unter /etc/openvpn ablegen.
OpenVPN Client Konfiguration
Als nächstes muss eine Client-Konfiguration angelegt werden
mkdir -p /etc/openvpn #Verzeichnis anlegen vi /etc/openvpn/freifunk.conf
mit folgendem Inhalt:
remote vpn.freifunk-hannover.de client dev tap proto udp port 1194 ca ca.crt cert <Node-XYZ>.crt key <Node-XYZ>.key ns-cert-type server tun-mtu 1500 mssfix nobind
(Drücke :x zum Speichern und beenden.)
Der Wert für <Node-XYZ> müssen natürlich durch einen sinnvollen Wert ersetzt werden :-)
Wer die OpenVPN-Verbindung über einen regulären DSL-Link betreibt, sollte anstelle von tun-mtu 1500 die Option link-mtu 1492 verwenden (siehe freifunk.conf) , um unnötige Paket-Fragmentierungen zu vermeiden.
OpenVPN Startscript
Für einen automatischen Start von OpenVPN beim Booten muss das Startscript justiert werden:
cd /etc/init.d ln -s openvpn S65openvpn
Es ist nicht ganz klar, wieso das ipkg Package ein Script mitbringt, dieses aber nicht richtig verlinkt wird. Vielleicht ist auch die Startrangfolge etwas verfrüht und könnte weiter nach hinten verlegt werden?
Firewall anpassen
Damit eine Kommunikation durch den Tunnel möglich ist, muss die Firewall der Freifunk Firmware erweitert werden.
vi /etc/local.fw
Folgendes muss man einfügen:
# Place your firewall addons here
# configuration
TAPDEV=tap0
# figure local settings
eval $(/usr/bin/netparam)
case $1 in
start)
# Allow all traffic through the tunnel
iptables -I OUTPUT -o $TAPDEV -j ACCEPT
iptables -I INPUT -i $TAPDEV -j ACCEPT
iptables -I FORWARD -o $TAPDEV -j ACCEPT
iptables -I FORWARD -i $TAPDEV -j ACCEPT
# Masquerade LAN traffic through the tunnel
iptables -t nat -A POSTROUTING -o $TAPDEV -s $LANNET/$LANPRE -j MASQUERADE
iptables -I FORWARD -i $LANDEV -o $TAPDEV -j ACCEPT
iptables -I FORWARD -i $TAPDEV -o $LANDEV -j ACCEPT
;;
stop)
iptables -D OUTPUT -o $TAPDEV -j ACCEPT
iptables -D INPUT -i $TAPDEV -j ACCEPT
iptables -D FORWARD -o $TAPDEV -j ACCEPT
iptables -D FORWARD -i $TAPDEV -j ACCEPT
iptables -t nat -D POSTROUTING -o $TAPDEV -s $LANNET/$LANPRE -j MASQUERADE
iptables -D FORWARD -i $LANDEV -o $TAPDEV -j ACCEPT
iptables -D FORWARD -i $TAPDEV -o $LANDEV -j ACCEPT
;;
esac
OLSR durch den Tunnel
So richtig Sinn macht der Tunnel natürlich erst, wenn das diesseitige OLSR Netzwerk auch jenes an den anderen Tunnelenden erreichen kann. Dazu muss der olsrd so konfiguriert werden, daß er auch auf dem Tunnel-Device arbeitet.
Dazu muss man eine neue Datei auf dem Router anlegen
vi /etc/local.olsrd.conf
mit folgendem Inhalt:
Interface "tap0"
{
Ip4Broadcast 255.255.255.255
HelloInterval 15.0
HelloValidityTime 180.0
TcInterval 10.0
TcValidityTime 270.0
MidInterval 30.0
MidValidityTime 180.0
HnaInterval 30.0
HnaValidityTime 180.0
LinkQualityMult 10.2.255.1 0.5
}
Diese Werte sind darauf abgestimmt, nicht so viel Netzwerkverkehr ("Grundrauschen") über den VPN Tunnel zu schicken.
Starten
Nach der Installation und Konfiguration kann man die Verbindung starten:
/etc/init.d/S45firewall restart /etc/init.d/S65openvpn start /etc/init.d/S53olsrd restart
und testen:
ping 10.2.255.1
Alternativ kann man den Router auch einfach einmal rebooten :-)
Log Informationen anzeigen
Falls die Verbindung nicht gestartet wird, kann man sich wie folgt die Log Informationen anschauen:
logread -f
Zeitsynchronisation
Für eine korrekte Funktion der Zertifkate ist es notwendig, dass Datum und Uhrzeit auf dem Router korrekt gesetzt sind.
Falls das in der Freifunk Firmware enthalten rdate-Script und die dadurch erreichte Zeitsynchronisation beim Boot der Node nicht ausreichen sollte, kann man mit dem ntpclient-Paket die Zeit in regelmäßigen Abständen automatisch aktualisieren. Ob dies allerdings wirklich nötig ist, muss der Langzeittest erst noch klären.
Fehlerhafte Zeitsyncronisation macht sich folgendermaßen bemerkbar:
root@OpenWrt:~# openvpn --config /etc/openvpn/freifunk.conf Sat Jan 1 00:04:10 2000 OpenVPN 2.0.9 mips-linux [SSL] [LZO] [EPOLL] built on Jun 6 2007 Sat Jan 1 00:04:12 2000 UDPv4 link local: [undef] Sat Jan 1 00:04:12 2000 UDPv4 link remote: 212.112.231.84:1194 Sat Jan 1 00:04:12 2000 VERIFY ERROR: depth=1, error=certificate is not yet valid: /C=DE/ST=NDS/L=Hannover /O=Freifunk_Hannover/emailAddress=info@freifunk-hannover.de Sat Jan 1 00:04:12 2000 TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:lib(20):func(144):reason(134) Sat Jan 1 00:04:12 2000 TLS Error: TLS object -> incoming plaintext read error Sat Jan 1 00:04:12 2000 TLS Error: TLS handshake failed
RRDTool Grafiken anpassen
Damit die Statistik auch den VPN Tunnel erfassen, ist eine kleine Änderung notwendig.
sed -i 's/tun/tap/' /etc/rrdcollect.conf kill $(cat /var/run/rrdcollect.pid) && rrdcollect >/dev/null

