#!/bin/sh export DATE="8.5.2010";SCRIPT=${0#/rom} export TITLE="Verwaltung: OpenVPN" . ${SCRIPT%/*}/cgi-bin-pre.sh cat<Verwaltung: OpenVPN EOF unset CFG case ${QUERY_STRING#[2-9]} in "") CFG=$QUERY_STRING ;;esac QUERY_STRING=${QUERY_STRING#[1-9]} case $REQUEST_METHOD in POST) read QUERY_STRING ;;esac case $QUERY_STRING in "") #Speedups ff_ovpn_count="$(nvram get ff_ovpn_count)" ff_ovpn_mode="$(nvram get ff_ovpn_mode${CFG})" ff_ovpn_cli="$(nvram get ff_ovpn_cli${CFG})" ff_ovpn_tap="$(nvram get ff_ovpn_tap${CFG})" ff_ovpn_gw="$(nvram get ff_ovpn_gw${CFG})" ff_ovpn_dns="$(nvram get ff_ovpn_dns${CFG})" ff_ovpn_nat="$(nvram get ff_ovpn_nat${CFG})" ff_ovpn_policy="$(nvram get ff_ovpn_policy${CFG})" ff_ovpn_range="$(nvram get ff_ovpn_range${CFG})" ff_ovpn_remote="$(nvram get ff_ovpn_remote${CFG})" ff_ovpn_port="$(nvram get ff_ovpn_port${CFG})" ff_ovpn_tcp="$(nvram get ff_ovpn_tcp${CFG})" ff_ovpn_lzo="$(nvram get ff_ovpn_lzo${CFG})" ff_ovpn_ca_crt="$(nvram get ff_ovpn_ca_crt${CFG})" ff_ovpn_crt_key="$(nvram get ff_ovpn_crt_key${CFG})" ff_ovpn_dh="$(nvram get ff_ovpn_dh${CFG})" ff_ovpn_psk="$(nvram get ff_ovpn_psk${CFG})" ;;*) IFS=\&;set $QUERY_STRING;unset IFS;eval $* case $post_genkey_ovpn in "");;*) unset QUERY_STRING ff_ovpn_ca_crt="$(unescape $ff_ovpn_ca_crt)" ff_ovpn_crt_key="$(unescape $ff_ovpn_crt_key)" ff_ovpn_dh="$(unescape $ff_ovpn_dh)" ff_ovpn_psk=$(openvpn --genkey --secret /tmp/openvpn-psk.$$;sed '/^#/d' /tmp/openvpn-psk.$$;rm -f /tmp/openvpn-psk.$$) ff_ovpn_range="$(unescape $ff_ovpn_range)" ff_ovpn_remote="$(unescape $ff_ovpn_remote)" ff_ovpn_port="$(unescape $ff_ovpn_port)" ;;esac ;;esac SSL=no openvpn --version 2>&1|grep -q '\[SSL\]' && SSL=yes case $QUERY_STRING in "") cat<
Verbindungsart: EOF case $SSL in yes) cat< EOF ;;*) cat< EOF ;;esac cat<
Betriebs-Rolle:ServerKlient
Gerät: Tunnel (tun) Brücke (tap)
Internet für Klienten:Ungeändert / Nicht über TunnelÜber Tunnel umleiten
DNS für Klienten:Ungeändert / Nicht über TunnelÜber Tunnel umleiten
Tunnel mit NAT:Ausschalten Einschalten
Tunnel nur für OLSR:Standard-RoutingPolicy-Routing
Tunnel IP-Bereich:  (192.168.255.240/28 wenn leer)
Gegenstation (IP oder DNS-Name):  (Pflichtfeld für Klient)
Portnummer  (1194 wenn leer)
Protokoll: UDP TCP
LZO Kompression:Ausgeschaltet Eingeschaltet EOF case $SSL in yes) cat<
 
CA-Zertifikat (ca.crt):
Zertifikat (*.crt) &
Schlüssel (*.key)
Diffie-Hellman-Parameter:
Vereinbarter Schlüssel:
EOF ;;esac #SSL case $CFG in "") cat<
OpenVPN-Konfigurationen: (2-4: zusätzliche OpenVPN-Tunnel) EOF ;;esac cat<
 
  EOF case $CFG in "")if pidof openvpn >&-;then cat< EOF else cat< EOF fi;;esac cat< 
EOF case $ff_ovpn_ca_crt in "")if [ ! -f /www/cgi-bin/openvpn-easyrsa.sh ];then cat<Tipp: Installiere das Paket "freifunk-openvpn-easyrsa-de" um Schlüssel für einen Server in der Verbindungsart "MULTI" zu erzeugen. EOF fi;;esac case ${CFG} in "") cat<Beispiel 1: Internet für Klienten im Mesh

