Anleitung: openVPN Server auf Debian 7.8 installieren und anschließend mit Android, iOS oder Windows verbinden

OpenVPN ist ein wirklich Klasse Tool und immer wieder werde ich gefragt wie man ein virtuelles Netzwerk einrichtet und ob ich dabei helfen kann.

Natürlich kann ich das! Und deswegen schreibe ich hier eine kleine Anleitung mit den einzelnen Schritten um am Ende ein virtuelles Netzwerk zu haben.

Ich gehe davon aus, dass Grundkenntnisse mit Debian vorhanden sind.

Ziel ist es ein virtuelles Netzwerk einzurichten in dem man nur mittels Zertifikat hinein kommt. Somit werden keine Logins benötigt und man kann einen User jederzeit sperren.

 

Inhalt:

 

 

Voraussetzungen:

  1. ein Server mit mindestens 512 MB Ram, mindestens eine 800 Mhz CPU (Mehr ist natürlich besser) und mindestens 5 GB freien Festplattenspeicher
  2. TUN / TAP Unterstützung aktiviert
  3. installiertes Debian System
  4. SSH Zugang mit Root Rechten

Das sind die minimalen Voraussetzungen die euer Server erfüllen muss. Solltet Ihr einen besseren Server haben, sollte dies kein Problem sein.

Wenn der Server kein TUN/TAP aktiviert hat, müsst Ihr euch zu erst an euren Hoster wenden und um die Aktivierung bitten. Einige Hoster erlauben auch eine Aktivierung im Control Panel des jeweiligen Hosters.

 

OpenVPN installieren und konfigurieren

1. Verbindung zum Server aufbauen und Updates einspielen 

Stellt mittels Putty oder ähnlichem Client eine Verbindung zu eurem Server her.

Ist die Verbindung erfolgreich hergestellt werden erst mal eventuelle Updates installiert.

Dazu einfach in der Konsole folgenden Befehl ausführen:

root@vpn:~# apt-get update && apt-get upgrade

 

2. Prüfen ob TUN/TAP aktiviert ist 

Um zu prüfen ob das TUN/TAP Device aktiv ist und korrekt arbeitet einfach folgenden Befehl in der Konsole eingeben:

root@vpn:~# cat /dev/net/tun

Die Ausgabe sollte dann so aussehen:

cat: /dev/net/tun: File descriptor in bad state
Hinweis
Wenn in der Ausgabe eine Meldung der Art “File descriptor in bad state” erscheint, ist alles in Ordnung und TUN/TAP ist aktiviert. Wenn in der Ausgabe hingegen eine Meldung der Form “No such device” erscheint, sollte man den Hoster mit der Bitte um Aktivierung des TUN/TAP Devices kontaktieren.

 

3. Installation von openVPN und udev 

Einfach den Befehl eingeben und Entern

root@vpn:~# apt-get install openvpn udev

 

4. Kopieren der Beispielkonfigurationen von openVPN 

Bei der Installation hat openVPN bereits alles mitgeliefert was wir benötigen. Die entsprechenden Dateien müssen lediglich kopiert werden.

Das geschieht mittels:

root@vpn:~# cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

 

5. OpenVPN Beispielkonfiguration bearbeiten 

Als erstes editieren wir die Datei “vars” mit vi oder nano oder was Ihr sonst gern verwendet. Die Werte für “KEY_COUNTRY”, “KEY_PROVINCE”, “KEY_CITY”, “KEY_ORG” und “KEY_EMAIL” einfach mit den eigenen Werten anpassen. Kein muss aber eine ganz klare Empfehlung ist die 1024-Bit Verschlüsselung zu erhöhen da diese heutzutage durchaus zu knacken ist.

Dazu einfach “KEY_SIZE” auf 4096 stellen.

Nun die Datei einfach speichern und schließen.

root@vpn:~# vi /etc/openvpn/easy-rsa/2.0/vars

Die Datei sieht so aus mit entsprechenden Stellen die editiert werden müssen:

# These are the default values for fields

# which will be placed in the certificate.#

Don’t leave any of these fields blank.

export KEY_COUNTRY=”DE”

export KEY_PROVINCE=”B oder euer Bundesland”

export KEY_CITY=”Berlin oder sonst etwas”

export KEY_ORG=”Organisation oder Domain”

export KEY_EMAIL=”eure@mailadresse.de”

export KEY_SIZE=4096

 

6. OpenVPN Zertifikat erstellen 

Dazu einfach nachfolgende Befehle, nacheinander in die Shell eingeben.

Wir wechseln in das korrekte Verzeichnis mit:

root@vpn:~# cd /etc/openvpn/easy-rsa/2.0/

Hier laden wir die vorhin erstellte “vars” Datei

root@vpn:~# . /etc/openvpn/easy-rsa/2.0/vars

