Seinen Internetverkehr durch ein VPN zu verschlüsseln macht in vielen Situationen Sinn. Zum einen ermöglicht in VPN einem den Zugriff auf ein entferntes Netzwerk, außerdem lassen sich darüber auch die eigenen Daten sicher über das Internet übertragen wenn man sich z. B. in einem unsicheren WLAN in einem Hotel oder einem Café befindet. Ohne Nutzung eines VPN in einem öffentlichen Netzwerk, besteht die Gefahr, dass andere User dieses Netzwerks den eigenen Internetverkehr mitlesen können. Auf jeden Fall aber kann der Betreiber des Netzwerks (also z.B. das Hotel) den eigenen Internetverkehr mitlesen, sofern dieser nicht verschlüsselt ist. Durch Nutzung eines VPN kann man dies verhindern.

Wenn man einen kommerziellen VPN-Anbieter nutzt, hat man wiederum das Problem, dass der komplette Internetverkehr über dessen Server läuft. Damit verhindert man zwar das Mitnutzer des WLANs den eigenen Internetverkehr mitlesen können, anstatt dem Hotel hat nun aber der VPN-Anbieter potentiell die Möglichkeit hierzu.

Daher macht es Sinn, einen VPN-Server selbst zu betreiben.

Selbst viele günstige virtuelle Server eignen sich schon für diesen Zweck. Mit Ubuntu und OpenVPN lässt sich ein solches virtuelles privates Netzwerk zudem sehr einfach einrichten.

Als erstes müssen folgende Pakete installiert werden:

# sudo apt-get install openvpn easy-rsa

Um alle nachfolgenden Befehle ausführen zu können wechseln wir als erstes zu root

# sudo -i

Anschliessend werden die Beispielskripte von easy-rsa zur Schlüsselerzeugung in das Openvpnverzeichnis kopiert und dort der Ordner Keys erstellt.

# cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
# mkdir keys

Damit Openvpn weiß welche Konfigurationsdatei es verwenden soll kopieren wir die aktuellste (derzeit openssl-1.0.0.cnf) nach openssl.cnf

# cp openssl-1.0.0.cnf openssl.cnf

Schlüssel und Zertifikate erstellen

Nun passen wir die Standardwerte mit welchen die Zertifikate erstellt werden in der vars Datei an

# nano vars

dort passen wir folgende Einträge an:

# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048

# 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="BW"
export KEY_CITY="MEINESTADT"
export KEY_ORG="MEINEORGANISATION"
export KEY_EMAIL="name@example.com"
export KEY_OU="MEINEABTEILUNG"
export KEY_ALTNAMES="MEINVPN"

# X509 Subject Field
export KEY_NAME="MEINVPN"

# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below
# You will also need to make sure your OpenVPN server config has the duplicate-cn option set
export KEY_CN="meinedomain.de"

Dabei ist darauf zu achten, dass die Zeile export KEY_ALTNAMES=“Irgendwas“ neu eingefügt werden muss und vor der Zeile export KEY_CN=“meinedomain.de“ das # entfernt wird. Sonst kommt es zu einer Fehlermeldung wie: pre139989368059552:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198/pre
Damit OpenVPN die gerade geänderten Variablen bei der Erstellung der Zertifikate verwendet müssen diese in die aktuellen Umgebungsvariablen aufgenommen werden.

# source ./vars

