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.

Für die E-Mail hier klicken

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.

VPN 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

virtuellen Router einrichten