Mit diesem Befehl werden alle Altlasten und bereits erstellten Schlüssel gelöscht

root@vpn:~# . /etc/openvpn/easy-rsa/2.0/clean-all

Jetzt erstellen wir ein Server Zertifikat. Dabei werden einige Eingaben erforderlich die Ihr einfach ausfüllen könnt

root@vpn:~# . /etc/openvpn/easy-rsa/2.0/build-ca
Wichtig!
Die beiden Fragen bzw. Werte müssen einzigartig sein und dürfen nicht doppelt vergeben werden!

Common Name (eg, your name or your server’s hostname) [changeme]:vpn.euer-host.com

Name [changeme]:einmaliger-name

 

7. OpenVPN privaten Server Schlüssel erstellen 

Nun gilt es wieder, wie so oft, einen Befehl in der Shell ein zutippen um damit den privaten Schlüssel für den Server zu erstellen. Im Zuge dessen wird man auch wieder aufgefordert einige Daten einzugeben. Die Eingaben bitte auf eure persönlichen Bedürfnisse anpassen. Das “challenge password” und den “company name” kann man in diesem Fall leer lassen. Die Eingaben muss man im Anschluss noch 2x mit der Taste “y” oder der “j” Taste (engl.: yes, dt.: ja) bestätigen.

root@vpn:/etc/openvpn/easy-rsa/2.0# . /etc/openvpn/easy-rsa/2.0/build-key-server vpn-server

 

8. OpenVPN Schlüssel für einen Client erstellen 

Um einen Schlüssel für einen Client zu erstellen einfach den nachfolgenden Shell Befehl eintippen wobei dabei das “windowspc” in diesem Befehl unbedingt durch eine eigene Bezeichnung ersetzt werden sollte. Es darf weiterhin keine 2 Clients geben die mit genau der gleichen Bezeichnung arbeiten. Sie müssen vom Namen her paarweise also immer verschieden sein.

Das “challenge password” und den “company name” kann man in diesem Fall auch leer lassen. Die Eingaben muss man im Anschluss noch 2x mit der Taste “y” oder der “j” Taste (engl.: yes, dt.: ja) bestätigen.

root@vpn:/etc/openvpn/easy-rsa/2.0# . /etc/openvpn/easy-rsa/2.0/build-key windowspc

 Möchte man später noch weitere Clients hinzufügen so muss man dieses Prozedere einfach mit folgenden Befehlen wiederholen und die Bezeichnung “linuxpc” wieder entsprechend ändern:

root@vpn:~# cd /etc/openvpn/easy-rsa/2.0/
root@vpn:/etc/openvpn/easy-rsa/2.0# . /etc/openvpn/easy-rsa/2.0/vars
root@vpn:/etc/openvpn/easy-rsa/2.0# . /etc/openvpn/easy-rsa/2.0/build-key linuxpc

 

9. Diffie-Hellman-Parameter erstellen 

Einfach folgenden Befehl ausführen:

root@vpn:/etc/openvpn/easy-rsa/2.0# . /etc/openvpn/easy-rsa/2.0/build-dh

 

10. OpenVPN Dateien auf den Client kopieren 

Ich kopiere die Dateien per scp auf meinen Rechner und verteile diese von da aus an meine Clients per USB Stick oder als verschlüsseltes Archiv über eine verschlüsselte https Verbindung.

Hinweis
Wichtig ist, dass Ihr das eben nicht einfach nur unverschlüsselt per Browser, E-Mail, FTP oder ähnliches übertragt. Dann ist die Sicherheit eurer VPN-Verbindung, die ihr später einmal nutzen wollt, gegebenfalls bereits mitunter schon nicht mehr gewährleistet.

Benötigt wird für jeden Client die ca.cert. Weiterhin gibt es für jeden Client 2 Dateien die mit obigen Befehlen erstellt werden. In meinem Beispiel also die windowspc.crt und windowspc.key

Die Dateien liegen unter:

/etc/openvpn/easy-rsa/2.0/keys

 

11. OpenVPN Server Dateien kopieren 

Hinweis
Beachtet bitte die “server.crt”, “server.key”, “server.conf” und “windowspc.conf” hat bei euch gegebenenfalls einen anderen Namen. Je nachdem wie ihr euren Server bzw. Client einige Schritte zuvor genannt habt.

Zuerst wechseln wir ins openvpn Verzeichnis, wo unsere Zertifikate und Keys gespeichert sind:

root@vpn:/etc/openvpn/easy-rsa/2.0# cd /etc/openvpn/easy-rsa/2.0/keys

Nun kopieren wir die erstellten Serverkeys und Serverzertifikate

root@vpn:/etc/openvpn/easy-rsa/2.0/keys# cp ca.crt ca.key dh4096.pem server.crt server.key /etc/openvpn

