Einfache OpenVPN Einrichtung

Ziel ist es via VPN untereinander auf verschiedene unverschlüsselte Dienste (FTP, NFS) zugreifen zu können.

Die ursprünglichen Netzwerkeinstellungen sollen davon nicht betroffen werden. Erweiterte Dienste, wie die automatische Netzwerkkonfiguration via DHCP wird im ersten Schritt nicht berücksichtigt, folgende Schritte sind eher als quick & dirty zu verstehen!


OpenVPN installieren

Die Installation von OpenVPN ist unter verschiedenen Betriebssystemen möglich und recht unspektakulär. Im folgenden Beispiel soll ein dedizierter Server mit fester IP, der bei einem Hoster gemietet wurde, ein zweiter dedizierter Rechner sowie zwei Arbeitsplatzrechner und ein Notebook über VPN verbunden werden.

Damit überhaupt verschlüsselter Datenverkehr möglich ist, werden für alle beteiligten Rechner Zertifikate, die mit OpenSSL erstellt werden, benötigt.


Zertifikate mit OpenSSL

Die Zertifikate können prinzipiell in einem beliebigen Verzeichnis erstellt werden. Standardverzeichnisse können sein:

  • /usr/local/ssl
  • /usr/local/etc/ssl
  • /usr/share/ssl
  • /etc/ssl

Da die Zertifikate fürs VPN benutzt werden sollen, dient für dieses Beispiel das Verzeichnis /usr/local/etc/openvpn/certs


Erzeugen eines Schlüsselpaars für die eigene Certificate Authority (CA)

  1. openssl genrsa -aes256 -out vpn-cakey.pem 2048

Der Schlüssel besitzt mit 2048 Bit eine sinnvolle Verschlüsselung. Für eine stärkere können die Werte 4096 oder 8192 verwendet werden. Für den normalen Einsatz sollte sogar ein 1024 Bit Schlüssel ausreichen. Das Passwort sollte möglichst sicher sein. Es wird dazu benötigt, die späteren Zertifikate für die Clients zu signieren. Nach Ausführung sollte ein ähnlicher Output wie folgt zu sehen sein:

  1. Generating RSA private key, 2048 bit long modulus
  2. ...............................................................+++
  3. ...........................+++
  4. e is 65537 (0x10001)
  5. Enter pass phrase for vpn-cakey.pem:
  6. Verifying - Enter pass phrase for vpn-cakey.pem:

Es sollten sofort die öffentlichen Rechte entzogen werden:

  1. chmod 0600 vpn-ca.pem

Zu dem privaten Schlüssel wird nun der öffentliche Schlüssel erzeugt:

  1. openssl req -new -x509 -days 3650 -key vpn-cakey.pem -out vpn-ca.pem -set_serial 1

Hier werden nun die üblichen Abfragen zur Herkunft des Schlüssel-Erstellers gestellt.

Zum Schluss werden zwei Dateien erstellt, die für interne Zwecke nötig sind. Mit ihnen wird gewährleistet, dass kein Schlüssel doppelt vergeben wird:

  1. touch index.txt
  2. echo "01" > serial

Schlüsselpaar für den VPN-Server

  1. openssl req -new -newkey rsa:1024 -out servercsr.pem -nodes -keyout serverkey.pem -days 3650

Das Zertifikat soll 10 Jahre (3650 Tage) gültig sein. Bei der Erstellung werden erneut die Herkunftsdaten abgefragt. An der Stelle Common Name (eg, YOUR name) sollte der volle Hostname des Servers eingetragen werden. Dieser wird später in jeder Client-Konfiguration benötigt. Soll der VPN-Dienst später automatisch starten, so darf an dieser Stelle keine Passwort-Phrase eingegeben werden. Beide Schritte einfach mit überspringen.

Es wird ein privater Schlüssel (serverkey.pem) und ein Certificate Signing Request (servercsr.pem) für die Anforderung eines Zertifikats erstellt. Das endgültige Zertifikat erhält man mit der unter Schritt 1 erstellten Certificate Authority, dessen Kennwort selbstverständlich benötigt wird:

  1. openssl x509 -req -in servercsr.pem -out servercert.pem -CA vpn-ca.pem -CAkey vpn-cakey.pem -CAserial serial -days 3650

Für jeden Client ein eigenes Zertifikat

Analog zum Server muss für jeden Client - selbstverständlich unter einem anderen Namen - ein eigenes Zertifikat erzeugt werden:

  1. name=client1
  2.  
  3. openssl req -new -newkey rsa:1024 -out $name\_csr.pem -nodes -keyout $name\_key.pem -days 3650
  4.  
  5. openssl x509 -req -in $name\_csr.pem -out $name\_cert.pem -CA vpn-ca.pem -CAkey vpn-cakey.pem -CAserial serial -days 3650

Auch hier gilt: Soll der VPN-Dienst später automatisch gestartet werden, so dürfen keine Passwörter eingegeben werden.


Diffie-Hellmann Parameter erzeugen

Als letzter Schritt werden die Diffie-Hellmann Parameter erzeugt:

  1. openssl dhparam -out dh1024.pem 1024

OpenVPN-Server

Ob eine Rechner als Server oder Client fungiert, ist nur von der Konfiguration abhängig. Für den Server ist mindestens folgende Konfiguration notwendig, die im Standard-VPN Verzeichnis (von der Distribution abhängig, im Beispiel ist dies die Datei /usr/local/etc/openvpn/server.conf) stehen sollte:

  1. proto udp
  2. mode server
  3. dev tap
  4. ifconfig 192.168.100.2 255.255.255.0
  5. tls-server
  6. port 1194
  7. verb 3
  8. status /var/log/openvpn/status.log
  9. status-version 1
  10. ca /usr/local/etc/openvpn/certs/vpn-ca.pem
  11. cert /usr/local/etc/openvpn/certs/servercert.pem
  12. key /usr/local/etc/openvpn/certs/serverkey.pem
  13. dh /usr/local/etc/openvpn/certs/dh1024.pem
  14. client-to-client
  15. ping-timer-rem
  16. persist-key
  17. persist-tun
  18. keepalive 10 60
  19. mute 50

Der Serverdienst kann nun unter Berücksichtigung der richtigen Konfiguration gestartet werden. Bei Fehler sei auf das Logfile verwiesen, dass unter status angegeben werden kann.


OpenVPN-Client

Jeder Client benötigt seine eigene individuelle IP unter ifconfig. Der Server bekommt die 192.168.100.2, die Clients werden einfacher weise hochgezählt.

  1. dev tap
  2. float
  3. remote <SERVERNAME>
  4. ifconfig 192.168.100.3 255.255.255.0
  5. route 10.55.0.0 255.255.255.0 192.168.100.2
  6. tls-client
  7. port 1194
  8. persist-key
  9. persist-tun
  10. ping 15
  11. verb 9
  12. ca /usr/local/etc/openvpn/vpn-ca.pem
  13. cert /usr/local/etc/openvpn/client1_cert.pem
  14. key /usr/local/etc/openvpn/client1_key.pem
  15. tls-remote <SERVERNAME>
  16. status /var/log/openvpn/status.log
  17. status-version 1

Unter Windows müssen insesondere die Pfade angepasst werden und die Konfigurationsdateien müssen auf .ovpn enden, damit diese erkannt werden.

Via IP können die Rechner direkt angesprochen werden. Der Server sollte antworten, wenn von einem beliebigen Client ping 192.168.100.2 ausgeführt wird.

Um Namen zu verwenden müssen entweder alle hosts-Dateien gepflegt werden oder ein Nameserver muss konfiguriert werden.