OpenVPN ist eine bewährte Open-Source-VPN-Lösung. Sie ermöglicht sichere Verbindungen über das Internet für Remote-Zugriff und Standortvernetzung.

Warum OpenVPN?

Vorteile

- Hohe Sicherheit (OpenSSL)
- Plattformübergreifend
- Flexibel konfigurierbar
- NAT-freundlich (UDP/TCP)
- Große Community

OpenVPN vs. WireGuard

| Feature | OpenVPN | WireGuard | |---------|---------|-----------| | Protokoll | SSL/TLS | Kernel-Modul | | Konfiguration | Komplex | Einfach | | Performance | Gut | Sehr gut | | Code-Größe | ~100.000 Zeilen | ~4.000 Zeilen | | Verbreitung | Sehr hoch | Wachsend |

Installation

Debian/Ubuntu

apt update
apt install openvpn easy-rsa

CentOS/RHEL

dnf install epel-release
dnf install openvpn easy-rsa

PKI einrichten (Easy-RSA)

Easy-RSA vorbereiten

# Verzeichnis erstellen
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

Variablen anpassen

# /etc/openvpn/easy-rsa/vars

set_var EASYRSA_REQ_COUNTRY    "DE"
set_var EASYRSA_REQ_PROVINCE   "Bayern"
set_var EASYRSA_REQ_CITY       "Muenchen"
set_var EASYRSA_REQ_ORG        "Example GmbH"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "IT"
set_var EASYRSA_KEY_SIZE       2048
set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    1080

PKI initialisieren

./easyrsa init-pki

CA erstellen

./easyrsa build-ca nopass
# Common Name: OpenVPN-CA

Server-Zertifikat

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

DH-Parameter

./easyrsa gen-dh

TLS-Auth-Key

openvpn --genkey secret /etc/openvpn/ta.key

Client-Zertifikat

./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

Server-Konfiguration

Zertifikate kopieren

cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/

Server-Konfiguration

# /etc/openvpn/server.conf

port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt

# Routing
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# Keepalive
keepalive 10 120

# Verschlüsselung
cipher AES-256-GCM
auth SHA256

# Kompression (optional)
# compress lz4-v2
# push "compress lz4-v2"

# Benutzer/Gruppe
user nobody
group nogroup

# Persistenz
persist-key
persist-tun

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

Log-Verzeichnis

mkdir -p /var/log/openvpn

IP-Forwarding aktivieren

Kernel-Parameter

# /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

NAT-Regel (iptables)

# Für eth0 als Internet-Interface
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

# Persistent machen
apt install iptables-persistent
netfilter-persistent save

Firewall

ufw allow 1194/udp
ufw allow OpenSSH
ufw enable

Server starten

systemctl enable --now openvpn@server
systemctl status openvpn@server

Client-Konfiguration

Dateien sammeln

# Server:
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client1.crt
/etc/openvpn/easy-rsa/pki/private/client1.key
/etc/openvpn/ta.key

Client-Konfiguration

# client1.ovpn

client
dev tun
proto udp
remote server.example.com 1194
resolv-retry infinite
nobind

persist-key
persist-tun

ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

cipher AES-256-GCM
auth SHA256

verb 3

Einzel-Datei-Konfiguration

# client1.ovpn (alles in einer Datei)

client
dev tun
proto udp
remote server.example.com 1194
resolv-retry infinite
nobind

persist-key
persist-tun

cipher AES-256-GCM
auth SHA256
key-direction 1

verb 3

<ca>
-----BEGIN CERTIFICATE-----
... (Inhalt von ca.crt)
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
... (Inhalt von client1.crt)
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
... (Inhalt von client1.key)
-----END PRIVATE KEY-----
</key>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
... (Inhalt von ta.key)
-----END OpenVPN Static key V1-----
</tls-auth>

Client-Skript erstellen

#!/bin/bash
# /etc/openvpn/make-client.sh

CLIENT=$1
EASYRSA=/etc/openvpn/easy-rsa
OUTPUT=/etc/openvpn/clients

