OpenVPN – 2 Netzwerke miteinander verbinden

OpenVPN – 2 Netzwerke miteinander verbinden

Ich besitze einige Geräte in meinem Hauptnetzwerk und einige Geräte in meinem 16 Kilometer entfernten Zweitnetzwerk. Nun musste ich mir überlegen, wie ich von einem Netzwerk auf das andere zugreifen kann. Aufgrund der Distanz ist keine physikalische Verbindung zueinander möglich. Richtfunk ist ebenfalls nicht möglich, da sich dazwischen Berge und Dörfer befinden.
Somit bleiben nicht mehr viele Möglichkeiten. Die Dienste nach außen hin über Portfreigaben freizugeben ist mir zu kritisch und es ist nicht möglich, den gleichen Port von verschiedenen Maschinen freizugeben. Natürlich gibt es zum Beispiel bei HTTP die Möglichkeit, die reverse Proxy Funktion in nginx zu nutzen. Nur lässt sich dies nicht für SSH oder andere Protokolle anwenden.
Schlussendlich habe ich mich für einen der professionellsten Wege entschieden, die vor allem im Geschäftsbereich Anwendung finden. Hierbei werden unter anderem Firmenniederlassungen oder auch Filialen miteinander verbunden. Die Rede ist hier von einer VPN Verbindung.

Werbung

Ich habe mich für OpenVPN entschieden, da bei einer OpenVPN Verbindung mittels einem Server keine zusätzliche Software auf dem Endgerät des Benutzers installiert werden muss und es sehr sicher durch starke Verschlüsslung und gesicherte Anmeldung durch signierte Schlüssel ist. Ebenfalls toleriert eine OpenVPN Verbindung Verbindungsabbrüche und öffentliche dynamische IP Adressen seitens dem Client und des Servers. Somit perfekt für den Privatanwenderbereich oder Firmen ohne statische IP Adressen.

Was passiert genau?

Jedes übliche Endanwendernetzwerk und die meisten Firmen nutzen intern ein privates Netzwerk und nutzen NAT zur Übersetzung der internen IP Adresse zur externen IP Adresse.
OpenVPN Netzwerk Konzept

In diesem Beispiel existieren 2 private Netzwerke. Das linke ist mein Hauptnetzwerk und das rechte mein Zweitnetzwerk. Beide Netzwerke besitzen jeweils einen Server und einen Router und sind an das Internet angebunden. Beide Router übersetzen aus dem internen Netzwerk in das öffentliche Netzwerk via NAT.

Das linke Netzwerk ist das primäre Netzwerk. In diesem befindet sich Server0, der auch für OpenVPN als Server agiert. Im Router0 ist später für Server0 eine Portfreigabe einzurichten.

Beide Netzwerke besitzen ein 24er Subnetz (255.255.255.0). Es ist wichtig, dass beide Netzwerke ein unterschiedliches Netz besitzen. So besitzt das Hauptnetzwerk das Netz 192.168.0.0 und das Zweitnetzwerk das Netz 192.168.1.0. Natürlich kann jeder selbst sein Netzwerk aussuchen. Man muss hierbei nur beachten, dass sich beide Netzwerke nicht überschneiden, da ansonsten das Routing nicht funktioniert.

Ich gehe davon aus, dass sich auf beiden Servern Debian/Ubuntu befindet und root-Zugriff vorhanden ist.
Weiters gehe ich davon aus, dass dem Hauptserver die DDNS Adresse ddnsdomain.deiner.domain zugewiesen wurde. Ersetze diese bitte mit deiner DDNS Adresse. Kostenlose DDNS Adressen gibt es unter anderem bei no-ip und ClouDNS.

Server

Auf beiden Servern wird die Software OpenVPN benötigt. Diese wird mittels folgendem Befehl installiert:

apt-get install openvpn

Nach der Installation steht der Ordner „/etc/openvpn/“ zur Verfügung.

Als nächstes muss auf beiden Servern die Kerneleinstellung „net.ipv4.ip_forward“ verändert werden. Dies machen wir, damit der Computer als Router zwischen Netzwerken agieren kann. Hierfür muss in der Datei „/etc/sysctl.conf“ folgende Zeile eingefügt werden:

net.ipv4.ip_forward=1

Anschließend muss die Konfiguration mittels dem folgenden Befehl neu eingelesen werden:

sysctl -p

Alternativ kann die Maschine auch neu gestartet werden.

Server0

