Anleitung Node Exit über VPN

Aus Freifunk Köln, Bonn und Umgebung
Version vom 9. Oktober 2022, 02:46 Uhr von Cptechnik (Diskussion | Beiträge) (Kategorie:Anleitungen)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Besonders für stark frequentierte Orte (z.B. Flüchtlingsheime oder Veranstaltungen) ist der Einsatz eines VPN-Offloaders für die Verbindung zu den Supernodes sinnvoll. Um eine weitere Beschleunigung für die Benutzer des Netzes zu erreichen, bietet es sich an, den IPV4 Internettraffic direkt über ein VPN in die große weite Welt zu leiten. Dies hat den Vorteil, das unsere Infrastruktur weniger belastet wird und gleichzeitig die Internetverbindung der User schneller wird. Dafür benötigt Ihr (logischerweise) einen Rechner (z.B. einen Futro) oder eine VM mit installiertem Gluon-Image. Ihr wählt euch per ssh und dem Benutzer root auf der Maschine ein. Dieses solltet Ihr beim ersten Start des Rechners im Configmodus hinterlegt haben.

Dann gebt Ihr folgende Befehle ein:

  • opkg update
  • opkg install openvpn-openssl mc nano iftop ip unbound unbound-control-setup rsync
  • opkg install isc-dhcp-server-ipv4

Dadurch werden die benötigten Pakete installiert. Danach muss dnsmasq und die Firewall deaktiviert werden:

  • /etc/init.d/firewall disable
  • /etc/init.d/dnsmasq disable
  • /etc/init.d/firewall stop
  • /etc/init.d/dnsmasq stop

Für den DNS-Cache (Unbound) müssen noch Zertifikate generiert werden, da sonst die Kontrollsoftware für den Zugriff auf unbound nicht funktioniert.

  • unbound-control-setup

Als nächstes ändern wir in der Datei /etc/unbound/unbound.conf die folgenden Zeilen:

  • control-enable: yes
  • control-interface: 127.0.0.1
  • control-interface: ::1

Folgenden Script unter /etc/init.d als „ownscript“ einfügen:

#!/bin/sh /etc/rc.common

START=99
STOP=15

start() {
sleep 30
iptables-restore /etc/iptables/rules.v4
ifconfig br-client 10.159.39.1 netmask 255.255.0.0
batctl gw_mode server 50MBit/10MBit
batctl bl 1                   #Bridge loop detection aktivieren

ip rule show | grep 'from 10.159.0.0/16 lookup freifunk'
if [ $? -eq 1 ]; then
 ip rule add from 10.159.0.0/16 table freifunk
fi
ip route add 10.159.0.0/16 dev br-client table freifunk

/etc/init.d/dhcpd stop
/etc/init.d/dhcpd start


}

stop() {
        echo stop
        # commands to kill application
}

Dabei muss natürlich einmal die Bandbreite des Anschlusses eingestellt werden (batctl gw mode_server…) und dem Interface br-client die richtige IP-Adresse angegeben werde. Ihr benötigt eine freie, nicht verwendete 24 Bit IPV4-Range! Falls Ihr selber einen Supernode habt, könnt Ihr von dort die Adressen nehmen. Ansonsten sprecht dies bitte vorher auf der Liste ab! Ich habe einfach eine 24 Bit Maske von Fastd5 genommen(10.154.39.1-10.154.39.254) und benutze dieses auf diesem Futro. Dann darf dieser Bereich natürlich nirgendwo anders verwendet werden!

Jetzt nur noch den Script ausführbar machen und starten

  • chmod +x /etc/init.d/ownscript
  • /etc/init.d/ownscript enable

Jetzt die Datei /etc/dhcpd.conf wie folgt bearbeiten:

# dhcpd.conf
option domain-name "mesh.kbu.freifunk.net";
option domain-search "mesh.kbu.freifunk.net";
option domain-name-servers 10.159.39.1; #213.73.91.35;
option ntp-servers 10.159.39.1;
default-lease-time 3600;       #1 Stunden
max-lease-time 3600;           #1 Stunden
authoritative;
subnet 10.159.0.0 netmask 255.255.192.0 {
#  speed up ip assignment if gateway is switched
  pool {
    range 10.159.0.0 10.159.38.255;
    deny all clients;
  }
  pool {
    range 10.159.40.0 10.159.63.255;
    deny all clients;
  }
  # if using a /24 then the range goes from .10 to .254
  range 10.159.39.10 10.159.39.254;
  option routers 10.159.39.1;
  option interface-mtu 1350;
}

