Mit OpenVPN zwei Netzwerke verbinden

Das Gateway läuft perfekt im eigenen Netzwerk, doch nun möchte man noch ein anderes Netzwerk, z.B. das der Eltern, oder der Firma mit dem eigenen verbinden – Die Möglichkeit heutzutage auf kleinen PCs oder billig-Routern ein Linux, wie OpenWRT installieren zu können, macht dies relativ einfach möglich!

Inhalt

Vorwort

In diesem Workshop werden wir als erstes ein zweites Netzwerk mit der Netzadresse 10.1.2.0/24 (subnet: 255.255.255.0) erstellen, dass wir dann über VPN Verbinden (site-to-site VPN).

Im zweiten Teil, wird aufgezeigt, wie man sich auch „unterwegs“ an seinem VPN-Netzwerk anmelden kann.

[stextbox id=“comment“ caption=“Hinweis“]Ich werde hier nicht gross auf die Grundlagen über VPNs eingehen – Für diese empfehle ich das sehr tolle Buch: OpenVPN Kompakt von Thomas Zeller.[/stextbox]

Hardware

Als Hardware reicht ein OpenWRT router oder ein embedded system, z.B. ein apu2 von pcengines.ch. Wir werden in diesem Workshop das bereits vorhandene Gateway aus Router / Firewall selbst Bauen verwenden und das Netzwerk um ein zweites erweitern.

Voraussetzungen

IP Schema

Damit ein VPN funktioniert, müssen alle Netzwerke ein separates IP-Netz haben.
Wir entscheiden uns hier für das 10.1.X.X Netz, d.h.:

  • Das erste Netzwerk hat die IP-Adressen 10.1.1.0 bis 10.1.1.254,
  • Das zweite 10.1.2.0 bis 10.1.2.254,
  • Das dritte 10.1.3.0 bis 10.1.3.254, usw.
    Alle Netzwerke haben die Subnetz-Maske 255.255.255.0.

Zusätzlich braucht man noch ein IP-Netz fürs VPN selber, dieses wählen wir mit 10.1.20.0 / 255.255.255.0

Software

[stextbox id=“note“ caption=“Hinweis“]Im nachfolgenden wird das Gateway aus dem ersten Workshop als „vpnserver“, das Client Gateway als „vpnclient-1“ und der PC/Notebook eine einzelnen Benutzers als „vpnuser-1“ bezeichnet.

Der Rechner auf dem wir die Zertifikate erstellen heisst: certserver.[/stextbox]

Zertifizierungsstelle einrichten

Damit wir für den server und den client SSL-Zertifikate erstellen können, müssen wir zuerst eine sog. „Zertifizierungsstelle“ einrichten; diese wird nur an einer zentralen Stelle benötigt!

[stextbox id=“warning“ caption=“Achtung“]Mithilfe der Zertifizierungsstelle kann man beliebig Zertifikate erstellen um über VPN uneingeschränkt auf dein Netzwerk zuzugreifen!

Aus diesem Grunde sollte sich die Zertifizierungsstelle nicht auf dem VPN-Server befinden, sondern am besten auf einem Server oder Client innerhalb des Netzwerkes.

Ansonsten könnte ein Hacker, wenn er die Kontrolle über den VPN-Server erlangt sich selbst ein Zertifikat ausstellen und hätte dann uneingeschränkten Zugriff auf dein ganzes Netzwerk![/stextbox]

Wir nehmen hierzu einen Linux Homeserver für die Zertifizierungsstelle; dieser trägt den Namen: „certserver“.

[stextbox id=“tip“ caption=“Optionaler Benutzer“]Da man auf einem Linux System als „root“ nur administrative Arbeiten durchführen sollte, kann man sich einen Optionalen Benutzer (z.B.: „certadmin“) erstellen und dann entweder per direktem login, oder root und dann „su – certadmin“ auf diesen Benutzer wechseln:

[root@certserver ~]$ useradd -m certadmin
[root@certserver ~]$ su - certadmin

Alle nachfolgenden Schritte für das Einrichten der Zertifizierungsstelle können ab jetzt mit dem Benutzer „certadmin“ erledigt werden.[/stextbox]

Die scripte, die beim Umgang mit der Zertifizierungsstelle helfen sind in einem Verzeichnis namens „easy-rsa“ gespeichert, die mit der OpenVPN installation mitgeliefert werden.
Als erstes kopieren wir diese Scripte ins Home-Verzeichnis des der Zertifizierungsstelle (z.B. /home/certadmin):