Nun können wir die CA (certificate authority) erstellen, mit welcher anschließend das Server- und die Clientzertifikate signiert werden

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
..................................................+++
............+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:
State or Province Name (full name) [BW]:
Locality Name (eg, city) [Meinestadt]:
Organization Name (eg, company) [Meineorganisation]:
Organizational Unit Name (eg, section) [Meineabteilung]:
Common Name (eg, your name or your server's hostname) [meinedomain.de]:
Name [Meinvpn]:
Email Address [name@example.com]:

Die Werte in den eckigen Klammern werden aus der vars Datei übernommen und können einfach mit Enter bestätigt werden.

Jetzt erstellen wir noch die Diffie-Hellman Parameter [Wikipedia: Diffie-Hellman-Schlüsselaustausch], die es erlauben Schlüssel sicher über unsichere Kanäle zu übertragen.

# ./build-dh

Jetzt können wir das Zertifikat und den Schlüssel für den Server erstellen. Hier ist nochmal darauf zu achten dass der „Common Name“ dem Hostnamen des Servers entspricht, i.d.R. etwas wie meinedomain.de. Die Abfrage nach einem Passwort wird mit Enter übersprungen. Die Abfragen am Ende zweimal mit „y“ bestätigen.

# ./build-key-server meinedomain.de
Generating a 2048 bit RSA private key
.....+++
.+++
writing new private key to 'meinedomain.de.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:
State or Province Name (full name) [BW]:
Locality Name (eg, city) [Meinestadt]:
Organization Name (eg, company) [Meineorganisation]:
Organizational Unit Name (eg, section) [Meineabteilung]:
Common Name (eg, your name or your server's hostname) [meinedomain.de]:
Name [Meinvpn]:
Email Address [name@example.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'DE'
stateOrProvinceName   :PRINTABLE:'BW'
localityName          :PRINTABLE:'Meinestadt'
organizationName      :PRINTABLE:'Meineorganisation'
organizationalUnitName:PRINTABLE:'Meineabteilung'
commonName            :PRINTABLE:'meinedomain.de'
name                  :PRINTABLE:'Meinvpn'
emailAddress          :IA5STRING:'name@example.com'
Certificate is to be certified until Feb 26 09:46:13 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Jetzt können die Zertifikate für die Clients erstellt werden. Dies funktioniert im Prinzip genauso, jedoch muss bei „Common Name“ der Name des Clients eingegeben werden und nicht der Name (bzw. die Domain) des Servers. Wird hier ein Passwort vergeben muss dieses bei jeder neuen Verbinidung zum Server neu eingegeben werden. Dies schafft zusätzliche Sicherheit reduziert jedoch den Komfort erheblich. Falls jemand den Schlüssel des Clients entwendet muss er zusätzlich das Passwort kennen um sich mit dem Server verbinden zu können.

# ./build-key clientname1
# ./build-key clientname2
# ./build-key clientname3

usw.

Die Zertifikate und Schlüssel für den Server und die Clients sind nun unter /etc/openvpn/easy-rsa/keys gespeichert.
Nun können die Schlüssel auf die entsprechenden Computer transferiert werden. Aus Sicherheitsgründen sollten auf jedem Computer nur die benötigten Dateien zu finden sein.
Der Server benötigt die meinedomain.de.key meinedomain.de.crt, die ca.crt sowie dh2048.pem. Die Datei ca.key sollte an einem sicheren Ort aufbewahrt und vom Server gelöscht werden, da mit ihr neue Zertifikate für weitere Clients erstellt werden können.

Die Clients benötigen die clientname1.key clientname1.crt sowie die ca.crt.

OpenVPN Server konfigurieren

Als erstes erstellen wir den User „openvpn“ welcher den Server ausführt

# addgroup --system --no-create-home --disabled-login --group openvpn
# adduser --system --no-create-home --disabled-login --ingroup openvpn openvpn

Dann legen wir die openvpn Konfigurationsdatei unter /etc/openvpn/meinserver.conf an

# nano /etc/openvpn/meinserver.conf

In die Datei werden folgende Werte eingetragen:

port 1194
proto udp
dev tun
ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/meinedomain.de.crt
key easy-rsa/keys/meinedomain.de.key
dh easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "topology subnet"
topology subnet
route 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 3

Jetzt kann der Openvpn Server neugestartet werden

# service openvpn restart

Angepasst werden müssen nur die Namen der Schlüssel und Zertifikate. Die „Push“ Optionen sind nur nötig wenn man alle Verbindungen des clients durch den Server tunneln möchte (z.B. um seinen Traffic in einem unsichern WLAN zu verschlüsseln). Wenn  man nur Zugriff auf den Server möchte sind diese nicht nötig.

Damit der Traffic der Clients über das VPN geroutet wird und diese nicht nur Zugriff auf das 10.8.0.0 Netzwerk haben müssen noch die entsprechenden regeln für Iptables angelegt werden. Damit die Regeln auch nach einem Neustart des Rechnes noch erhalten bleiben werden diese in die /etc/rc.local geschrieben. Die Regeln werden erst nach einem reboot aktiv

# nano /etc/rc.local

und fügen folgende Zeilen ein:

sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Nach einem Reboot des Rechners ist der Openvpn Server einsatzbereit.
Bitte beachten dass diese Konfiguration nur für Verbindungen über IPv4 funktioniert. Wenn ihr in einem Netzwerk seid welches zusätzliche eine IPv6 Adresse zur Verfügung stellt, werden Verbindungen über IPv6 nicht über das VPN geroutet. Es empfiehlt sich daher die IPv6 Verbindung für die Dauer des Aufenthalts im Café zu deaktivieren. Ob ihr auch per v6 verbunden seid zeigt der Befehl ifconfig, oder ein Besuch auf wieistmeineip.de. Wenn ich Zeit finde werde ich mich mit diesem Problem befassen und den Artikel entsprechend aktualisieren.

Weiterführende Artikel

OpenVPN Client unter Android einrichten

OpenVPN Client unter Windows einrichten

OpenVPN Client unter Ubuntu (Desktop) einrichten


Dieser Artikel ist lizenziert unter einer Creative Commons Namensnennung 3.0 Deutschland Lizenz.

7 Comments

  1. Hallo 😉
    Super Anleitung, danke schonmal dafür .Die Verbindung steht nun, allerdings funktionieren nur ein paar websites und bestimmte ports scheinen geschlossen.
    Was kann man hier tun? z.B. alle ports und jeglichen traffic über die vpn schalten und den dhcp server und router des servers entscheiden lassen, welche ports etc offen sein sollen.

    Grüße

  2. Hallo!
    Tolle Anleitung, ich möchte das gerne mal probieren. Nur kapier ich nicht, was bei dem Parameter mit „meinedomain.de“ gemeint ist, was muss ich da eintragen? Muss ich erst eine Domäne reservieren/kaufen?

    • Niko

      Nein, du brauchst nicht zwingend eine eigene Domain nur um das VPN zu nutzen. Ich finde es nur praktischer. Du kannst auch einfach den Hostname deines Computers oder einen anderen Name verwenden.

  3. Hallo Niko, vielen Dank für die prompte Antwort!
    Bin jetzt unverschämt und habe schon die nächste Frage: ich kann die erzeugten und für den Client erforderlichen Keys mit ssh nicht transferieren, „permission denied“.
    Hab schon geguglt was ich tun könnte, bin aber nicht fündig geworden. Danke für deine Hilfe! Erwin

    • Niko

      Ich bin nicht sicher ob ich das Problem richtig verstehe. Du möchtest die Keys für die Clients vom Server zum Client übertragen, via scp oder ssh-copy-id oder sowas? Wann kommt die Fehlermeldung? Möglicherweise hast du gar keinen Zugriff via SSH auf den Client, oder dir fehlen die Schreibrechte im aktuellen Ordner.

  4. Es geht um diese Textpassage: „Die Zertifikate und Schlüssel für den Server und die Clients sind nun unter /etc/openvpn/easy-rsa/keys gespeichert.
    Nun können die Schlüssel auf die entsprechenden Computer transferiert werden. “
    …“Die Clients benötigen die clientname1.key clientname1.crt sowie die ca.crt.“
    Vereinfache die Frage: wie kopiere ich die vom Server auf den Client? (mit ssh vom Client aus habichs probiert, da kommt das permission denied)

  5. Habs hinbekommen! Die crt-Dateien konnte ich via Filezilla herunterziehen. Die key-Datei meckerte den permission denied, der hab ich dann kurzfristig ein chmod 777 verpasst, dann ging die auch mit Filezilla. Nun gehts weiter mit dem nächsten Schritt.