mkdir -p $OUTPUT

cd $EASYRSA
./easyrsa gen-req $CLIENT nopass
./easyrsa sign-req client $CLIENT

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

<ca>
$(cat $EASYRSA/pki/ca.crt)
</ca>

<cert>
$(cat $EASYRSA/pki/issued/$CLIENT.crt)
</cert>

<key>
$(cat $EASYRSA/pki/private/$CLIENT.key)
</key>

<tls-auth>
$(cat /etc/openvpn/ta.key)
</tls-auth>
EOF

echo "Client-Konfiguration erstellt: $OUTPUT/$CLIENT.ovpn"
chmod +x /etc/openvpn/make-client.sh
./make-client.sh client2

Zertifikat widerrufen

cd /etc/openvpn/easy-rsa
./easyrsa revoke client1
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/
# /etc/openvpn/server.conf
crl-verify crl.pem
systemctl restart openvpn@server

Site-to-Site VPN

Server-Konfiguration

# /etc/openvpn/site-server.conf

port 1195
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

server 10.9.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp-site.txt

# Routen zum Remote-Netzwerk
route 192.168.2.0 255.255.255.0

# Client-spezifische Konfiguration
client-config-dir /etc/openvpn/ccd

keepalive 10 120
cipher AES-256-GCM
persist-key
persist-tun

Client-Konfiguration (Site)

# /etc/openvpn/ccd/site-client

# IP für diesen Client
ifconfig-push 10.9.0.2 10.9.0.1

# Route zum entfernten Netzwerk
iroute 192.168.2.0 255.255.255.0

Monitoring

Status-Datei

cat /var/log/openvpn/openvpn-status.log

Verbundene Clients

# Aus Status-Datei
cat /var/log/openvpn/openvpn-status.log | grep "CLIENT_LIST"

Management-Interface

# /etc/openvpn/server.conf
management localhost 7505

# Verbinden
telnet localhost 7505
status
help

Troubleshooting

Logs prüfen

tail -f /var/log/openvpn/openvpn.log
journalctl -u openvpn@server -f

Verbindung testen

# Client-Seite
ping 10.8.0.1

# Server-Seite
ping 10.8.0.6

TUN-Device prüfen

ip addr show tun0

Häufige Fehler

# TLS Error
# → Zeit synchronisieren (NTP)
# → Zertifikate prüfen

# Cannot allocate TUN
# → modprobe tun
# → /dev/net/tun erstellen

# Connection refused
# → Firewall prüfen
# → Port/Protokoll prüfen

Sicherheits-Tipps

Empfohlene Einstellungen

# /etc/openvpn/server.conf

# TLS 1.2 minimum
tls-version-min 1.2

# Starke Cipher
cipher AES-256-GCM
auth SHA256

# TLS-Auth
tls-auth ta.key 0

# Keine Kompression (VORACLE-Angriff)
# compress lz4-v2  # Nicht empfohlen

Client-Isolierung

# Clients können sich nicht untereinander erreichen
client-to-client  # NICHT setzen

Zusammenfassung

| Datei | Beschreibung | |-------|--------------| | server.conf | Server-Konfiguration | | ca.crt | CA-Zertifikat | | server.crt/key | Server-Zertifikat | | dh.pem | DH-Parameter | | ta.key | TLS-Auth-Key |

| Befehl | Funktion | |--------|----------| | systemctl status openvpn@server | Status prüfen | | easyrsa gen-req client | Client-Zertifikat | | easyrsa revoke client | Zertifikat widerrufen | | easyrsa gen-crl | CRL aktualisieren |

Fazit

OpenVPN bietet flexible und sichere VPN-Verbindungen. Die Einrichtung erfordert PKI-Verständnis, aber Easy-RSA vereinfacht die Zertifikatsverwaltung. Für moderne Setups ist WireGuard eine einfachere Alternative, aber OpenVPN bleibt für komplexe Szenarien und ältere Clients die bewährte Wahl. Achten Sie auf aktuelle Verschlüsselungseinstellungen und regelmäßige Updates.