Ich werde hier auf TCP näher eingehen, da TCP Verbindungen mit OpenVPN stabiler sind als UDP Verbindungen. Des öfteren hat sich bei mir gezeigt, dass UDP zwar schneller (~6ms) aber dafür Störungsanfällig ist. TCP war hingegen stabiler, schwankt aber oft bei den Verbindungszeiten sowie bei der Transferrate.
Falls lieber UDP verwendet werden soll, lass dazu einfach in den Konfigurationen die Zeile „proto“ weg. Beachte bitte auch auf das Protokoll im Router für die Portfreigabe.

Key

Dies ist der Hauptserver. Zu diesem verbinden sich alle Clients (Server1).
Da es sich hierbei um eine Direktverbindung (P2P) zwischen Server0 und Server1 handelt, verwenden wir einen statischen Key. Wichtig hierbei ist, dass pro Konfiguration nur eine Verbindung hergestellt werden kann. Sollen mehrere Verbindungen verfügbar sein, so muss für jede eine neue Konfiguration unter anderem Port erstellt werden.

Als erstes muss der Schlüssel erstellt werden. Dieser wird vor allem zur Anmeldung und Verschlüsslung verwendet.

openvpn --genkey --secret /etc/openvpn/filiale1.key

Die Datei „filiale1.key“ beinhaltet nun den Schlüssel, der etwa so aussieht:

#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
d8035219d4f881d7733c022cd4b66ce0
61e0db60d69ef9d0e11b14e47f4ea570
ece76c333e637c9f8ef5086253c11204
018d74691ba87809f2eedd7d53615f15
8d93d6eb06b64aa00697cba32d1ed565
f76b72aefcd1ca9f7b08d456387c3be9
d1fc6cec98ce6bf883755310a2ca8b26
c5f3f4717229b1171d4d08a289c51334
7ad921e2f1b07c65371b981fd3d5b9f8
7a6dc0f87a3b41628c9085d35694b2de
8e1bb356731165d252ef758503bac881
b93a738e5fdfd72a9f5b7b035c317be3
066f2aa49c8e252ec2f26684063d5d8d
a3a39af8da865e2557d57b7c712027ee
1d67ba171e43ebe0860440aa4a5e21a9
6ddbf3594067b5c8004fb69c4e3044f7
-----END OpenVPN Static key V1-----

Der jetzt erstellte Key muss auf Server0 und auf Server1 vorhanden sein. Kopiere hierzu den Schlüssel auf Server1 in den Ordner „/etc/openvpn/“.
Stelle bitte sicher, dass niemand sonst, außer root die Datei lesen darf, da ansonsten die Verbindung übernommen oder der Datenverkehr mitgelesen werden könnte. Führe dazu folgenden Befehl aus:

chmod 600 /etc/openvpn/filiale1.key

Konfiguration

Nun erstellen wir die Konfigurationsdatei für die Verbindung, damit sich später Server1 mit Server0 verbinden kann. Hierzu legen wir die Datei „filiale1.conf“ an. Wichtig ist hierbei, dass die Datei mit „.conf“ enden muss. „nano /etc/openvpn/filiale1.conf“:

dev tun
proto tcp-server
port 1194
ifconfig 192.168.255.1 192.168.255.2
route 192.168.1.0 255.255.255.0
comp-lzo
keepalive 10 60
ping-timer-rem
persist-key
persist-tun
user nobody
group nogroup
secret filiale1.key

In der oben stehenden Konfiguration sind einige optimale Angaben enthalten, die aber eine weitaus bessere Performance als bei den Standardeinstellungen bieten.
Unter „port“ wird der zu verwendende Port angegeben. Bitte stelle sicher, dass dieser auch im Router freigegeben wird. (Normalerweise UDP, hier TCP)
Die Angabe „ifconfig“ bezeichnet die zu verwendenden IP Adressen für die P2P Brücke. Bitte beachte, dass es sich hierbei um ein 30er Subnetz (255.255.255.252) handelt. Das bedeutet, dass in dem Fall 192.168.255.0 das Netz ist und 192.168.255.3 die Broadcast-Adresse ist. Somit stehen bei der nächsten Verbindung erst wieder die IP Adressen 192.168.255.5 und 192.168.255.6, danach 9 und 10 usw. zur Verfügung.
route“ gibt das entfernte Netz an, das bei einer bestehenden Verbindung erreicht werden kann.
Optimal kann „comp-lzo“ angegeben werden. Dies bewirkt, dass die zu übertragenden Pakete komprimiert werden.
Da die öffentliche IP Adresse des Servers bzw. die öffentliche IP Adresse der Gegenstelle dynamisch sein kann und über NAT verläuft, halten wir die Verbindung ständig offen und ignorieren IP Änderungen. Zusätzlich erzwingen wir die Beibehaltung des tunnel-interfaces bei Verbindungstrennung und die Beibehaltung des Keys im Speicher. Dies kann mit „keepalive 10 60„, „persist-key“ und „persist-tun“ erreicht werden.

Da wir den Key durch „persist-key“ im Speicher behalten, ist es nun möglich, dem OpenVPN Prozess für die Verbindung Berechtigungen zu entziehen, damit im Fall eines Fehlers der Angreifer keine root Rechte erlangen kann. Dies geschieht mit „user nobody“ und „group nogroup„.

Schließlich geben wir noch an, wo sich die Schlüsseldatei befindet. Diese befindet sich im selben Ordner namens „filiale1.key“. Somit lautet unsere Konfigurationseinstellung „secret filiale1.key„.

 Server1

Bitte überprüfe nochmals, ob der Schlüssel richtig übertragen wurde, die Rechte eingeschränkt wurden und sich im Ordner „/etc/openvpn/“ befindet.

Konfiguration

Die Clientkonfiguration sieht nicht großartig anders aus als die von Server0. Hierbei müssen nur die IP Adressen und die Route angepasst werden. Wenn TCP für den Transfer genutzt wird, muss auch hier von „server“ auf „client“ umgeändert werden. Bei UDP entferne diese Zeile einfach.

dev tun
proto tcp-client
port 1194
remote ddnsdomain.deiner.domain 1194
ifconfig 192.168.255.2 192.168.255.1
route 192.168.0.0 255.255.255.0
comp-lzo
keepalive 10 60
ping-timer-rem
persist-key
persist-tun
user nobody
group nogroup
secret filiale1.key

Vor allem wichtig ist in der Konfiguration die Zeile beginnend mit „remote„. Diese definiert die Zugriffsadresse und den Port des Hauptservers zu dem verbunden werden soll.

 Primärer Router im Netzwerk

Im primären Router des Netzwerkes (in dem Fall Router0 & Router1) muss nun noch die Routingtabelle erweitert werden. In Router0 muss so die Route 192.168.1.0 255.255.255.0 hinzugefügt werden, die auf die IP Adresse von Server0 verweist. In Router1 wird hierbei der Eintrag gegengleich eingetragen. 192.168.0.0 255.255.255.0 und die IP Adresse von Server1.

Beispiele der Routen im Router

Da die Routingtabelleneinstellungen im Router oft gut versteckt sind, habe ich hier ein paar meiner Geräte angeführt, um euch die Suche zu erleichtern.

FritzBox

Unbenannt
FritzBox: Heimnetz > Netzwerk > Netzwerkeinstellungen > IPv4-Routen

dd-wrt

Unbenannt
Setup > Erweitertes Routing

TP-Link

Unbenannt
Advanced Routing > Static Routing List > Add New …

Abschluss

Ich hoffe, euch hat meine Anleitung weiter geholfen und eine Stundenlange suche erspart. Zu guter Letzt muss noch der Dienst OpenVPN auf beiden Servern neu gestartet werden. Dies kannst du mit folgendem Befehl machen:

service openvpn restart

Weitere Informationen zu OpenVPN findest du unter OpenVPN.eu.
Wie immer der rechtliche Teil des Artikels: Ich hafte für keinerlei Beschädigungen am System oder Gerät, die im Zuge der Verwendung dieser Erklärung auftreten können.

Author: Thomas2500

OpenVPN – 2 Netzwerke miteinander verbinden
5 (100%) 4 votes