Jetzt holen wir uns die Server Konfigurationsdateien

root@vpn:/etc/openvpn/easy-rsa/2.0/keys# cd /usr/share/doc/openvpn/examples/sample-config-files
root@vpn:/usr/share/doc/openvpn/examples/sample-config-files# gunzip -d server.conf.gz
root@vpn:/usr/share/doc/openvpn/examples/sample-config-files# cp server.conf /etc/openvpn/server.conf
root@vpn:/usr/share/doc/openvpn/examples/sample-config-files# cp client.conf ~/windowspc.conf

 

12. Server Konfiguration editieren 

Hinweis
In der “server.conf” muss kontrolliert werden ob die Bezeichnungen und Pfade für “ca”, “cert”, “key” und “dh” stimmen. Wenn der Server zum Beispiel anders genannt wurde, dann die Bezeichnungen an dieser Stelle einfach anpassen.
root@vpn:/usr/share/doc/openvpn/examples/sample-config-files# cd /etc/openvpn
root@vpn:/etc/openvpn# vi server.conf
# Any X509 key management system can be used.

# OpenVPN can also use a PKCS

#12 formatted key file

# (see “pkcs12” directive in man page).

ca ca.crt

cert server.crt

key server.key

# This file should be kept secret

# Diffie hellman parameters.

# Generate your own with:

# openssl dhparam -out dh1024.pem 1024

# Substitute 2048 for 1024 if you are using

# 2048 bit keys.

dh dh4096.pem

 

Möchte man zusätzlich noch das der Client auch auf das vLAN Netz hinter dem VPN Server zugegriffen werden kann (Client to Client), müssen folgende Zeilen in die “server.conf” eingefügt werden:

push “redirect-gateway def1 bypass-dhcp”

client-to-client

Zum konfigurieren bestimmter DNS Server einfach folgendes eintragen:

push “dhcp-option DNS 85.214.20.141”

push “dhcp-option DNS 8.8.8.8”

Man könnte auch weitere DNS Server eintragen. Ich nutze zum Beispiel einen DNS Server in meinem VPN Netzwerk. Damit ist es mir möglich Domains via Browser erreichbar zu machen die nur im VPN Netzwerk funktionieren und kein Geld kosten. Beispielsweise eine Domain wie vpn.netzwerk. Das hat nicht nur den Vorteil das man sich die Adressen leichter merken kann, sondern auch noch dass man für Entwicklungen keine zusätzlichen Domains kaufen muss.

Möchte man zusätzlich noch das heimische Netzwerk erreichbar machen, so fügt man einfach diese Zeile hinzu

push “route 192.168.0.0 255.255.255.0”

Die IP muss man natürlich an das heimische Netzwerk anpassen.

 Eine Verschlüsselung und Kompression sollte man natürlich einbauen aber Achtung, dies treibt die CPU Auslastung natürlich etwas in die Höhe!

cipher AES-128-CBC

comp-lzo

 

Das wären die wichtigsten Funktionen, es gibt natürlich noch viele Parameter mehr aber das wäre dann schon für spezielle Anwendungsbereiche.

 

13. Windows Client Datei für die Verbindung mit Server

Die Datei müssen wir natürlich auch editieren und mit unseren Daten Füttern.

Wichtig ist dabei nur dass die Pfade der ca.crt, windowspc.crt und windowspc.key stimmen, die IP Eures VPN Servers eingetragen ist und Ihr den Verschlüsselungsmechanismus eintragt.

In der Zeile “remote” bevorzuge ich persönlich eher Domain Namen. Da hat man weniger Probleme falls sich die IP mal ändern sollte. 

# to load balance between the servers.

remote 192.168.0.1 1194

# SSL/TLS parms.

# See the server config file for more

# description. It’s best to use

# a separate .crt/.key file pair

# for each client. A single ca

# file can be used for all clients.

ca ca.crt

cert windowspc.crt

key windowspc.key

cipher AES-128-CBC

 

14. Anpassungen am Host Server

Damit das alles auch so funktioniert müssen noch Anpassungen am Host System vorgenommen werden.

In der “sysctl.conf” muss das IPv4-Forwarden aktiviert werden. Dazu das Semikolon vor “net.ipv4.ip_forward=1″ entfernen und die Datei speichern.

Die Datei liegt in /etc/

root@vpn:~# vi /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4

net.ipv4.ip_forward=1

 

Nun müssen wir noch ein paar iptables Regeln anwenden.

Hinweis
Vor dem ausführen der Befehle mit “ifconfig” die eigenen Einstellungen und Netzwerkkarten Namen herausfinden und in den Befehlen entsprechend anpassen!! sonst funktionieren die Regeln nicht!

Hat man seinene Netzwerkkarten Bezeichnung mittels “ifconfig” herausgefunden, so muss man die einfach entsprechend in den Regeln ersetzen. Es kann also sein dass Ihr aus eth0 ein venet0 oder Ähnliches machen müsst.