Um den Internet-Zugriff für OpenVPN-Klienten über den OpenVPN-Server im Mesh zu leiten, kann auf dem Server die Option Internet für Klienten eingeschaltet werden. Nach dem Verbindungsaufbau wird dazu die Default-Route des Klienten entsprechend geändert. Dies funktioniert prima, wenn der Klient einen eigenen Internet-Zugang hat oder beispielsweise auf einem PC, der über Ethernet an einem Freifunk-Router angeschlossen ist.

Auf einem Rechner mit OLSR oder auf einem Freifunk-Router und wenn ein fremdes Internet-Gateway über das Freifunk-Netz benutzt wird, ist es etwas aufwendiger. Die geänderte Default-Route würde die automatische Ankündung "Internet Hier!" auslösen bzw. die geänderte Default-Route stört den Internet-Zugriff dritter. Soll der OpenVPN-Klient auf einem Freifunk-Router betrieben und außerdem der Internet-Zugriff für den Freifunk-Router über den OpenVPN-Tunnel geleitet werden, muss die Option Policy Routing auf der OLSR-Seite eingeschaltet werden.

Tipp: Auch für einen OpenVPN-Server im Mesh kann die Option Policy Routing auf der OLSR-Seite sinnvoll sein. Nur wer einen OpenVPN-Schlüssel hat, kann das Internet-Gateway benutzen.

Beispiel 2: Internet-Gateway im Ausland

Wenn du einen Internet-Zugang im Freifunk-Netz anbietest, möchtest du möglicherweise das Internet über ein OpenVPN-Gateway im Ausland umleiten. Dazu muss entweder ein Freifunk-Router im Ausland aufgestellt werden, du mietest einen Server (z.B. XEN-basierte Linux VPS mit "iptables -j SNAT" gibt es ab \$7,--/Monat in den USA) oder du hast ein Account bei einem OpenVPN-Anbieter.

Üblicherweise bekommst du die IP-Adresse des Servers, ein CA-Zertifikat, ein Klienten-Zertifikat und einen Klienten-Schlüssel. Schalte die Verbindungsart auf "MULTI", die Betriebs-Rolle auf "Klient" und das Gerät auf "Tunnel (tun)". Konfiguriere die Gegenstation und kopiere den Inhalt der CA-Zertifikatsdatei in das Eingabefeld CA-Zertifikat. Kopiere den Inhalt des Klienten-Zertifikats und des Klienten-Schlüssels direkt hintereinander in das Eingabefeld Zertifikat & Schlüssel. Klicke auf die Schaltfläche Übernehmen. Rufe diese Seite erneut auf und klicke auf die Schaltfläche OpenVPN Starten.

Tipp: Die Tunnel nur für OLSR-Option bestimmt, dass nur der Internet-Verkehr aus dem OLSR-Mesh über den Tunnel geleitet wird.

Beispiel 3: Zwei Mesh-Netzwerke verbinden

Um zwei OLSR-Mesh-Netzwerke über Internet zu verbinden, kann man einen OpenVPN-Tunnel (Gerät: "tun") im Modus "PTP" einsetzen. Die eine Seite der Verbindung ist der Server (Vorgabe für Tunnel-IP: 192.168.255.240), die andere Seite ist der Client (Vorgabe für Tunnel-IP: 192.168.255.241). Die Verbindung wird über einen vorher vereinbarten Schlüssel (PSK) gesichert. Dazu einfach auf die Schaltfläche Erzeugen drücken. Kopiere anschließend den Inhalt des Eingabefeldes zur anderen Seite. Die "tun0"-Schnittstelle muss in /etc/local.olsr.conf aufgenommen werden. Beispiel für die Server-Seite:

Interface "tun0"
{
IP4Broadcast 192.168.255.241 # unicast to client tunnel IP
}

Tipp: Die Tunnel-Schnittstelle muss immer manuell zur OLSR-Konfiguration hinzugefügt werden, auch wenn der Tunnel mit IP-Adressen aus dem OLSR-IP-Bereich konfiguriert ist.

Beispiel 4: Verbindung in die Firma

Damit mehrere Klienten direkten Zugriff auf das LAN z.B. in einer Firma erhalten, kann eine Brücke (tap) im Modus MULTI verwendet werden. Mit der Einstellung Tunnel IP-Bereich nun einen Teil der LAN-Adressen konfigurieren. Beispiel: ist der LAN-Anschluss des Servers mit 192.168.1.1/24 konfiguriert, können mit einem Tunnel-IP-Bereich von 192.168.1.240/28 bis zu 13 Klienten gleichzeitig verbinden (241 für den Server, 242-254 für Klienten). In den meisten Fällen ist es nicht nötig, den Internet-Zugriff für Klienten über das Firmen-LAN umzuleiten.

Tipp: In hartnäckigen Fällen (z.B. du sitzt in einer fremden Firma mit restriktiver Internet-Zugriffs-Politik) kann man den Server auch mit dem Protokoll "TCP" betreiben. Dies ermöglicht z.B. den indirekten Zugriff mit einem OpenVPN-Klienten über einen Web-Proxy.