Natürlich müssen hier die IP-Adressen den tatsächlichen Gegebenheiten angepasst werden (DNS/NTP-Server/Router Interface und Range) und auch die beiden Pools, welche abgelehnt werden.

Jetzt kommen wir zum Thema Openvpn: Als Beispiel eine VPN-Datei /etc/openvpn/germany.conf für Private Internet Access:

client
dev tun
proto udp
remote germany.privateinternetaccess.com 1198
resolv-retry infinite
nobind
persist-key
persist-tun
cipher aes-128-cbc
auth sha1
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
crl-verify crl.rsa.2048.pem
ca ca.rsa.2048.crt
auth-user-pass login.pass
route-nopull
# Script launched when the tunnel is
# up
script-security 2
up "/etc/config/up.sh"
down "/etc/config/down.sh"

Jetzt im Order /etc/openvpn/ eine Datei login.pass anlegen mit folgendem Inhalt:

%Username%
%Passwort%

Jetzt benötigen wir noch unter /etc/config/ zwei neue Dateien welche wir ausführbar machen müssen. Datei down.sh:

#!/bin/sh
iptables  -t nat -D POSTROUTING -o tun0  -j SNAT --to $4

Datei up.sh:

#!/bin/sh
ip route add default dev tun0  table freifunk
iptables -t nat -A POSTROUTING -o tun0  -j SNAT --to $4

Jetzt diese beiden Dateien mit chmod +x ausführbar machen.

Jetzt muss der OpenVPN-Dienst noch aktiviert werden:

/etc/init.d/openvpn enable

Unterhalb von /etc/iproute2 müssen wir noch einen neuen table in der Datei rt_tables anlegen:

  • 200 freifunk

Zum Schluß benötigen wir noch ein Verzeichnis /etc/iptables. Unterhalb diesem Verzeichnis legen wir folgende Datei an: rules.v4

*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -s 10.159.0.0/16 -i br-client -o tun0 -j ACCEPT
-A FORWARD -d 10.159.0.0/16 -i tun0 -o br-client -j ACCEPT
-A FORWARD -s 10.159.0.0/16 -d 10.159.0.0/16 -i br-client -o br-client -j ACCEPT
-A FORWARD -i bat+ -o bmx+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS –-clamp-mss-to-pmtu
-A FORWARD -i bmx+ -o bat+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS –-clamp-mss-to-pmtu
-A FORWARD -i bmx+ -o bmx+ -j ACCEPT
-A FORWARD -i bat+ -o bmx+ -j ACCEPT
-A FORWARD -i bmx+ -o bat+ -j ACCEPT
-A FORWARD -m limit --limit 2/min -j LOG --log-prefix "FORWARD DROPPED"
COMMIT

Da leider der VPN-Dienst manchmal einfach den Dienst quittiert ohne jegliche Rückmeldung brauchen wir jetzt noch einen Watchdog, der jede Minute überprüft, ob OpenVPN noch läuft und falls nicht, einfach den Dienst neustartet. Dafür unter /root eine Datei testvpn.sh anlegen:

#!/bin/sh
INTERFACE="$(ifconfig tun0)"
if [ "${INTERFACE}" == "" ]; then
 batctl gw_mode client
 /etc/init.d/openvpn restart
else
 batctl gw_mode server 50MBit/10MBit
 ip route add 10.159.0.0/16 dev br-client table freifunk
 ifconfig br-client 10.159.39.1 netmask 255.255.0.0
/etc/init.d/dhcpd reload
fi

Jetzt muss noch mittels crontab -e ein Cronjob angelegt werden:

* * * * * /root/testvpn.sh

und mit chmod +x die Datei ausführbar werden. Danach sollte der Dienst mittels /etc/init.d/cron enable und /etc/init.d/cron start auch der Cron-Dienst gestartet werden. Ab jetzt überprüft der Rechner jede Minute die Verbindung und baut Sie gegebenenfalls neu auf. Jetzt bitte noch der Interface local-node in der Datei /etc/config/network oder per uci deaktivieren.


Jetzt sollte nach einem beherzten Neustart die Maschine Ihren Dienst tun.