Die Einrichtung eines OpenVPN-Servers auf Ubuntu bietet eine bewährte VPN-Lösung auf Basis einer ausgereiften PKI — ideal für Remote-Mitarbeiter, Site-to-Site-Verbindungen und die Absicherung von Datenverkehr in nicht vertrauenswürdigen Netzwerken. Diese Anleitung führt durch jeden Schritt: Aufbau einer Zertifizierungsstelle mit Easy-RSA, Erstellung einer produktionsreifen server.conf, Generierung von Client-.ovpn-Profilen, Konfiguration von UFW-Firewall-Regeln und Aktivierung von NAT-Masquerade, damit VPN-Clients das Internet erreichen.

Voraussetzungen

  • Ubuntu 22.04 LTS oder 24.04 LTS Server mit einer öffentlichen IP-Adresse
  • Sudo- oder Root-Zugriff
  • Ein Domainname oder eine statische IP, die auf den Server zeigt (empfohlen)
  • Grundlegende Kenntnisse der Linux-Kommandozeile
  • UFW installiert (standardmäßig auf Ubuntu; bei Fehlen mit sudo apt install ufw installieren)

OpenVPN und Easy-RSA installieren

Zunächst die Paketliste aktualisieren und sowohl OpenVPN als auch das Easy-RSA-Toolkit installieren:

sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y

Das Easy-RSA-Vorlagenverzeichnis an einen dauerhaften Ort unter dem OpenVPN-Verzeichnis kopieren:

sudo mkdir -p /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

PKI mit Easy-RSA aufbauen

Eine vollständige OpenVPN-PKI besteht aus einer Zertifizierungsstelle (CA), einem Server-Zertifikat/Schlüssel-Paar, Diffie-Hellman-Parametern und einem HMAC-Schlüssel für die TLS-Authentifizierung.

PKI initialisieren und CA erstellen

sudo ./easyrsa init-pki
sudo ./easyrsa build-ca nopass

Den Standard-Common-Name (Easy-RSA CA) akzeptieren oder einen eigenen festlegen. Die Option nopass überspringt die CA-Passwortabfrage — für automatisierte Server akzeptabel, aber in sicherheitskritischen Umgebungen sollte eine Passphrase hinzugefügt werden.

Server-Zertifikat generieren

sudo ./easyrsa gen-req server nopass
sudo ./easyrsa sign-req server server

Mit yes die Signierung bestätigen. Dadurch entstehen pki/issued/server.crt und pki/private/server.key.

Diffie-Hellman-Parameter und TLS-Auth-Schlüssel generieren

Die Generierung der DH-Parameter dauert mehrere Minuten:

sudo ./easyrsa gen-dh
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key

Alle erforderlichen Schlüssel in das OpenVPN-Serververzeichnis kopieren:

sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key \
        pki/dh.pem pki/ta.key /etc/openvpn/server/

server.conf schreiben

/etc/openvpn/server/server.conf mit folgender Konfiguration erstellen:

# /etc/openvpn/server/server.conf

port 1194
proto udp
dev tun

ca   /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key  /etc/openvpn/server/server.key
dh   /etc/openvpn/server/dh.pem

# VPN-Subnetz — Clients erhalten Adressen aus diesem Pool
server 10.8.0.0 255.255.255.0

# Standard-Route pushen (gesamter Client-Datenverkehr über VPN)
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"

# TLS-Härtung
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun

# Protokollierung
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3

Das Protokollverzeichnis erstellen und den Dienst starten:

sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server

Firewall-Regeln und NAT-Routing

IP-Weiterleitung aktivieren

/etc/sysctl.conf bearbeiten und die folgende Zeile auskommentieren (oder hinzufügen):

net.ipv4.ip_forward=1

Sofort ohne Neustart anwenden:

sudo sysctl -p

NAT-Masquerade-Regeln zu UFW hinzufügen

Das öffentliche Netzwerkinterface ermitteln (häufig eth0 oder ens3):

ip route | grep default

/etc/ufw/before.rules bearbeiten und den folgenden Block vor dem Abschnitt *filter einfügen:

# OpenVPN NAT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

eth0 durch den tatsächlichen Schnittstellennamen ersetzen.

Anschließend die Paketweiterleitung in /etc/default/ufw erlauben:

DEFAULT_FORWARD_POLICY="ACCEPT"

Den OpenVPN-Port öffnen und UFW neu laden:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw reload

Client-Zertifikate und .ovpn-Dateien generieren

Client-Zertifikat erstellen

cd /etc/openvpn/easy-rsa
sudo ./easyrsa gen-req client1 nopass
sudo ./easyrsa sign-req client client1

Die Datei client1.ovpn erstellen

Eine eigenständige .ovpn-Datei bettet alle Zertifikate inline ein, sodass der Benutzer nur eine Datei benötigt. /root/clients/client1.ovpn erstellen:

client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
# Inhalt von /etc/openvpn/server/ca.crt hier einfügen
</ca>

<cert>
# Inhalt von /etc/openvpn/easy-rsa/pki/issued/client1.crt hier einfügen
</cert>

<key>
# Inhalt von /etc/openvpn/easy-rsa/pki/private/client1.key hier einfügen
</key>

<tls-auth>
# Inhalt von /etc/openvpn/server/ta.key hier einfügen
</tls-auth>

Das Einbetten kann mit einem Shell-Skript automatisiert werden:

#!/bin/bash
# gen-client.sh
CLIENT=$1
OVPN_DIR=/root/clients
KEYS=/etc/openvpn/easy-rsa/pki

cat > "$OVPN_DIR/$CLIENT.ovpn" <<EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
$(cat "$KEYS/ca.crt")
</ca>

<cert>
$(openssl x509 -in "$KEYS/issued/$CLIENT.crt")
</cert>

<key>
$(cat "$KEYS/private/$CLIENT.key")
</key>

<tls-auth>
$(cat /etc/openvpn/server/ta.key)
</tls-auth>
EOF
echo "Generated $OVPN_DIR/$CLIENT.ovpn"

Verwendung: sudo bash gen-client.sh client1

OpenVPN vs. WireGuard: Vergleich

MerkmalOpenVPNWireGuard
ProtokollTLS über UDP/TCPNur UDP (WireGuard-Protokoll)
Port-FlexibilitätUDP 1194 oder TCP 443Nur UDP (Standard 51820)
Client-UnterstützungAlle Plattformen + Legacy-GeräteModerne Plattformen (Linux 5.6+, iOS, Android, Windows)
KonfigurationskomplexitätHoch (PKI, mehrere Dateien)Niedrig (Schlüsselpaar, eine Konfiguration)
DurchsatzGutHervorragend (Kernel-Space)
Firewall-TraversierungHervorragend (TCP-443-Modus)Eingeschränkt (nur UDP)
Audit-GeschichteUmfangreich (seit 2001)Schlank, formal verifiziert
Site-to-Site-UnterstützungNativNativ
Dynamische IPsÜber --float-FlagWechselt automatisch
Beste Wahl fürBreite Kompatibilität, Legacy-Clients, TCP-only-NetzwerkeHohe Performance, moderne Deployments, Einfachheit

Empfehlung: WireGuard für neue Deployments wählen, bei denen alle Clients moderne Betriebssysteme verwenden. OpenVPN wählen, wenn Windows 7/8, ältere iOS-Versionen oder Netzwerke unterstützt werden müssen, die UDP vollständig blockieren.

Praxisbeispiel

Ein kleines Softwareentwicklungsteam wird verwaltet, bei dem drei Remote-Entwickler auf eine interne GitLab-Instanz und einen Staging-Datenbankserver zugreifen. Der GitLab-Server befindet sich auf 192.168.10.10 im internen Büronetzwerk, hinter einer Firewall, die nur SSH und HTTPS nach außen freigibt.

Nach der Einrichtung von OpenVPN mit den obigen Schritten öffnet jeder Entwickler sein dev-name.ovpn-Profil im OpenVPN-Client. Nach dem Verbindungsaufbau erhält die Workstation eine Adresse im Bereich 10.8.0.0/24. Auf dem OpenVPN-Server wird eine statische Route hinzugefügt, die 192.168.10.0/24 an Clients weiterleitet:

push "route 192.168.10.0 255.255.255.0"

Nun können Entwickler 192.168.10.10 direkt über den verschlüsselten Tunnel erreichen, ohne GitLab dem öffentlichen Internet auszusetzen. Der Zugriff kann sofort entzogen werden, indem ./easyrsa revoke dev-name gefolgt von ./easyrsa gen-crl ausgeführt wird, und dann crl-verify /etc/openvpn/server/crl.pem zu server.conf hinzugefügt wird — ohne Passwortänderungen.