Weitere Hinweise zur Konfiguration

  • EOF case $SSL in yes) cat<PTP kann für eine Verbindung zwischen einen Server und einen Klienten verwendet werden. Dazu wird derselbe Schlüssel auf dem Klienten und auf dem Server konfiguriert.
  • Die Verbindungsart MULTI kann für eine Verbindung zwischen einem Server und mehreren Klienten verwendet werden. Der Server und alle Klienten erhalten dasselbe CA-Zertifikat. Jeder Klient und auch der Server benötigen jeweils eigene Schlüssel und eigene Zertifikate. Der Server benötigt zusätzlich die "Diffie-Hellmann"-Parameter. Zur Erzeugung von Schlüsseln und Zertifikaten werden üblicherweise die "easy-rsa"-Skripte aus dem OpenVPN-Quelltextpaket auf einem PC ausgeführt. Wahlweise kann das Paket "freifunk-openvpn-easyrsa-de" installiert werden. Erzeugte Schlüssel werden anhand des Informationsfeldes "Common Name" unterschieden. Alle anderen Angaben sind informell. Zudem sollte die Zeit auf Server und Klient ungefähr übereinstimmen, andernfalls schlägt der Verbindungsaufbau mit "TLS Error: Unroutable control packet" fehl.
  • Das Eingabefeld Zertifikat & Schlüssel enthält ein Paar aus Zertifikat und Schlüssel. Beide Dateien also einschließlich der Kennungen "------BEGIN" und "------END" hier einfügen. Zeilen vor oder hinter diesen Kennungen können weggelassen werden. In der Rolle des Servers enthält diese Einstellung das Server-Paar, in der Rolle des Klienten das Klienten-Paar.
  • Diese Oberfläche unterstützt keine mit Kennwort versehenen Schlüssel. Benutze "openssl rsa -in pass.key -out nopass.key" auf einem PC um ggf. das Kennwort zu entfernen.
  • EOF ;;esac #SSL cat<
  • Das Tunnel-Gerät im Modus "Brücke (tap)" wird automatisch zur LAN-Brücke (br0) hinzugefügt, wenn das Tunnel-Gerät eine IP-Adresse aus dem LAN verwendet. Dies gilt sowohl für den OpenVPN-Server als auch für verbundene Klienten.
  • Die OpenSSL-Bibliothek belegt viel Flash-Speicher. Aus diesem Grund gibt es ein Paket "freifunk-openvpn-nossl", mit dem nur eine unverschlüsselte Verbindung in der Verbindungsart PTP konfiuriert werden kann. Ohne Verschlüsselung sollte aus Sicherheitsgründen auch für den Klienten die IP-Adresse bzw. der DNS-Name der Gegenstation konfiguriert werden.
  • Für Klienten wird die Option "route-nopull" in der OpenVPN-Konfigurationsdatei nur weggelassen, wenn Policy Routing auf der OLSR-Seite aktiv ist, wenn es eine Default-Route mit Metric=0 gibt oder wenn die Tunnel-Default-Route nur für Teilnehmer aus dem Mesh gelten soll (Option: Tunnel nur für OLSR).
  • Zusätzliche Parameter können in die Dateien /etc/local.ovpn und /etc/local-client.ovpn geschrieben werden.
EOF ;;esac #CFG ;;*) DIRTY= case $post_start_ovpn in "");;*) DIRTY=start ;;esac case $post_stop_ovpn in "");;*) DIRTY=stop ;;esac case $post_ovpn in "");;*) VARS="ff_ovpn_count ff_ovpn_mode ff_ovpn_cli ff_ovpn_tap ff_ovpn_gw ff_ovpn_dns ff_ovpn_nat ff_ovpn_policy ff_ovpn_range ff_ovpn_remote ff_ovpn_port ff_ovpn_tcp ff_ovpn_lzo" case $SSL in yes) VARS="$VARS ff_ovpn_ca_crt ff_ovpn_crt_key ff_ovpn_dh ff_ovpn_psk" ;;esac for V in $VARS; do eval C=\"\$$V\" C="$(unescape $C)" case "$(nvram get $V${CFG})" in "$C");;*) DIRTY=1 nvram set $V${CFG}="$C" ;;esac done ;;esac case $DIRTY in "") cat<Es wurden keine Einstellungen geändert. EOF ;;1) nvram commit>&- 2>&- cat< Die geänderten Einstellungen wurden übernommen. Die Einstellungen sind erst beim nächsten Neustart aktiv. EOF ;;*) echo -n '
'
/etc/init.d/S91openvpn $DIRTY
mark=$(logread|sed -n '$s/(.*//p')
case $DIRTY in start)
cat<'
;;esac
;;esac

. ${SCRIPT%/*}/cgi-bin-post.sh