OpenVPN selektiv #1

OpenVPN Client auch auf dem Server zu nutzen, hört sich doch erstmal relativ unkompliziert an.

Stellt man auf einem lokalen Rechner eine OpenVPN Verbindung her,
openvpn client.ovpn
wird sämtlicher Traffic durch den Tunnel geroutet.
Hier ist Vorsicht geboten, wird dieses Kommando nämlich auf einem Server ausgeführt, ist dieser erst mal Weg vom Fenster. Besser gesagt weg vom Internet.
Das Tunnelinterface tun0 wird als default Gateway gesetzt, was zur Folge hat, dass der Server aus dem öffentlichen Internet nicht mehr erreichbar ist. Da hilft nur noch ein Reboot über das Webinterface vom Hoster.

Infolgedessen muss dieses verhalten, dass Standardgateway zu ändern, unterbunden werden:
--route-nopull
zur OpenVPN client.ovpn Konfigurationsdatei hinzufügen. Damit ignoriert der Server alle Routen, die vom OpenVPN Server gepusht werden.

Die Tunnelverbindung kann wie folgt getestet werden:
curl --interface tun0 ipv4.dckg.net
Dieser Befehl sollte die öffentliche IP-Adresse des VPNs wiedergeben.

curl ipv4.dckg.net
Hingegen gibt die öffentliche IP-Adresse des Servers zurück, wie es auch nicht anders zu erwarten war, zumal das Standardgateway nicht verändert wurde.

ifconfig
Gibt die angeschlossen Netzwerkinterfaces und deren IP-Adressen zurück.
Kernel Routingtabelle:
ip route show
sowie
netstat -nr

Auffallend ist hier, dass
wget --bind tun0_ip -qO- ipv4.dckg.net
nicht funktioniert.

Der Tunnel steht also, binden funktioniert allerdings nicht. Zumal sämtliche Routen, die der Server gepusht hat, ignoriert wurden.
Demzufolge müssen noch Routen gesetzt werden, jedoch ohne das Standardgateway zu verändern, was wie oben schon erwähnt die Verfügbarkeit des Servers über das Internet stark einschränken würde.
Hierfür müssen noch
--script-security 2
up /usr/local/bin/openvpn-up.sh
down /usr/local/bin/openvpn-down.sh

zur Konfiguration hinzugefügt werden.

Ersteres erlaubt das Ausführen von Skripten, letztere definieren Start- und Stop-Skripte, die bei Tunnelaufbau bzw -trennung ausgeführt werden:

Zuerst muss eine neue Routingtabelle angelegt werden:
echo 200 tunnel >> /etc/iproute2/rt_tables

openvpn-up.sh

#!/usr/bin/env sh
ip rule add from "$ifconfig_local" table tunnel
ip route add table tunnel default via "$ifconfig_remote"
ip route add table tunnel "$ifconfig_remote" via "$ifconfig_local" dev "$dev"


openvpn-down.sh

#!/usr/bin/env sh
ip rule delete from "$ifconfig_local" table tunnel
ip route flush table tunnel

chmod u+x nicht vergessen!

Nach erneutem Aufbau des VPN Tunnels mit diesen Änderungen, sollte das binden mittels wget an die IP des Tunnelinterfaces tun0 funktionieren.

Binden geht, ok, doch wie bindet man einen User oder Prozess an ein Interface, in diesem Fall an die VPN-Verbindung?
Weiter im 2. Teil ...

Ressourcen:
OpenVPN IngoreRedirectGateway
OpenVPN Dokumentation - "Environmental Variables"