Die Regeln, einzeln, einfach in die Konsole eingeben und Entern

 

iptables -A INPUT -i eth0 -m state –state NEW -p udp –dport 1194 -j ACCEPT 
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Wichtig!
Bei den iptables Regeln unbedingt darauf achten, dass an den Stellen

state --state NEW -p udp - -dport 1194
eth0 -m state --state RELATED
tun+ -m state --state RELATED

Zwei – Striche vor state und dport sind. Manche Browser machen aus diesen 2 – Zeichen ein längeres — Zeichen

Danke Jakob, ohne das Gespräch mit dir wäre mir das selbst so nie aufgefallen.

Sollten bei diesen Befehlen keinerlei Fehler auftauchen, speichert diese in die “rc.local” um die Befehle bei einem Restart des Server erneut auszuführen.

root@vpn:~# vi /etc/rc.local
 
# By default this script does nothing.

iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT 
iptables -A INPUT -i tun+ -j ACCEPT 
iptables -A FORWARD -i tun+ -j ACCEPT 
iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Nun kann OpenVPN neugestartet werden. Dazu einfach den Befehl ausführen:

root@vpn:~# /etc/init.d/openvpn restart

Sollte dabei kein Fehler erscheinen kann mit der Client Konfiguration fortgefahren werden. 

Erscheint bei Euch eine Fehlermeldung dann einfach die Schreibweise und Pfade in den Konfigurationen überprüfen, dort liegt oft der Fehler. Natürlich gebe ich gern Hilfe falls Ihr hängt. 

 

15. Windows Client Einrichtung

In ein paar Schritten zuvor, habt Ihr euch ja 4 Dateien runter geladen.

  • ca.cert
  • windowspc.cert
  • windowspc.key
  • windowspc.conf

Mit diesen Dateien macht Ihr einfach an dieser Stelle hier weiter:

Windows VPN Einrichtung

Den Artikel schrieb ich schon vor einer ganzen Weile mal ist aber nach wie vor aktuell.

 

16. Linux Client einrichten

Als erstes muss auch hier die OpenVPN Software installiert werden

root@vpn-client:~# apt-get install openvpn

Die 4 Dateien die Ihr runtergeladen habt, einfach in den Ordner

/etc/openvpn

kopieren und dann openvpn mittels 

root@vpn-client:~# openvpn –config windowspc.conf

neustarten.

Hinweis
Auch auf einem Linux Client muss entsprechend das TUN/TAP Device vorhanden sein!

 

17. Client unter OS X einrichten

Ladet euch die Software Tunnelblick herunter.  Öffnet und installiert die heruntergeladene Datei dann bei euch so wie im Prinzip jedes andere Programm. Im Anschluss wird ein Abfragefenster angezeigt bei dem man auf “Open configuration folder” klickt. In das sich daraufhin öffnende Fenster kopiert man die 4 Dateien hinein. Jetzt Tunnelblick aus dem Programmordner heraus starten und eine Verbindung mit dem OpenVPN-Server herstellen.

 

18. Client unter iOS einrichten

Benennt die Datei “windowspc.conf” in “windowspc.ovpn” um.

Ladet euch die OpenVPN App für iOS auf euer iPhone, iPad oder iPod touch.

Startet dann die App und klickt rechts oben auf den Button “Help”. Ihr seht dann dort eine Vielzahl an Möglichkeiten eure OpenVPN-Verbindung damit einzurichten.

Mein persönlicher Favorit ist der: schließt euer iPhone, iPad oder iPod touch an euren PC/Mac an, startet iTunes, wählt euer Gerät unter “GERÄTE links im Menü aus, klickt dann auf “Apps”, scrollt runter zum Abschnitt “Dateifreigabe”, klickt die App “OpenVPN” an und dann rechts auf “Hinzufügen…” und wählt nun die 4 Dateien zum Hochladen in die App aus.

Nachdem ihr das gemacht habt startet ihr die OpenVPN App für iOS auf eurem iPhone, iPad oder iPod touch und richtet euch ein Profil mit diesen Dateien ein.  Wenn ihr innerhalb der App dann den Schalter unterhalb von “Disconnected” umschaltet wird eine Verbindung zu eurem OpenVPN-Server hergestellt.

 

19. Client unter Android einrichten

Benennt die Datei “windowspc.conf” in “windowspc.ovpn” um.

Nun ladet Euch die OpenVPN App für Android auf das Android Gerät. Kopiert anschließend die 4 Dateien auf das Android Gerät und startet die OpenVPN App für Android. Klickt darin unten rechts auf das Ordnersymbol um die windowspc.ovpn Konfiguration für euren OpenVPN-Server auszuwählen. Im Anschluss werden einige Hinweise angezeigt die man in der Regel nicht zu beachten braucht es reicht dann auf das Diskettensymbol unten rechts zu klicken um den Import abzuschließen.