Fallstricke und Sonderfälle

Routing-Konflikte mit 10.8.0.0/24: Falls das LAN dieses Subnetz bereits verwendet, die server-Direktive auf einen ungenutzten Bereich wie 10.9.0.0 255.255.255.0 ändern und die NAT-Masquerade-Regel entsprechend aktualisieren.

Split-Tunneling vs. vollständiger Tunnel: Die Push-Direktive redirect-gateway def1 leitet den gesamten Client-Datenverkehr durch das VPN. Für Split-Tunneling (nur bestimmte Subnetze) diese Zeile entfernen und stattdessen explizite Routen pushen.

TCP-Modus für restriktive Firewalls: Falls UDP 1194 blockiert ist, proto udp in proto tcp und port 1194 in port 443 sowohl in der Server- als auch in der Client-Konfiguration ändern. Die Performance ist durch TCP-über-TCP-Ineffizienz geringer, aber die Traversierung verbessert sich erheblich.

Zertifikatswiderruf: Immer eine CRL erstellen und bereitstellen, wenn Clients widerrufen werden. Ohne crl-verify in server.conf funktionieren widerrufene Zertifikate weiterhin.

MTU-Fragmentierung: Falls Clients langsamen Durchsatz oder verworfene Pakete erleben, tun-mtu 1400 und mssfix 1360 zu server.conf hinzufügen.

Persistente IP-Zuweisung: Ein client-config-dir (CCD) mit ifconfig-push-Direktiven pro Client verwenden, um bei jeder Verbindung dieselbe IP-Adresse zuzuweisen.

Fehlerbehebung

Dienst startet nicht: sudo journalctl -u openvpn-server@server -e ausführen, um das vollständige Protokoll zu lesen. Häufige Ursachen sind falsche Dateipfade in server.conf oder eine falsche ta.key-Richtung.

Clients verbinden sich, können aber das Internet nicht erreichen: Bestätigen, dass die IP-Weiterleitung aktiv ist (cat /proc/sys/net/ipv4/ip_forward sollte 1 zurückgeben), dass die MASQUERADE-Regel vorhanden ist (sudo iptables -t nat -L) und dass DEFAULT_FORWARD_POLICY=ACCEPT in /etc/default/ufw gesetzt ist.

TLS-Handshake fehlgeschlagen: Sicherstellen, dass der key-direction-Wert übereinstimmt: 0 auf der Serverseite, 1 auf der Clientseite (oder tls-crypt statt tls-auth verwenden, das richtungsunabhängig ist).

DNS-Leaks: Überprüfen, ob die dhcp-option DNS-Pushes vom Client mit openvpn --show-status client.log empfangen werden. dnsleak.com verwenden, um zu bestätigen, dass DNS-Anfragen über das VPN ausgehen.

Client-Zertifikat abgelaufen: Easy-RSA verwendet standardmäßig 825-tägige Client-Zertifikate. Vor Ablauf mit ./easyrsa renew client1 nopass erneuern und die aktualisierte .ovpn-Datei neu verteilen.

Zusammenfassung

  • openvpn und easy-rsa installieren, dann eine PKI mit CA, Server-Zertifikat, DH-Parametern und ta.key initialisieren
  • server.conf mit AES-256-GCM-Verschlüsselung, TLS-Auth-Härtung und dem VPN-Subnetz 10.8.0.0/24 schreiben
  • IP-Weiterleitung aktivieren und eine UFW-MASQUERADE-Regel hinzufügen, damit VPN-Clients das Internet erreichen
  • Ein Shell-Skript verwenden, um Zertifikate inline in eigenständige .ovpn-Client-Profile einzubetten
  • OpenVPN ist die richtige Wahl für Legacy-Clients und TCP-only-Firewall-Traversierung; WireGuard gewinnt bei Performance und Einfachheit für moderne Deployments
  • Clients sofort über Easy-RSA CRL widerrufen, ohne gemeinsame Geheimnisse zurückzusetzen
  • /var/log/openvpn/openvpn.log überwachen und journalctl für Diagnosen auf Dienstebene verwenden

Verwandte Artikel