Potsdam-VPN
Das Potsdam-VPN ist ein Intra-City-VPN, das dazu dient, Inseln zusammenzuführen.
Client einrichten
Zertifikat beantragen
Um ein Zertifikat zum Potsdam-VPN für deinen Freifunkrouter zu erhalten, schicke bitte eine Email mit folgenden Angaben an users@lists.freifunk-potsdam.de.
Betreff:PdmVPN für Routername
Inhalt:
Hallo Zertifikatsgeber,
sende mir bitte ein Zertifikat für meinen Knoten Routername an Emailadresse.
Potsdam-VPN auf Router einrichten
Nachdem die E-Mail mit einem Zertifikat beantwortet wurde, kann der Router mit dem VPN bespielt werden.
OpenVPN einrichten
Zuerst richten wir das OpenVPN ein, damit der Router sich verbinden kann. Falls der Menüpunkt Services/OpenVPN nicht vorhanden ist, folgende Pakete über die Paketverwaltung nachinstallieren und den Router neu starten: luci-app-openvpn, luci-i18n-openvpn-en und openvpn-openssl
Auf der Kommandozeile:
opkg update && opkg install luci-app-openvpn luci-i18n-openvpn-en openvpn-openssl && exec reboot
- Unter Services/OpenVPN eine neue "Client configuration for an ethernet bridge VPN" namens "pdmvpn" anlegen.
- auf "Switch to advanced configuration" klicken
- unter Networking folgende Einstellungen vornehmen. Einige Felder müssen zuerst hinzugefügt werden.
- port: 1195
- dev: pdmvpn
- dev_type: tap
- tun_mtu: 1300
- comp_lzo: no
- Speichern
- unter VPN folgende Einstellungen vornehmen.
- remote: vpn.freifunk-potsdam.de
- Speichern
- unter Cryptography folgende Einstellungen vornehmen. Einige Felder müssen zuerst hinzugefügt werden.
- cipher: none
- ca: ca.crt hochladen
- cert: $client$.crt hochladen
- key: $client$.key hochladen
- Speichern & Anwenden
Interface konfigurieren
Hier richten wir die Schnittstelle ein, an der der Verkehr über das VPN vom Router entgegen genommen wird.
- Unter Network/Interfaces ein neues Interface names PDMVPN anlegen.
- Protocoll ist Unmanaged oder Ignoriert
- als Device das soeben eingerichtete Device "pdmvpn" auswählen. Beim ersten Einrichten existiert das Device vielleicht nicht. Wenn es nicht existiert, kann der Name unten eingegeben werden.
- Submit
- Das neue Interface der Firewallgruppe "Freifunk" hinzufügen.
- Speichern und Anwenden (Save & Apply)
- unter Services/OpenVPN das pdmvpn aktivieren und starten. Es müsste jetzt laufen. "Started" "Yes"
OLSR konfigurieren
Nachdem wir nun Verkehr über das VPN schicken, wird es Zeit, sich automatisch über OLSR auszutauschen, welche Router wir über das VPN erreichen können.
- unter Services/OLSR IPv4 das PDMVPN Interface hinzufügen:
- Add
- PDMVPN auswählen
- Modus: mesh
- Linkqualitäteinstellungen: LQ-Algorithmus: etx_ffeth
- Speichern & Anwenden
Bilder
Überprüfen
Wenn das Meshing über das VPN läuft, dann kann man bei Status -> OLSR -> Nachbarn folgendes sehen:
Neighbour IP Hostname Interface 172.22.251.1 pdmvpn-a.olsr undefined
Wenn nicht, nochmal die VPN-Einstellungen und OLSR überprüfen, ein Reboot des Routers kann auch helfen. Die ETX sollte sich bei etwa 2,5 stabilisieren.
Diskussionen
Auf der Potsdamer Mailingliste gibt es folgende Diskussionen:
- Welches OpenVPN? - Eine Diskussion zur Installation von Paketen unter der Firmware-Version Hedy.
Server
Dieser Abschnitt ist interessant, wenn man einen Potsdam-VPN-Server aufsetzt und verwaltet. Wenn man seinen Router mit dem Potsdam-VPN verbinden möchte, ist dieser uninteressant.
Keys generieren
Easy-RSA config
- vim vars
export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" # Issue rm -rf warning echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" export KEY_SIZE=2048 export CA_EXPIRE=10950 export KEY_EXPIRE=3660 export KEY_COUNTRY="DE" export KEY_PROVINCE="BRB" export KEY_CITY="Potsdam" export KEY_ORG="Freifunk Potsdam e.V." export KEY_EMAIL="info@freifunk-potsdam.de" export KEY_CN= export KEY_NAME=
CA Zertifikat, CA Key und DH Parameter erzeugen
. vars ./build-ca ./build-dh
Server Zertifikat und Server Key erzeugen
. vars
./build-key-server $server name$
client Zertifikat und Client Key erzeugen
. vars
./build-key $client name$
Server aufsetzen
Die Potsdam-VPN Server sind als virtuelle Router auf Hedy-Basis aufgesetzt. Die virtuellen Router werden mit Qemu ausgeführt. Auf jedem virtuellen Router läuft ein OpenVPN Server, mit dem sich Clients verbinden können. Dafür wird der UDP-Port 1195 vom Hostsystem an den virtuellen Router forgewarded. Zur einfacheren Administration werden noch die Ports 22 und 443 auf alternativen Ports forgewarded.
Das Netzwerk zwischen dem Hostsystem und dem virtuellen Router ist statisch und stellt für den virtuellen Router das WAN dar.
Netzwerk: 172.22.255.0/24 Hostsystem: 172.22.255.1 v. Router WAN: 172.22.255.2 v. Router FFUPLINK: 172.22.255.10
Die OpenVPN-Server verteilen Adressen aus den Netzwerken 10.22.241.0/24, 10.22.242.0/24 und 10.22.243.0/24.
Die virtuellen Router sollen über die Hostsysteme hinweg miteinander verbunden sein. Dafür benutzen wir L2TPv3 (Layer 2 Tunneling Protocol) Funktion von Qemu. Wir müssen nur ein paar Ports freigeben.
Portfreigaben und -forwards:
- UDP 25551
- UDP 25552
- UDP 25553
- UDP 1195 -> 172.22.255.2:1195
- TCP 25522 -> 172.22.255.2:22
- TCP 25543 -> 172.22.255.2:443
L2TP-Verbindungen zwischen den drei Servern:
sollte durch ein Bild ersetzt werden
pdmvpn-a eth1 10.22.240.1/30 |
25552 | --- | 25551 | pdmvpn-b eth1 10.22.240.2/30 |
pdmvpn-a eth2 10.22.240.5/30 |
25553 | --- | 25551 | pdmvpn-c eth1 10.22.240.6/30 |
pdmvpn-b eth2 10.22.240.9/30 |
25553 | --- | 25552 | pdmvpn-c eth2 10.22.240.10/30 |
Firmware kompilieren
Zu testen: Die Firmware kann auch vom Berliner Buildbot heruntergeladen werden. [1]
Da die OpenVPN-Server Funktionalität im Standart-Hedy nicht enthalten ist, muss die Firmware mit einigen Änderungen selbst kompiliert werden.
Git-Repository clonen:
git clone -b Hedy-1.0.2 https://github.com/freifunk-berlin/firmware.git hedy-1.0.2 cd hedy-1.0.2
configs/common.config ergänzen:
CONFIG_OPENVPN_openssl_ENABLE_SMALL=n CONFIG_OPENVPN_openssl_ENABLE_SERVER=y CONFIG_OPENVPN_openssl_ENABLE_OCC=y
Da wir OpenVPN auf jeden Fall brauchen, bauen wir das gleich im default Image mit ein.
packages/default.txt ergänzen:
luci-app-openvpn openvpn-openssl
Kaffeepause, mit Kuchen ;-)
make -j4 TARGET=x86-generic
In firmwares/x86-generic/default/ liegt anschließend eine hedy-1.0.2-alpha-*-x86-generic-combined-ext4.img.gz. Diese kann man auspacken mit:
zcat firmwares/x86-generic/default/hedy-1.0.2-alpha-*-x86-generic-combined-ext4.img.gz > hedy-1.0.2.img
Das Image kann dann für einen virtuellen Router benutzt werden.
Hostsystem einrichten
Netzwerk, Routing und Firewall
/etc/network/interfaces
auto brffvpn iface brffvpn inet static bridge_ports none address 172.22.255.1 netmask 255.255.255.0
/etc/iproute2/rt_tables
100 ffvpn 101 ffvpn-default
/etc/iptables/rules.v4
*filter -A INPUT -p udp -m udp --dport 25551 -j ACCEPT -A INPUT -p udp -m udp --dport 25552 -j ACCEPT -A INPUT -p udp -m udp --dport 25553 -j ACCEPT -A FORWARD -i brffvpn -o tap0 -s 172.22.255.0/24 -d 10.0.0.0/24 -m conntrack --ctstate DNAT -j VPNIN -A FORWARD -i tun5 -o brffvpn -d 172.22.255.0/24 -j ACCEPT -A FORWARD -o tun5 -i brffvpn -s 172.22.255.0/24 -j ACCEPT -A FORWARD -i eth0 -o brffvpn -d 172.22.255.2 -j ACCEPT -A FORWARD -o eth0 -i brffvpn -s 172.22.255.2 -j ACCEPT
...
*nat :PORTFW - [0:0] -A PREROUTING -i eth0 -j PORTFW -A PORTFW -p udp --dport 1195 -j DNAT --to-destination 172.22.255.2 -A PORTFW -p tcp --dport 25522 -j DNAT --to-destination 172.22.255.2:22 -A PORTFW -p tcp --dport 25543 -j DNAT --to-destination 172.22.255.2:443
Qemu-Script
#!/bin/bash USER=pdmvpn DISK=/home/pdmvpn/pdmvpn_b_hedy.img ME=vpn-b MYPORT=25552 CONA="dst=vpn-a.freifunk-potsdam.de,srcport=25551,src=${ME}.freifunk-potsdam.de,dstport=${MYPORT}" #CONB="dst=vpn-b.freifunk-potsdam.de,srcport=25552,src=${ME}.freifunk-potsdam.de,dstport=${MYPORT}" CONC="dst=vpn-c.freifunk-potsdam.de,srcport=25553,src=${ME}.freifunk-potsdam.de,dstport=${MYPORT}" if [ "$1" = "start" ]; then $0 run > /home/pdmvpn/pdmvpn.log 2>&1 & echo $! > /home/pdmvpn/pdmvpn.pid elif [ "$1" = "stop" ]; then kill `cat /home/pdmvpn/pdmvpn.pid` kill `cat /home/pdmvpn/pdmvpn_qemu.pid` elif [ "$1" = "run" ]; then while true; do qemu-system-i386 \ -runas $USER \ -pidfile /home/pdmvpn/pdmvpn_qemu.pid \ -no-reboot \ -net nic -net bridge,br=brffvpn \ -net nic,vlan=2 -net l2tpv3,vlan=2,$CONA,udp,rxsession=0xffffffff,txsession=0xffffffff,counter \ -net nic,vlan=3 -net l2tpv3,vlan=3,$CONC,udp,rxsession=0xffffffff,txsession=0xffffffff,counter \ -nographic \ -hda $DISK \ -serial unix:/home/pdmvpn/pdmvpn.console,server,nowait \ -monitor file:/home/pdmvpn/pdmvpn.mon sleep 5 done elif [ "$1" = "console" ]; then echo "Press CTRL-D to exit." socat stdin,raw,echo=0,escape=0x04 "unix-connect:/home/pdmvpn/pdmvpn.console" fi
ExpressVPN
/etc/openvpn/expressvpn.sh
#!/bin/bash ip route flush table ffvpn ip route flush table ffvpn-default ip route add $route_network_1/$route_netmask_1 via $route_gateway_1 table ffvpn ip route add default via $route_gateway_1 table ffvpn-default ip route add 172.22.255.0/24 dev brffvpn scope global table ffvpn ip route add 10.22.0.0/16 via 172.22.255.10 table ffvpn ip rule del prio 99 ip rule del prio 100 ip rule del prio 101 ip rule del prio 102 ip rule del prio 110 ip rule del prio 111 ip rule add prio 99 from 172.22.255.2 table main ip rule add table ffvpn iif tun5 prio 100 ip rule add table ffvpn iif brffvpn prio 101 ip rule add table ffvpn-default iif brffvpn prio 102 ip rule add prio 110 iif tun5 prohibit ip rule add prio 111 iif brffvpn prohibit