[certadmin@certserver ~]$ cp -Rv /usr/share/easy-rsa/2.0 ~/easy-rsa;

Zertifikate erstellen und kopieren

Nun legen wir ein Verzeiochnis für deine CA an:

mkdir -v CA
cp -vR ~/easy-rsa CA/EigeneCA
cd CA/EigeneCA

[stextbox id=“comment“ caption=“Mehrere CAs“]Mittels obigen Schritten kannst du auch mehrere „CA’s“ erzeugen, wenn du beispielsweise VPN und Web-SSL Zertifikate vollständig trennen möchtest.
Erstelle dann einfach im Verzeichnis CA/ mehrere unter Verzeichnisse (z.B. vpn, ssl, etc.) und kopiere den Inhalt des easy-rsa Verzeichnisses in jedes von denen.[/stextbox]

Als erstes laden wir die Standard-Umgebungsvariablen (vars), stellen wir sicher, dass keine Überreste mehr vorhanden sind und erstellen das „Diffie-Hellman“ file:

[certadmin@certserver ~]$ . vars
[certadmin@certserver ~]$ ./clean-all
[certadmin@certserver ~]$ ./build-dh

Durch ausführen von

[certadmin@certserver ~]$ ./build-ca

erstellen wir nun erst das root-zertifikat.

Jetzt können noch die Zertifikate für die clients erstellt werden; als common name nehmen wir hier „server“ für den server und „client-1“ für den client und zum Schluss noch das Key-Exchange Schlüssel-File:

[certadmin@certserver ~]$ ./build-key-server server
[certadmin@certserver ~]$ ./build-key client-1

[stextbox id=“warning“ caption=“Achtung“]Während die Zertifikate (.crt) jeweils „öffentlich“ sind, d.h. sowohl auf dem Server, wie auch auf den clients verteilt werden dürfen, sind die entsprechenden Schlüssel (.key) streng Geheim zu halten und NUR auf den Rechnern, für die der key gedacht ist.

D.h. client-1.key ist NUR auf dem client-1 vorhanden und das des OpenVPN Servers (server.key und ca.key) am besten in einem safe. :)[/stextbox]

Den VPN-Server einrichten

Nun installieren wir openvpn auf dem server:

[root@vpnserver ~]$ yum install openvpn
[root@vpnserver ~]$ mkdir -v /etc/openvpn/

Jetzt werden Zertifikat und Keys vom Zertifizierungsserver auf den VPN-Server kopiert:

[certadmin@certserver ~]$ scp ~/CA/EigeneCA/keys/ca.crt vpnserver:/etc/openvpn/
[certadmin@certserver ~]$ scp ~/CA/EigeneCA/keys/dh2048.pem vpnserver:/etc/openvpn/
[certadmin@certserver ~]$ scp ~/CA/EigeneCA/keys/server.crt vpnserver:/etc/openvpn/
[certadmin@certserver ~]$ scp ~/CA/EigeneCA/keys/server.key vpnserver:/etc/openvpn/

Auf dem server muss nun noch das Verzeichnis für die Client-Konfiguration erstellt werden

[root@vpnserver ~]$ mkdir -v /etc/openvpn/ccd

Dann können wir das config-file für den VPN-Server erstellen:

mode server
daemon
proto udp
port 1194
dev tun
management 127.0.0.1 44000
client-config-dir /etc/openvpn/ccd
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
server 10.1.20.0 255.255.255.0
route 10.1.2.0 255.255.255.0
route 10.1.3.0 255.255.255.0
client-to-client
push "route 10.1.1.0 255.255.255.0"
push "route 10.1.2.0 255.255.255.0"
# usw., z.B. für client-2:
push "route 10.1.3.0 255.255.255.0"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn.status
verb 3

Nun muss noch eine Datei erstellt werden für die „client-config“. Diese weisst den Server an, was er tun soll, wenn sich ein spezifischer Client mit ihm verbindet. Bei einem site2site VPN will man beipsielsweise, dass der Server eine route zum Netzwerk des Clients macht, damit man auf dieses Netzwerk via VPN zugreifen kann.
Dazu erstellt man im client-config-dir eine Datei mit dem „common name“ (CN) des Clients, also in diesem Fall: /etc/openvpn/ccd/client-1 und folgendem Inhalt:

iroute 10.1.2.0 255.255.255.0

[stextbox id=“warning“ caption=“Achtung“]Dieses file muss genau so heissen wir der gewählte „Common Name“ für den client![/stextbox]

Zusätzlich müssen in der Firewall noch die folgenden Ports geöffnet werden:

RichtungInterfaceProtokollPortPolicy
INPUTeth0UDP1194ACCEPT
OUTPUTeth0UDP1194ACCEPT
PREROUTINGtun0  ACCEPT
POSTROUTINGtun0  ACCEPT
# Enable VPN-Server
echo -n "Turning VPN on..."
$IPTABLES -A INPUT -p udp --dport 1194 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 1194 -j ACCEPT

# Enable NAT for the tunnel
$IPTABLES -A PREROUTING   -i tun0   -j DNAT --to-destination 10.1.20.1
$IPTABLES -A POSTROUTING  -o tun0   -j SNAT --to-source      10.1.20.1
echo_done

10.1.20.1 ist hier die IP vom tun0 Interface auf dem Server. Diese könnte u.U. auch anders sein, z.B. 10.1.20.6.

Damit die Clients auch auf die anderen Netzwerke hinter dem Server Zugreifen können muss auf dem Server ipv4 Forwarding aktiviert werden:

sysctl -w net.ipv4.ip_forward=1

Als letztes starten wir auf dem server OpenVPN und die Firewall neu:

/etc/init.d/openvpn start
/etc/init.d/firewall restart

Den client einrichten

Nun müssen wir noch die IP für das LAN Interface auf dem Client setzten auf: 10.1.2.1

Auch auf dem client muss nun noch openvpn installiert werden:

yum install openvpn

Nun kopieren wir die client-keys entsprechend:

[certadmin@certserver ~]$ scp ~/easy-rsa/keys/ca.crt client-1:/etc/openvpn/
[certadmin@certserver ~]$ scp ~/easy-rsa/keys/client-1.crt client-1:/etc/openvpn/
[certadmin@certserver ~]$ scp ~/easy-rsa/keys/client-1.key client-1:/etc/openvpn/

Dann erstellen wir das config file des clients:

client
dev tun
proto udp
port 1194
comp-lzo
daemon
remote vpnserver
resolv-retry infinite
#nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client-1.crt
key /etc/openvpn/client-1.key
ns-cert-type server
verb 3

Zum Schluss openvpn starten:

systemctl start openvpn

Nun müsste der PC 10.1.1.10 den PC 10.1.2.10 anpingen können und umgekehrt.

Einen einzelnen Benutzer einrichten

[stextbox id=“note“ caption=“Hinweis“]Im Gegensatz zu den OpenVPN Gateways, gehen wir beim Benutzer-Client davon aus, dass es sich um einen Windows Rechner (und nicht Linux) handelt.

Die Konfiguration ist jedoch auch auf Linux fast identisch und wer Linux als Client benutzt wird wissen wie er es entsprechend abändern muss. ;)[/stextbox]