Im Hauptmenü sollte dann die Verbindung erscheinen die man mit einem Klick darauf starten kann.

 

Zum Schluss:

Es gibt einige gute Anleitungen auch im Netz aber mir fiel keine auf in der wirklich mal alles zusammen geschrieben wurde.

Ich hoffe die Anleitung ist Euch eine Hilfe und Ihr spart ein wenig Zeit und kommt damit ans Ziel!

 

LG

Share it!Share on FacebookEmail this to someoneShare on Google+Tweet about this on Twitter

15 Gedanken zu “Anleitung: openVPN Server auf Debian 7.8 installieren und anschließend mit Android, iOS oder Windows verbinden

  1. Vielen Dank für diese Anleitung!

    Ich habe OpenVPN auf einem Vserver mit Debian installiert und möchte vom Client aus
    jeglichen Internet Verkehr über das VPN zum VServer leiten und von dort in das Internet gehen.

    Die Verbindung klappt auch, jedoch wird kein DNS gefunden, bzw. ich kann nur den Apache2
    auf dem Vserver aufrufen bzw. dessen Seiten.
    Meine Iptables konfiguratiion habe ich auf venet0 geändert (Vserver).
    Hast du einen Tip zum Einlesen wie ich das Konfigurieren muß?

    viele Grüße
    Roland

    • Hi Roland,

      freut mich wenn es dir geholfen hat 🙂

      Ich würde mal vermuten, dass deine IP Tables nicht passen.
      Hast du den Masquerade Eintrag angelegt? Klingt im ersten Moment als würde dieser fehlen (Die Tatsache dass dieser Kommentar mit einer 10.8.0.XX IP erstellt wurde würde das bestätigen)

      iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE

      Wie sieht denn die Server Config im Details aus?

      Wie sieht denn deine client Config aus? und welches Betriebssystem verwendest du auf dem Client?
      Kannst du einen MTR bei verbundenem VPN auf google.de machen und Posten?

      Hat der Server eine funktionierende Internetverbindung?
      Führst du Openvpn als Admin aus?

      LG
      André

  2. Vielen Dank für dieses tolle tut.
    ich hätte mal eine eine Frage bezüglich ipv6. Ich habe natürlich einen eigenen vps und zuhause einen Kabel Deutschland Anschluss mit dual stack echte ipv4 und echte ipv6. Wie verhält sich nun der vpn server wechselt der nur die ipv4 und die echte ipv6 kommt trotzdem weiter durch oder blockiert die ipv6 der openvpn server? Man könnte natürlich auch am heimischen PC ipv6 blockieren aber leider geht das nicht direkt in der fritzbox da vodafone ihre Krüppel Firmware auf die Boxen installiert.

    • Hi,
      gerne und danke für das Feedback!
      Mir ist noch nicht ganz klar was dein Ziel ist? Wenn du mit dem VPN verbunden bist, hast du die IPv4/6 vom VPN Server und wenn du getrennt bist die IPv4/6 deines DSL Anschlusses.
      Wenn du mit dem VPN verbunden bist, sieht niemand deine echte IP sondern nur die IP’s vom Server.

  3. Könntest du noch eine Erklärung für die iptables-Regeln einfügen?
    Ich lese diese im Zusammehang mit OpenVPN immer wieder, aber verstehe nicht recht, was diese bedeuten.

    Ich habe erfolgreich 2 Standorte mittels OpenVPN über einen VServer vernetzt. Ich kann die anderen Standorte voll erreichen.
    Nun möchte ich aber auch, dass eine Anwendung (FHEM) über dieses VPN auf ein Client-Netz Zugriff bekommt.
    Nicht mal Pings gehen durch. Woran könnte das liegen?

    • Hi Heiko,
      die iptables Regeln sind eigentlich selbstredend. Es erlaubt die Verbindungen zum VPN Server und Maskiert das interne VPN Netzwerk mit der externen Server IP.

      Wo läuft denn “FHEM” ? Hat diese Maschine eine VPN Verbindung? bzw. kennt diese die Routen ins VPN Netzwerk? Sind beiden VPN Clients die in den Standorten laufen, die Netzwerke hinter dem Client bekannt?
      Was sagt denn ein Traceroute?

  4. Am besten stelle ich mal alles dar inkl. config-Dateien.
    Ich hoffe, dass es übersichtlich bleibt, diese Kommentarfunktion bietet leider keine -Tags und dergleichen.

    Standort 1: 192.168.178.0/24
    Standort 1: 192.168.179.0/24
    Vserver als OpenVPN-Relay: 11.22.33.44 (IP ist fiktiv)

    Was funktioniert:
    =================
    Verbindung von Standort 1 & 2 über VServer.
    Es funktioniert Ping und SMB von allen PCs zu allen PCs in beiden Subnetzen, da ich in den jeweiligen Fritzboxen die VPN-Raspis als statische Route für das jeweils andere Subnetz konfiguriert habe.
    Hierzu musste ich übrigens folgende iptable-Rules setzen - aber leider verstehe ich nicht was da genau passiert:
    Standort 1: iptables -t nat -A POSTROUTING -d 192.168.178.0/24 -j MASQUERADE
    Standort 2: iptables -t nat -A POSTROUTING -d 192.168.179.0/24 -j MASQUERADE

    Was funktioniert nicht:
    =======================
    Vom Vserver (eingeloggt über SSH als root) zu Standort 1 oder 2 pingen etc.

    Was soll zukünftig funktionieren?
    =================================
    Auf dem VServer läuft auch ein FHEM als Slave, der zu einem FHEM am Standort 1 über einen Telnet-Port in FHEM verbinden soll.
    Bislang mache ich das über eine externe Portfreigabe an Standort 1 über das Internet.
    Da ich nun aber eine funktionierende VPN-Verbindung habe, dachte ich, wozu über das Internet gehen und einen zusätzlichen Port offen halten, wenn es doch auch über den VPN-Tunnel funktionieren müsste.

    Bevor ich die beiden Standorte über meinen Vserver verbunden habe, habe ich mich auch von einem Handy zum VServer über OpenVPN verbunden und konnte über die IP des Servers surfen.
    Das funktioniert nun ebenfalls nicht mehr und ich habe es auch nicht mehr hinbekommen.
    Was müsste ich einstellen, damit das wieder funktioniert?

    Server.conf:
    ============
    port 1194
    proto udp
    dev tun
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/server.crt
    key /etc/openvpn/server.key # This file should be kept secret
    dh /etc/openvpn/dh1024.pem
    server 10.8.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    keepalive 10 120
    cipher AES-128-CBC # AES
    comp-lzo
    persist-key
    persist-tun
    status openvpn-status.log
    verb 3
    #Zertifikate zurueckrufen
    crl-verify ./easy-rsa/2.0/keys/crl.pem
    client-to-client
    client-config-dir ccd
    push "route 192.168.178.0 255.255.255.0"
    push "route 192.168.179.0 255.255.255.0"

    ccd für Standort 1:
    ===================
    # Set a static IP address for the Router's client connection (to OpenVPN)
    ifconfig-push 10.8.0.200 255.255.255.0
    # Set the internal IP range for this network.
    iroute 192.168.178.0 255.255.255.0

    ccd für Standort 2:
    ===================
    # Set a static IP address for the Router's client connection (to OpenVPN)
    ifconfig-push 10.8.0.204 255.255.255.0
    # Set the internal IP range for this network.
    iroute 192.168.179.0 255.255.255.0

    Standort1.conf
    ==============
    client
    dev tun
    proto udp
    remote 11.22.33.44 1194
    log-append /var/log/openvpn.log
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert fhem.crt
    key fhem.key
    comp-lzo
    cipher AES-128-CBC

    Standort2.conf
    ==============
    client
    dev tun
    proto udp
    remote 11.22.33.44 1194
    log-append /var/log/openvpn.log
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert raspmue2.crt
    key raspmue2.key
    verb 3
    comp-lzo
    cipher AES-128-CBC

  5. Hi Heiko,

    “Hierzu musste ich übrigens folgende iptable-Rules setzen – aber leider verstehe ich nicht was da genau passiert:
    Standort 1: iptables -t nat -A POSTROUTING -d 192.168.178.0/24 -j MASQUERADE
    Standort 2: iptables -t nat -A POSTROUTING -d 192.168.179.0/24 -j MASQUERADE”
    Das maskiert den Traffic deiner Subnetze auf die IP der Fritzbox / VPN Clients. Diese Regeln sollten jedoch eigentlich nicht notwendig sein.

    “Was funktioniert nicht:
    =======================
    Vom Vserver (eingeloggt über SSH als root) zu Standort 1 oder 2 pingen etc.”

    Kennt dein VPN Server die Routen der Standorte? Wenn du die 10.8.0.204 oder 10.8.0.200 anpingst sollte das auch klappen.
    Wenn du die 192.168.179.3 anpingst und es keine Route für diese IP gibt dann nimmt er das Public Gateway und das ist natürlich falsch.

    Was sagt denn nun ein Traceroute und was sind die Routen am Server?

    Zu deinem Handyproblem, welche config wird da eingesetzt? Hier fehlt vermutlich die “redirect-gateway” Option in der Client config denn ohne die wird auch nur der Traffic ins VPN geroutet dessen Ziel auch im VPN liegt und nicht generell alles durchs VPN gejagt. Das sollte aus Securitygründen aber vermutlich das Ziel sein.

    • Erstmal vielen Dank für deine kompetente Hilfe bis jetzt!
      Ich bin jetzt zuversichtlich, dass ich doch noch alles so hinbekomme ich wie ich es vorstelle.

      Handy-Problem:
      ==========
      Handy-Problem konnte ich lösen durch eine Datei im ccd-Verzeichnis mit dem Namen des Handy-Zertifikats und folgendem Inhalt:
      push “redirect-gateway def1”

      Fügt man fälschlicherweise diese Zeile in die server.conf ein, war mein Apache2 am Standort 1, der auf dem OpenVPN-Raspi für die Standortvernetzung mitläuft, nicht mehr erreichbar. Wahrscheinlich deshalb, weil dadurch ja der gesamte IP-Traffic von diesem Raspi über meinen VServer geschoben wurde…
      In der ccd-Datei bekommt nur das Handy den Befehl, den gesamten IP-Traffic über den VServer zu scheusen.

      Routing-Problem
      ==========

      Ping als root auf VServer zu 10.8.0.204 oder 10.8.0.200 ist erfolgreich.
      traceroute auf 192.168.178.1 hört schon nach dem 1. Schritt auf.

      route -n auf dem VServer liefert:
      Kernel IP routing table
      Destination Gateway Genmask Flags Metric Ref Use Iface
      10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
      10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
      0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
      Daran wird es wahrscheinlich liegen – mein VServer kennt keine Route zu 192.168.178.0/24
      Mit welchem Befehl kann ich diese temporär (zum Testen) und permanent (für den Regelbetrieb) auf dem VServer hinzufügen?

      Ich dachte bislang, dass OpenVPN diese Route automatisch hinzufügt. Am Standort 1 ist dies nämlich der Fall, dort sehen die Routen so aus:
      root@fhem:~# route -n
      Kernel IP routing table
      Destination Gateway Genmask Flags Metric Ref Use Iface
      0.0.0.0 192.168.178.1 0.0.0.0 UG 202 0 0 eth0
      10.8.0.0 255.255.255.0 255.255.255.0 UG 0 0 0 tun0
      192.168.178.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
      192.168.179.0 255.255.255.0 255.255.255.0 UG 0 0 0 tun0
      255.255.255.0 0.0.0.0 255.255.255.255 UH 0 0 0 tun0

      ifconfig auf dem VServer liefert:
      (die externe IP ist bei venet0:0)
      root@www:~# ifconfig
      lo Link encap:Local Loopback
      inet addr:127.0.0.1 Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING MTU:65536 Metric:1
      RX packets:1672868 errors:0 dropped:0 overruns:0 frame:0
      TX packets:1672868 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:185507387 (176.9 MiB) TX bytes:185507387 (176.9 MiB)

      tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
      inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
      UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
      RX packets:3940 errors:0 dropped:0 overruns:0 frame:0
      TX packets:4035 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100
      RX bytes:732792 (715.6 KiB) TX bytes:2990075 (2.8 MiB)

      venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
      inet addr:127.0.0.2 P-t-P:127.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
      RX packets:218223 errors:0 dropped:0 overruns:0 frame:0
      TX packets:199462 errors:0 dropped:2 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:112791383 (107.5 MiB) TX bytes:54531605 (52.0 MiB)

      venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
      inet addr:11.22.33.44 P-t-P:11.22.33.44 Bcast:11.22.33.44 Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1

      Iptables-Problem:
      ===========
      Bei mir hat es ohne die Maskierung nicht funktioniert, d.h. ich konnte dann nur die beiden OpenVPN-Raspis untereinander anpingen, aber nicht die PCs im Subnetz dahinter. Man findet diesen Hinweis übrigens auch in Tutorials im Netz, z.B. hier im Kommentar von Helmut:
      (falls Links in den Kommentaren nicht erlaubt sind bitte löschen)
      https://blog.unterhaltungsbox.com/openvpn-2-netzwerke-miteinander-verbinden/

      In diesem Kommentar erfolgt die Maskierung allerdings immer mit dem Subnetz des jeweils anderen Standorts.
      Bei mir hat das nicht funktioniert – ich musste die Maskierung immer mit dem Subnetz des jeweiligen OpenVPN-Raspis durchführen.
      Also auf dem Raspi mit der IP 192.168.178.230
      musste ich eingeben:
      iptables -t nat -A POSTROUTING -d 192.168.178.0/24 -j MASQUERADE

      Ein Sicherheitsproblem habe ich dadurch vermutlich nicht, aber wie könnte ich es besser machen?
      Bzw. wie macht man es korrekt?

  6. Hi Heiko,

    zu deinem Handyproblem. Du hättest auch einfach in der Config Datei des Handys diese Option konfigurieren können aber das ist ja nun gelöst.

    Zum Routing, wenn der Server die Routen nicht kennt dann kann da auch nix funktionieren. Standort 1 und Standort2 kennt die Routen nur weil sie in der OpenVPN Server Config eingetragen sind.
    /sbin/ip route add 192.168.178.0/24 dev tun0
    /sbin/ip route add 192.168.179.0/24 dev tun0

    Damit hast du auf dem vServer die Routen komplett.
    Dann sollte es in der Theorie auch funktionieren.

  7. Danke, das hat funktioniert.
    Die Routen sind nach einem Reboot des Vservers weg, aber ich habe beide Befehle einfach in /etc/rc.local eingefügt, dann werden diese bei jedem Reboot des VServers automatisch ausgeführt.

    Stimmt, in die Config des Handys hätte ich diesen Befehl auch einfügen können.

    Hast du eine Erklärung, weshalb ich am Raspi des jeweiligen Standorts das lokale Subnetz noch maskieren muss?
    Du schreibst ja, dass dies normalerweise nicht notwendig sei.

    • Hi Heiko,

      ich persönlich würde es eher in die VPN config eintragen um die Routen bei jedem Booten zu setzen.
      Die rc.local ist eher ungeeignet da diese ggf. ausgeführt wird obwohl die interfaces noch offline sind.

      in der VPN server.conf folgendes eintragen
      up /pfad/zum/up-schript.sh
      down /pfad/zum/down-script.sh

      Eventuell musst du noch
      script-security 2
      einfügen.

      In das up-script.sh dann folgendes eintragen
      #! /bin/bash
      /sbin/ip route add 192.168.178.0/24 dev tun0
      /sbin/ip route add 192.168.179.0/24 dev tun0

      Und in down-script.sh
      #! /bin/bash
      /sbin/ip route del 192.168.178.0/24 dev tun0
      /sbin/ip route del 192.168.179.0/24 dev tun0

      Die Dateien sollten natürlich ausführbar sein. Also ein chmod +x oder chmod 777 hilft hierbei.

      Eine Erklärung wieso du bei dir maskieren musst kann ich dir nicht geben. Ich habe auch gerade mal die Routings und Firewall Regeln in meinem Router gecheckt, dort wird nichts maskiert und ich komme aus meinem Heimnetz dennoch auf die einzelnen VPN Maschinen und auch andersrum zurück.
      Wenn es bei dir jedoch funktioniert dann sollte das fine sein. Durchaus möglich das Lede / OpenWRT hier etwas eigenständig getan hat was ich so auf die schnelle nicht gefunden habe.

  8. So funktioniert es jetzt stabil. Vielen Dank für den Tipp.
    Auch mein Problem mit der instabilen Telnet-Verbindung von FHEM durch den OpenVPN-Tunnel scheint sich jetzt behoben zu haben.

    Warum setzt eigentlich der OpenVPN-Client die Routen gleich automatisch mit, aber der Server nicht?
    Wäre doch komfortabel, wenn der auch die Routen automatisch setzen würde…

    • Hi Heiko,

      sehr gut. Dann läufts ja nun 🙂
      OpenVPN darf die Routen gar nicht automatisch setzen denn das könnte durchaus Chaos hinterlassen und ich würde es dann ganz sicher nicht mehr einsetzen. Weiterhin könnte das dazuführen, dass der Server sich selbst aus dem Netz aussperrt oder andere Routen überschrieben werden.
      Ich würde auch stark davon abraten auf dem VPN Server irgendwelche anderen Applikationen laufen zu lassen.
      Abhängig von der Ausstattung des Servers ist dieser mit dem VPN Traffic schon beschäftigt genug. Man darf hier nicht vergessen, dass die Verschlüsselung / Routing usw. die CPU stark beanspruchen können. Wenn dann nun noch eine Applikation hinzukommt, könnte eins von beiden auf der Strecke bleiben. Das könnte sich dann durch ein langsames VPN / langsame Applikationen auswirken. Je nachdem wie viele Clients da dran hängen würde ich eher empfehlen deine Applikationen auszulagern.
      Mein VPN Server hat ca 170 Clients und ist mit 8GB Ram und 4×3,6Ghz CPU ausgestattet.Aber andere Sachen würde ich da nie drauf laufen lassen. In Peak Zeiten wo viele Clients miteinander reden etc. hat der Server einen Load von 2-3. Das ist für ein VPN schon recht ordentlich.
      Virtualisierung ist hier das Stichwort. Lieber viele kleine unabhängige Maschinen die miteinander reden als ein Server der sich selbst ausbremst.
      Was hindert dich daran FHEM auf einer virtuellen Kiste oder alten Rechner laufen zu lassen der ein eigener VPN Client ist und somit für alle anderen ne feste VPN IP hat?

Schreibe einen Kommentar