7 thoughts on “OpenVPN – 2 Netzwerke miteinander verbinden

  1. Erik

    Hallo,

    danke für das How-TO, lässt sich gut durchgehen. Ich bin aber beim letzten Punkt etwas am grübeln:

    Du schreibst, dass die Routen noch eingetragen werden sollen, dabei ist aber anhand der Bilder das nicht ganz für mich ersichtlich.
    Im Bild der FB sprichst du das IP Netz 192.168.1.0 an und der Gateway steht auch im 192.168.1.0 (Gateway = 192.168.1.250) In den anderen Bildern passt es dann, meines Erachtens, oder sehe ich das falsch?

    Im Router bei Server 1 also Router 1 ist es dann umgekehrt:
    Netz: 192.168.0.0
    Sub: 255.255.255.0
    Gateway: 192.168.1.250

    Im Router bei Server 0, also Router 0 dann wie folgt:
    Netz: 192.168.1.0
    SUB: 255.255.255.0
    Gateway: 192.168.0.250

    Habe ich as richtig verstanden?
    Und, kann ich nach dem How-To auch von Geräten hinter Server 0 auf Geräte hinter Server 1 und andersherum? Das ging für mich Laien nicht ganz hervor.

    Trotz alle dem, danke für deine Mühe!

    Grüße

    Erik

    1. Hallo Erik.

      Ja, das Netz stimmt in dem bild nicht. Ich werde dies demnächst korrigieren.
      Du musst im Router immer das Netz der Gegenseite, also des entfernten Netzwerks eintragen werden.

      Das Tutorial ermöglicht den beidseitigen Zugriff. D.h. dass ein Benutzer aus Netz A auf Netz B Zugriff hat und ein Nutzer aus Netz B Zugriff auf auf Netz A.

      MfG
      Thomas

  2. Helmut

    Hallo Thomas.

    Die Anleitung ist wirklich gut nach vollziehbar und hat „eingeschränkt“ auch gleich funktioniert. Beide PCs können miteinander kommunizieren. Darüber hinaus geht es leider nicht. Hab eine Weile gesucht bis ich auf den Trichter gekommen bin, dass du keinerlei Einträge in den IPtables machst. Wie sollen die beiden Schnittstellen ETH0 und TUN0 denn miteinander verfahren? Die ROUTE von OpenVPN geht über TUN0 hinaus, aber wohin? Auch das IP_FORWARDING ist an, aber auch hier, wohin?
    Letztendlich fehlen bei beiden PCs Einträge in den IPtables.

    SERVER0:
    iptables -A FORWARD -i eth0 -o tun0 -m state –state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -s 192.168.1.0/24 -o eth0 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

    SERVER1:
    iptables -A FORWARD -i eth0 -o tun0 -m state –state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

    Danach hat man beide Netze miteinander „verschmolzen“.

    Diese Art der OpenVPN Nutzung ist z.B. für Netze interessant die nur über LTE zugänglich sind, ohne dynamische IPs, weder IPv4 noch IPv6, oder die nur über IPv6 erreichbar sind aber IPv4 brauchen.
    Ich benutze diese Art da mein zweites Netz NUR einen LTE Zugang hat und über einen Proxy der Telekom läuft. Somit verbindet sicher der Client aus dem LTE Netz mit dem Server und das Netz hinter dem Server greift auf das Netz hinter dem Client zu. Dank LTE100/100 und VDSL100/40 sind die Übertragungen hervorragend.

    Gruß
    Helmut

  3. Santino

    Hallo,

    also erstmal die Anleitung ist super verständlich geschrieben und war sehr gut nazuvollziehen.
    Trotzdem hab ich leider noch ein Problem. Die Verbindung zwischen dem zwei Netzwerken funktioniert, aber ich erreiche nur den Clienten oder den Server alles was hinter diesen zwei liegt wird nicht erreicht.

    Wo könnte das Problem liegen ? Könnte es an den IPv4 Routes liegen ?

    Gruß

    Santino

    1. Santino

      Oder eventuell sogar am Switch? Ich habe die OpenVPN Server/Client direkt am jeweiligen Router angeschlossen.

  4. Daniele U.

    Hallo und Danke erstmal für die Anleitung.
    Die Verbindung zwischen meinen beiden Linuxservern funktioniert wunderbar. Man kann auch über die eigentliche IP des jeweiligen Servers zugreifen.

    Nun möchte ich auch noch auf die jeweil hinter dem Router liegenden Geräte zugreifen können, was im Moment allerdings leider nicht funktioniert.Keines der Geräte im anderen Netzwerk läßt sich über seine eigentliche IP anpingen. Weder über einen der Clienten oder die Server in den entfernten Netzwerken.
    Ich hoffe, das war jetzt nicht zu verwirrend, was ich geschrieben habe. ^^

    Die Geräte hängen in jedem Netz direkt, oder über einen Switch verbunden, jeweils an einer Fritzbox.
    Komme ich mit den iptables da weiter, da die anderen Geräte ja nicht am Server/dem Pi angeschlossen sind?

    LG
    Daniele

  5. Sebastian

    Hi. Danke für die verständliche Anleitung. Funktioniert bei mir gut. Das einzige Problem was ich habe ist, dass ich nicht über 180kB komme obwohl eine Seite vdsl 50 und dir andere ein Glasfaser Anschluss mit 200/100 ist.
    Schiebe ich eine Datei von einem vpn server auf den zweiten ist die Geschwindigkeit io. Schiebe ich von einem Client in Netz 1 auf ein NAS in Netz 2 dann bleibe ich bei den 180kB hängen.

    Eine Idee wo mein Fehler liegen könnte?

    Sebastian

Kommentar verfassen