Falls man sich nun mittels eines einzelnen Benutzers Unterwegs (z.B. mit einem Notebook oder von der Arbeitsstelle aus) in sein VPN Netz einwählen möchte, muss man eigentlich nur ein zusätzliches client Zertifikat erstellen (entweder mittels „build-key“ oder „certpasswd“ (wenn man den exkurs weiter oben mitgemacht hat 😉 )

Anstatt „client-x“ sollte man aber dann zur besseren übericht die E-Mail Adresse des benutzers nehmen.

Zuerst lädt man für diesen ebenfalls OpenVPN herunter und installiert es.

Dann erstellen wir auf dem Zertifikatsserver ein Zertifikat für den Benutzer:

[certadmin@certserver ~]$ ./build-key user@email.tld

oder:

[certadmin@certserver ~]$ certpasswd user@email.tld

Das daraus resultierende .p12 file (certpasswd) oder das .crt und .key file (build-key) müssen nun auf den PC des Benutzers ins Verzeichnis: C:ProgrammeOpenVPNconfig kopiert werden.

Im Verzeichnis C:\Programme\OpenVPN\config\ erstllen wir dann ein file vpn.opvn:

remote vpnserver 1194
;ca ca.crt
pkcs12 user@email.tld.p12

client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
keepalive 10 120
ns-cert-type server
comp-lzo
verb 3
mute 20
route-up "ipconfig /flushdns"

[stextbox id=“tip“ caption=“Tip“]Möchte man noch zusätzliche routen einbinden kann man diese in der Konfigurationsdatei des clients vor dem: route-up „ipconfig /flushdns“ Kommando angeben, z.B:

# 10.1.20.13 steht für die IP Adresse des tunnels, die der client bekommt
route-up "route ADD 192.168.1.0 MASK 255.255.255.0 10.1.20.13"
route-up "route ADD 10.11.0.0 MASK 255.255.255.0 10.1.20.13"

Dies würde man z.B. benötigen, wenn das VPN Netz selbst wieder mit einem anderen VPN Netz verbunden ist und der VPN-Server von diesem „fremden“ Netz die routen nicht pushen soll.[/stextbox]

Nun kann man sich mittels des OpenVPN GUI oder per direktem Aufruf von „openvpn –config“ auf der Kommandozeile verbinden.

OpenVPN mit dem iphone

[stextbox id=“comment“ caption=“VPN auf Smartphones“]Als dieser Artikel geschrieben wurde gab es noch kaum Smartphones und VPN darauf schon gar nicht. 😉 Heute ist das natürlich anders und man möchte auch von seinem Smartphone VPN-Zugriff haben. Beim iphone gibt es zwar die Möglichkeit ein VPN via IPSEC einzurichten, doch lange gab es für OpenVPN leider keine Option. Heute ist dies anders, auch wenn es derzeit (noch) ein zusätzliches app braucht, welches jedoch ganz einfach zu installieren ist und sich im normalen VPN in den Einstellungen einbinden lässt![/stextbox]

Zuerst erstellen wir wie oben beschrieben einen OpenVPN Benutzer.
Hinweis: Da iOS das in der pkcs12-Datei enhtaltene Zertifikat (ca.crt) nicht speichert (es werden nur das persönliche Zertifikat und der Key installiert), ist es nötig die Option „ca“ im .ovpn Profil auszukommentieren:

ca ca.crt

Dann wird auf dem iphone das app „OpenVPN Connect“ installiert.

Nun sendet man sich die .p12 Datei per Mail (als Anhang) auf sein iphone, öffnet auf dem iphone die Datei und installiert diese so im sogenannten „iOS keychain“. Dies ist ein verschlüsselter Speicherplatz und Zugriff daruf hat man nur, wenn man Zugriff auf das iphone hat, etwa mittels PIN code oder TouchID.

Dann wird das iphone mit itunes verdnunden und unter „Apps“ kann man das app „OpenVPN“ anwählen und Dateien hinzufügen. Hier werden noch die folgenden Dateien hinzugefügt:

  • ca.crt
  • client.ovpn

Nun das OpenVPN app öffnen und das Profil importieren.

Wenn alles eingerchtet ist kann man sich ganz einfach über: Einstellungen -> VPN mit OpenVPN verbinden.

Related Links

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

2 thoughts on “Mit OpenVPN zwei Netzwerke verbinden”

  1. Hi.

    Die IPs im Vorwort,
    – zweites Netzwerk mit der Netzadresse 10.2.1.0/24
    IP Schema und
    – Das zweite 10.1.2.0 bis 10.1.2.254,
    scerver.conf sind unterschiedlich.
    server 10.1.20.0 255.255.255.0
    -> route 10.2.1.0 255.255.255.0
    route 10.1.3.0 255.255.255.0
    client-to-client
    push „route 10.1.1.0 255.255.255.0“
    -> push „route 10.2.1.0 255.255.255.0“

    Ist im Vorwort und der Server.conf ein Zahlendreher?

    Gruß Wolfgang

    1. Ja, das hast du richtig gesehen, danke vielmals für den Hinweis! 😃
      Ich habe das im Artikel nun korrigiert.

      Richtig ist: Netz 1: 10.1.1.0/24 und Netz 2: 10.1.2.0/24

      Natürlich muss man aber nicht dieses Schema verwenden, es sind alle Netze möglich, so lange sie sich nicht „überschneiden“.
      Was z.B. auch möglich wäre, wäre 10.1.1.0/28 und 10.1.1.16/28 => In diesem Falle wäre Netz 1: 10.1.1.1 bis 10.1.1.14 und Netz 2: 10.1.1.17 bis 10.1.1.30.
      Oder auch: Netz 1: 10.1.1.0/24 und Netz 2: 192.168.100.0/24

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert