OpenVPN – Zugriff auf Netzwerk hinter einem Client

Ziel ist, über einen eigenen OpenVPN-Server, der auf einem dedizierten Root-Server betrieben wird, Zugriff auf das lokale Netzwerk Zuhause (Heimnetz) zu erlangen. Es soll möglich sein, sich von überall mit dem VPN zu verbinden (z.B. über ein Smartphone) und dann auf das Heimnetzwerk zuzugreifen.

Als Gateway zwischen dem VPN und dem Heimnetz verwenden wir einen Raspberry Pi.

Im Folgenden wird davon ausgegangen, dass bereits ein OpenVPN Server eingerichtet ist und sich mehrere Clients mit diesem verbinden können. Die Einrichtung ist in einem anderen Artikel ausführlich beschrieben.

IP-Bereiche und Adressen

  • 10.8.0.0/24 VPN
    • 10.8.0.50 Raspberry Pi VPN-Gateway
  • 192.168.178.0/24 Heimnetz
    • 192.168.178.1 Router mit DNS-Server
    • 192.168.178.32 Raspberry Pi VPN-Gateway
      Das Client-Zertifikat ist bereits als pi-vpn-gw ausgestellt und die Client-Config liegt auf dem Raspberry Pi im Home-Verzeichnis als ~/pi-vpn-gw.ovpn vor.

Einrichtung auf dem Raspberry Pi

Zuerst installieren wir OpenVPN und kopieren die Client-Config, wobei wir die Dateiendung auf .conf ändern.

Installation von OpenVPN

sudo apt-get install openvpn
sudo cp ~/pi-vpn-gw.ovpn /etc/openvpn/pi-vpn-gw.conf

Anschließend aktivieren wir das IP-Forwarding und die NAT-Regeln.
IP-Forward, NAT

sudo sysctl -w net/ipv4/ip_forward=1
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

Damit dies in Zukunft automatisch bei einem Neustart des Raspberry Pi erledigt wird, führen wir die folgenden Zeilen aus:

forwarding

/etc/sysctl.conf:
net.ipv4.ip_forward = 1
 
# Weiterleitung in das lokale Netz
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

Forwarding aktivieren

sysctl -p /etc/sysctl.conf

iptables Firewall Regeln auf einem Debian basierten Linux System permanent abspeichert

apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4

Abschießend erstellen wir noch den Symlink für den SystemD-Service und starten diesen.

SystemD-Service

sudo ln -s /lib/systemd/system/openvpn@.service /etc/systemd/system/openvpn@pi-vpn-gw.service
sudo systemctl start openvpn@pi-vpn-gw.service

Damit läuft der OpenVPN-Client nun permanent im Hintergrund und stellt die VPN-Verbindung wieder her falls diese abbrechen sollte.

Anpassung auf dem OpenVPN Server

Bei dem OpenVPN-Server fügen wir der Server-Config die folgenden Einträge hinzu, sofern noch nicht vorhanden:

/etc/openvpn/server.conf

# Verzeichnis für die Client-Configs
client-config-dir ccd
 
# Route zum Heimnetz auf dem Host-System des OpenVPN-Servers anlegen (optional)
;route 192.168.178.0 255.255.255.0
 
# Route zum Heimnetz allen Clients mitteilen
push "route 192.168.178.0 255.255.255.0"
 
# DNS-Server den Clients mitteilen
push "dhcp-option DNS 192.168.178.1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

Die Route zum Heimnetz in Zeile 5 ist optional und sollte nur aktiviert werden, wenn man von dem Host-System des OpenVPN-Servers direkten Zugriff auf das Heimnetz benötigt.

Als 1. DNS-Server wird die IP des Routers im Heimnetz verwendet, wodurch es möglich wird über das VPN auch die Hostnamen der Geräte im Heimnetz zu verwenden. Als 2. und 3. DNS-Server nehmen wir die Google-DNS-Server, für den Fall dass der 1. DNS-Server mal nicht erreichbar ist.

Weiterhin legen wir eine clientspezifische Config für unseren Client unter /etc/openvpn/ccd/pi-vpn-gw auf dem Server an beziehungsweise ergänzen diese:

/etc/openvpn/ccd/pi-vpn-gw

# Feste IP für den Client (Client-IP Subnet)
ifconfig-push 10.8.0.50 255.255.255.0
 
# Internes Routing zum Heimnetz über diesen Client
iroute 192.168.178.0 255.255.255.0

Abschließend noch ein Neustart des OpenVPN-Servers.

sudo systemctl restart openvpn

Fertig!

Nachdem sich unser Raspberry Pi VPN Gateway nun mit dem OpenVPN-Server verbunden hat, sollte es von jedem VPN-Client aus möglich sein jedes Gerät im Heimnetz zu erreichen.

Zum Testen kann man beispielsweise versuchen von einem Smartphone (mit ausgeschaltetem WLAN und aktivierten VPN) den Raspberry Pi (192.168.178.32) oder den Router im eigenen Heimnetz (192.168.178.1) zu erreichen.

VPN Gateway

Auf VPN Gateway

auto eth0
 iface eth0 inet static
 address 192.168.178.4
 subnet 255.255.255.0
 gateway 192.168.178.1
auto eth0:0
 iface eth0:0 inet static
 address 192.168.178.5
# iptables -A FORWARD  -s 192.168.30.0/24 -i eth0:0 -o eth0 -m conntrack --ctstate NEW -j REJECT
sudo iptables -A FORWARD -s 192.168.30.0/24 -i eth0:0 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo route add default gw 10.9.0.1 tun0