1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Standorte vernetzen

OpenVPN realisiert ein virtuelles privates Netzwerk entweder als Punkt-zu-Punkt-Verbindung auf IP-Ebene mit TUN-Schnittstelle oder als Brücke auf MAC-Ebene mit TAP-Schnittstelle. Verschlüsselt wird via TLS mit X.509-Zertifikaten.

Paket installieren

Das Paket enthält den Daemon, Unit-Dateien und reichlich Dokumentation.

apt install openvpn

Server konfigurieren

Wir erzeugen wir einen Satz Diffie-Hellmann-Parameter für den Schlüsselaustausch und unsere Zertifizierungsstelle stellt ein Serverzertifikat aus, das wir unter /etc/ssl ablegen.

openssl dhparam -out /etc/ssl/dh1024.pem 1024
openssl dhparam -out /etc/ssl/dh2048.pem 2048

Damit sich der Client nicht nur direkt mit dem Server verbinden, sondern auch auf das dahinter liegende Netzwerk zugreifen kann, teilt man ihm die Route mit.

/etc/openvpn/server/Name.conf
server 10.8.0.0 255.255.255.0 dev tun proto udp port 1194 push "route 192.168.23.0 255.255.255.0" ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log verb 3 dh /etc/ssl/dh2048.pem ca /etc/ssl/ca.crt cert /etc/ssl/Name.crt key /etc/ssl/Name.key

Nun aktivieren und starten wir den Dienst.

systemctl enable --now openvpn-server@Name

Client konfigurieren

Die Konfigurationsdateien für Clients bereitet man am besten ebenfalls auf dem Server vor und verteilt sie später.

/etc/openvpn/client/Name.conf
client nobind dev tun proto udp remote Host 1194 remote-cert-tls server resolv-retry infinite persist-key persist-tun comp-lzo verb 3 ca /etc/ssl/ca.crt cert /etc/ssl/Name.crt key /etc/ssl/Name.key

Für eine persistente Verbindung aktivieren und starten wir den Dienst.

systemctl enable --now openvpn-client@Name

Wird die Verbindung nur gelegentlich benötigt, importieren wir die Konfigurationsdatei in den Network Manager. Im Gnome Kontrollzentrum geht das unter Einstellungen / Netzwerk / VPN.

Referenz

Diese Auflistung soll nur einen Überblick über die verfügbaren Kommandos und Optionen vermitteln und erhebt keinen Anspruch auf Vollständigkeit. Als authoritative Quelle dient die Manpage, openvpn(8).

openvpn --help Optionen anzeigen
--config File Einstellungen aus Datei lesen
--show-ciphers Verschlüsselungsverfahren auflisten
--show-digests Streuverfahren auflisten
--show-tls Algorithmen für TLS auflisten
--show-engines Hardware-Beschleuniger auflisten
--show-curves Algorithmen für Elliptische Kurven auflisten
--show-pkcs11-ids Provider [0|1]
--show-gateway [v6target] Debug
--show-proxy-settings Proxyeinstellungen ausgeben (nur Windows)
--genkey --secret File Schlüssel erzeugen
--mktun Persistenten Tunnel erzeugen
--rmtun Persistenten Tunnel löschen

Konfigurationsdatei

Option Argument Vorgabe Beschreibung
Client
client Entspricht pull und tls-client
pull Optionen vom Server akzeptieren
pull-filter Action Text Optionen vom Server filtern
auth-user-pass File Datei mit je einer Zeile für Benutzername und Passwort
auth-retry Type none Verhalten bei falschem Passwort
static-challenge Text Echo 0 Frage-Antwort-Protokoll
server-poll-timeout Seconds 120 Wartezeit beim Aufbau der Verbindung
connect-timeout Seconds 120 Wartezeit beim Aufbau der Verbindung
explicit-exit-notify [Count] 1 Server über Ende benachrichten
allow-recursive-routing Pakete an sich selbst behalten
Server
server Network Netmask [nopool] Entspricht tls-server und push
server-ipv6 Address/Bits Sowohl ifconfig-ipv6-pool als auch push setzen
server-bridge Gateway Netmask StartIp EndIp Brücke für TAP-Schnittstelle
server-bridge [nogw] Servermodus mit Brücke
push Option Option an Client übermitteln; Siehe pull
push-reset Liste der Optionen nicht vererben
push-remove Text Push-Optionen entgernen
push-peer-info Informationen zum Server senden
disable Client vorübergehend deaktivieren
ifconfig-pool-persist File [Seconds] ipp.txt 600 Daten speichern
ifconfig-pool StartIp EndIp [Netmask] Subnetze dynamisch an Clients vergeben
ifconfig-ipv6-pool Address/Bits Subnetze dynamisch an Clients vergeben
ifconfig-push Local Netmask [Alias] Dynamische Zuweisung umgehen
ifconfig-ipv6-push Address/Bits Remote Dynamische Zuweisung umgehen
iroute Network [Netmask] Interne Route zum Client erzeugen
iroute-ipv6 Address/Bits Interne Route zum Client erzeugen
client-to-client Verkehr zwischen Clients intern weiterleiten
duplicate-cn Mehrere Clients mit demselben Namen erlauben
client-connect Command Skript beim Aufbau der Verbindung ausführen
client-disconnect Command Skript beim Abbruch der Verbindung ausführen
client-config-dir Dir Pfad für benutzerspezifische Konfigurationsdateien
ccd-exclusive Pfad muss vorhanden sein
tmp-dir Dir Pfad für Temporärdateien
hash-size Real Virtual 256 256 Größe der Streutabellen für Adressen
bcast-buffers Number 256 Puffer für Rundsendungen
tcp-queue-limit Number 64 Obergrenze für wartende Pakete
tcp-nodelay Pakete sofort senden (TCP_NODELAY Flag)
max-clients Number Obergrenze für Verbindungen festlegen
max-routes-per-client Number 256 Obergrenze for Routen pro Client festlegen
stale-routes-check Seconds [Seconds] Routen nach Inaktivität entfernen
connect-freq Number Seconds Maximal soviele Verbindungen pro Sekunde annehmen
learn-address Command Skript ausführen um Firewall anzupassen
auth-user-pass-verify Command Method Benutzername und Passwort verlangen
auth-gen-token [Lifetime] Verbindung über Token verlängern
opt-verify Clients mit inkompatiblen Optionen ablehnen
auth-user-pass-optional Benutzername und Passwort nicht zwingend
verify-client-cert Method require Client-Zertifikat anfordern
username-as-common-name Anmeldename statt CN aus Zertifikat verwenden
port-share Host Port [Dir] Andere Protokolle an HTTPS-Server durchreichen
Tunnel
mode Mode p2p Punkt-zu-Punkt oder Multi-Client-Server
local Host all Adresse des Ports einschränken
remote Host [Port] [Proto] … 1194 udp Adresse des Servers (mehrfache Angaben möglich)
remote-random-hostname DNS caching durch Prefix verhindern
proto-force Proto Profil mit Protokoll bevorzugen
remote-random Profil-Liste randomisieren
proto Proto udp Protokoll festlegen
connect-retry Count [Seconds] 5 300 Wartezeit zwischen Verbindungsversuchen in Sekunden
connect-retry-max Count unlimited Obergrenze für Verbindungsversuche
http-proxy Host Port [] Proxy verwenden
http-proxy-option Type [Param] Erweiterte Optionen für Proxy setzen
socks-proxy Host [Port] [AuthFile]1080 SOCKS Proxy verwenden
resolv-retry Seconds infinite Wartezeit um Hostnamen aufzulösen
float Veränderliche Adressen zulassen
ipchange Command Skript bei Änderung der Adresse aufrufen
port Port 1194 Lokale und entfernte Portnummer
lport Port 1194 Nur lokale Portnummer
rport Port 1194 Nur entfernte Portnummer
bind [ipv6only] Als Server auf lokalem Port lauschen
nobind Als Client von zufälligem Port senden
dev Type[Number] tun0 Virtuelle Netzwerk-Schnittstelle
dev-type Type tun Art der Schnittstelle festlegen
dev-node File /dev/net/tun
topology Mode Virtuelle Adressierung setzen
lladdr Max Hardwareadresse für TAP Schnittstelle setzen
iproute Command iproute Skript zum Setzen der Route (statt iproute2)
ifconfig Local Remote IPv4-Adresse für TUN-Schnittstelle setzen
ifconfig-ipv6 Local/Bits Remote IPv6-Adresse für TUN-Schnittstelle setzen
ifconfig-noexec ifconfig nicht ausführen
ifconfig-nowarn Warnungen unterdrücken
route Network/Netmask [] Routing-Tabelle ergänzen
route-ipv6 Address/Bits [] IPv6-Route
route-gateway Host|dhcp Default-Gateway festlegen oder beim Server erfragen
route-metric Metric Default-Metrik festlegen
route-delay [Seconds] [Wait] 0 30 Wartezeit bis Route aktiviert wird
route-up Command Skript nach Aktivierung der Route ausführen
route-pre-down Command Skript vor Deaktivierung der Route ausführen
route-noexec Route nicht veränden (nur per Skript)
route-nopull Route nicht vom Server holen
allow-pull-fqdn Hostnamen vom Server holen
client-nat snat|dnat Network Netmask Alias Adresskonflikte vermeiden
redirect-gateway Flags Ausgehende Pakete über das VPN leiten
redirect-private [Flags] Default-Gateway nicht ändern
link-mtu Bytes Obergrenze für UDP-Pakete festlegen
tun-mtu Bytes 1500 MTU der TUN-Schnittstelle festlegen
tun-mtu-extra Bytes 0 Overhead kompensieren (0 für TUN, 32 für TAP)
mtu-disc no|maybe|yes MTU-Erkennung aktivieren
mtu-test MTU ermitteln
fragment Bytes Pakete ab dieser Größe intern fragmentieren
mssfix Bytes 1450 Obergrenze für TCP-Pakete festlegen
sndbuf Bytes Größe des Sendepuffer ändern
rcvbuf Bytes Größe des Empfangspuffer ändern
mark Value Pakete für Paketfilter markieren
socket-flags Flags Aktuell nur TCP_NODELAY
txqueuelen Bytes 100 Größe der Übertragungswarteschlange ändern (nur Linux)
shaper Bytes Bandbreite limitieren
inactive Seconds [Bytes] 0 Verbindung bei Inaktivität trennen
keepalive Interval Timeout Kurzform für ping
ping Seconds Regelmäßig Paket zur Gegenhseite senden
ping-exit Seconds 120 Verbindung bei Inaktivität trennen
ping-restart Seconds 60 Bei Inaktivität neu starten
ping-timer-rem Nur bei aktiver Verbindung prüfen
persist-tun Schnittstelle nur beim ersten Start erzeugen
persist-key Schlüssel nur beim ersten Start lesen
persist-local-ip Client-Adresse nur beim ersten Start empfangen
persist-remote-ip Server-Adresse nur beim ersten Start empfangen
mlock Arbeitsspeicher nicht auf Platte auslagern
up Command Skript nach Erzeugen der Schnittstelle ausführen
up-delay Schnittstelle erst nach erfolgreicher Verbindung erzeugen
down Command Skript nach Löschen der Schnittstelle ausführen
down-pre Skript vor Löschen der Schnittstelle ausführen
up-restart Skripte auch beim Neustart ausführen
setenv FORWARD_COMPATIBLE 1 Unbekannte Direktiven ignorieren
setenv Name Value Umgebungsvariable setzen
setenv-safe Name Value Präfix OPENVPN_ setzen
ignore-unknown-option Option[ …] Unbekannte Direktiven ignorieren
script-security Level 1 Ausführung von externen beschränken
disable-occ Inkonsistenzen zwischen Client und Server ignorieren
user User Benutzeridentität wechseln
group Group Gruppenzugehörigkeit wechseln
cd Dir Arbeitsverzeichnis wechseln
chroot Dir Prozess einsperren
setcon Context SELinux-Kontext anwenden
daemon [Progname] openvpn Prozess daemonisieren
syslog [Progname] openvpn Ausgaben ins Syslog protokollieren
errors-to-stderr Fehler auf Standardfehlerausgabe melden
passtos TOS-Feld aus Nutzlast übernehmen
inetd [nowait] [Progname] wait Modus beim Start über inetd
log File Ausgaben in Datei schreiben
log-append File Ausgaben an Datei anhängen
suppress-timestamps Zeitstempel unterdrücken
machine-readable-output Zeitstempel und Flags immer ausgeben
writepid File Prozessnummer in Datei schreiben
nice Level Priorität des Prozesses ändern
fast-io Experimentell
multihome Server mit mehreren Netzwerk-Schnittstellen
echo [Parms…] Parameter protokollieren
remap-usr1 SIGHUP|SIGTERM SIGUSR1 umbiegen
verb Level 1 Verbosität erhöhen
status File [Seconds] Status regelmäßig in Datei ausgeben
status-version [Version] 1 Format der Statusdatei
mute Number Repetitive Meldungen unterdrücken
compress [Algorithm] Kompression aktivieren
comp-noadapt Adaptive Kompression deaktivieren
plugin File [InitString] Modul laden
keying-material-exporter Label Length Schlüssel speichern (RFC 5705)
Datenkanal
secret File [Direction] Statischen Schlüssel verwenden; siehe --genkey
key-direction Richtung für eingebettete Schlüssel
auth Algorithm SHA1 Streuverfahren für HMAC
cipher Algorithm BF-CBC Verschlüsselungsverfahren; siehe --show-ciphers
ncp-ciphers Algorithm[:…] Verschlüsselungsverfahren einschränken
ncp-disable Aushandlung unterbinden
prng Algorithm [Nonce] SHA1 16 Methode um Zufallszahlen zu generieren
engine Name Hardwareverschlüsselung verwenden; siehe --show-engines
replay-window Size [Seconds] 64 15 Schutz gegen Wiederholungsangriffe
mute-replay-warnings Keine Warnungen anzeigen
replay-persist File Daten speichern
use-prediction-resistance Vorhersageangriffe erschweren
test-crypto Testpakete ver- und entschlüsseln
TLS-Modus
tls-server Serverrolle annehmen
tls-client Clientrolle annehmen
ca File Wurzelzertifikat
capath Dir Vertrauenswürdige Zertifikate
dh File Diffie Hellman Parameter (für Server)
ecdh-curve Name Elliptische Kurve; siehe --show-curves
cert File Eigenes Zertifikat
extra-certs File Weitere Zertifikate in der Kette
key File Privater Schlüssel
tls-version-min Version [or-highest] 1.0 Älteste erlaubte Protokollversion
tls-version-max Version Neueste erlaubte Protokollversion
pkcs12 File Alternative für ca, cert und key
verify-hash Hash [Algorithm] SHA1 Fingerabdruck des übergeordneten Zertifikats
cryptoapicert SelectString Schlüssel aus Windows Zertifikatsspeicher laden
tls-cipher[suites] Algorithm[:…] DEFAULT:… Erlaubte Verschlüsselungsverfahren
tls-cert-profile Profile Algorithmen für Zertifikate
tls-timeout Seconds 2 Wartezeit des Kontrollkanals
reneg-bytes Bytes 64M Datenkanal neu verhandeln
reneg-pkts Packets Datenkanal neu verhandeln
reneg-sec Seconds 3600 Datenkanal neu verhandeln
hand-window Seconds 60 Wartezeit für Verhandlung
tran-window Seconds 60 Wartezeit für Neuverhandlung
single-session Nur eine einzige Verbindung erlauben
tls-exit Abbrechen, wenn Verhandlung fehlschlägt
tls-auth File [Direction] Zusätzliche HMAC-Authentifizierung
tls-crypt KeyFile Kontrollkanal vorab verschlüsseln
askpass [File] Passwort vor der Daemonisierung abfragen
auth-nocache Passwörter nicht merken
auth-token Token Passwort durch Authentifizerungstoken ersetzen
tls-verify Command X.509-Name durch externes Skript prüfen
tls-export-cert Dir Aktive Client-Zertifikate speichern
x509-username-field [ext:]Name CN Feld im Subject als Benutzername verwenden
verify-x509-name Name Type Name des Zertifikats muss passen
x509-track Attribute Attribut in Umgebungsvariable speichern
remote-cert-ku [Value…] Schlüsselverwendung prüfen
remote-cert-eku Oid Erweiterte Schlüsselverwendung prüfen
remote-cert-tls client|server Schlüsselverwendung gemäß RFC 3280
crl-verify File [Dir] Widerrufsliste konsultieren
p2p Punkt-zu-Punkt
server Multi-Client
udp Nachrichtenorientiert
tcp Stromorientiert
udp Nachrichtenorientiert
tcp-client Stromorientiert Client
tcp-server Stromorientiert Server
[AuthFile|auto|auto-nct] [auth-method=none|basic|ntlm]
VERSION
AGENT
CUSTOM-HEADER
tun IP (OSI Schicht 3)
tap Ethernet (OSI Schicht 2)
null
net30 /30 Subnetz für jeden Windows Client
p2p Eine Adresse pro Client
subnet Eine Adresse pro Client mit Subnetz
[Gateway] [Metric]
local Gemeinsames Subnetz
autolocal Gemeinsames Subnetz erkennen
def1 Ursprünglichen Default-Gateway nicht löschen
bypass-dhcp Route zum lokalen DHCP Server setzen
bypass-dns Route zum lokalen DNS Server setzen
block-local Zugriff auf das lokale Netzwerk unterbinden
ipv6 IPv6 Routing über VPN abwickeln
!ipv4 IPv4 nicht über VPN leiten
0 Keine externen Programme ausführen
1 Nur bestimmte Programme wie ifconfig, ip, route oder netsh aufrufen
2 Benutzerdefiniertes Skript ausführen
3 Passwörter aus Umgebungsvariablen erlauben
0 Keine Ausgabe außer fatale Fegler
1–4 Normal
5 R und W für jedes Paket
6–11 Fehlersuche
1 Standardformat: CommonName, RealAddress, BytesReceived, BytesSent, ConnectedSince
2 Wie 1 zusätzlich: VirtualAddress, VirtualIPv6Address, Username, ClientId, Peer
3 Wie 2 aber durch Tabulator getrennt
lzo
lz4
IV_VER=Version Version des OpenVPN Clients
IV_PLAT=Platform Betriebssystem des Clients: linux, solaris, openbsd, mac, netbsd, freebsd, win
IV_LZO_STUB=1 Client unterstützt LZO Stubs
IV_LZ4=1 Client unterstützt LZ4 Komprimierung
IV_PROTO=2 Client unterstützt Peer-id floating
IV_NCP=2 Client unterstützt verhandelbare Verschlüsselung
IV_GUI_VER=GuiId Version Version der Benutzer-Oberfläche
IV_HWADDR=MacAddress Hardwareadresse des Default Gateway
IV_SSL=Version Version der OpenSSL Bibliothek
IV_PLAT_VER=Version Version des Betriebssystems
UV_Name=Value Umgebungsvariablen des Clients
via-env Per Variable als username und password setzen
via-file In temporäre Datei schreiben und Pfad übergeben
none Nur Benutzername und Passwort
optional
require
accept
ignore
reject
route
route-gateway
route-delay
redirect-gateway
ip-win32
dhcp-option
inactive
ping
ping-exit
ping-restart
setenv
auth-token
persist-key
persist-tun
echo
comp-lzo
socket-flags
sndbuf
rcvbuf
0 Automatisch ermitteln
1 sign
2 sign recover
4 decrypt
8 unwrap
legacy SHA1 and newer, RSA 2048-bit, any elliptic curve.
preferred SHA2 and newer, RSA 2048-bit, any elliptic curve.
suiteb SHA256/SHA384, ECDSA with P-256 or P-384.
none Client beendet sich mit fatalem Fehler
nointeract Client versucht es erneut mit den gleichen Zugangsdaten
interact Client frag nach neuen Zugangsdaten
HMAC-send
HMAC-receive
cipher-encrypt
cipher-decrypt

Literatur

  1. OpenVPN Technologies Inc.: HOWTO
  2. Site-to-site VPN routing explained in detail