OpenVPN Cheatsheet
OpenVPN ist ein robuster und hochflexibler VPN-Daemon, der sichere Point-to-Point- oder Site-to-Site-Verbindungen in gerouteten oder überbrückten Konfigurationen bietet. Es verwendet SSL/TLS für Schlüsselaustausch und kann NATs und Firewalls durchqueren. OpenVPN ist weit verbreitet für die Erstellung sicherer Remote Access-Lösungen und Site-to-site VPN-Verbindungen.
Installation
Linux Installation
```bash
Ubuntu/Debian
sudo apt update sudo apt install openvpn easy-rsa
CentOS/RHEL
sudo yum install epel-release sudo yum install openvpn easy-rsa
Fedora
sudo dnf install openvpn easy-rsa
Arch Linux
sudo pacman -S openvpn easy-rsa
From source
wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.8.tar.gz tar -xzf openvpn-2.5.8.tar.gz cd openvpn-2.5.8 ./configure make sudo make install ```_
Windows Installation
```powershell
Download from official website
https://openvpn.net/community-downloads/
Using Chocolatey
choco install openvpn
Using Scoop
scoop install openvpn
Manual installation
Run OpenVPN installer as administrator
Install TAP-Windows adapter
```_
macOS Installation
```bash
Using Homebrew
brew install openvpn
Using MacPorts
sudo port install openvpn2
Tunnelblick (GUI client)
Download from https://tunnelblick.net/
```_
Einrichtung der Bescheinigungsbehörde
Easy-RSA Konfiguration
```bash
Initialize PKI
cd /etc/openvpn/easy-rsa/ sudo ./easyrsa init-pki
Build CA
sudo ./easyrsa build-ca nopass
Generate server certificate
sudo ./easyrsa gen-req server nopass sudo ./easyrsa sign-req server server
Generate client certificates
sudo ./easyrsa gen-req client1 nopass sudo ./easyrsa sign-req client client1
Generate Diffie-Hellman parameters
sudo ./easyrsa gen-dh
Generate TLS-auth key
sudo openvpn --genkey --secret ta.key
Copy certificates to OpenVPN directory
sudo cp pki/ca.crt /etc/openvpn/server/ sudo cp pki/issued/server.crt /etc/openvpn/server/ sudo cp pki/private/server.key /etc/openvpn/server/ sudo cp pki/dh.pem /etc/openvpn/server/ sudo cp ta.key /etc/openvpn/server/ ```_
Handbuch Zertifikat Generation
```bash
Generate CA private key
openssl genrsa -out ca.key 4096
Generate CA certificate
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
Generate server private key
openssl genrsa -out server.key 4096
Generate server certificate request
openssl req -new -key server.key -out server.csr
Sign server certificate
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
Generate client private key
openssl genrsa -out client.key 4096
Generate client certificate request
openssl req -new -key client.key -out client.csr
Sign client certificate
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt ```_
Serverkonfiguration
Konfiguration des Basisservers
```bash
/etc/openvpn/server/server.conf
port 1194 proto udp dev tun
ca ca.crt cert server.crt key server.key dh dh.pem
server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4"
keepalive 10 120 tls-auth ta.key 0 cipher AES-256-CBC auth SHA256
user nobody group nogroup persist-key persist-tun
status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3 explicit-exit-notify 1 ```_
Erweiterte Serverkonfiguration
```bash
/etc/openvpn/server/server-advanced.conf
port 1194 proto udp dev tun topology subnet
ca ca.crt cert server.crt key server.key dh dh.pem tls-auth ta.key 0 tls-version-min 1.2 tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 cipher AES-256-GCM auth SHA256 ncp-ciphers AES-256-GCM:AES-128-GCM
server 10.8.0.0 255.255.255.0 max-clients 100 duplicate-cn
Client-specific configurations
client-config-dir /etc/openvpn/ccd ccd-exclusive
Routing
push "route 192.168.1.0 255.255.255.0" push "route 10.0.0.0 255.255.255.0" route 192.168.1.0 255.255.255.0
DNS and gateway
push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 192.168.1.1" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DOMAIN company.local"
Security
remote-cert-tls client tls-verify /etc/openvpn/verify-cn.sh auth-user-pass-verify /etc/openvpn/auth-pam.pl via-env username-as-common-name
Logging and monitoring
keepalive 10 120 ping-timer-rem persist-key persist-tun comp-lzo adaptive fast-io
status /var/log/openvpn/status.log 10 log /var/log/openvpn/server.log verb 4 mute 20
Performance tuning
sndbuf 393216 rcvbuf 393216 push "sndbuf 393216" push "rcvbuf 393216" ```_
Site-to-Site Konfiguration
```bash
Site A server configuration
/etc/openvpn/site-to-site.conf
dev tun ifconfig 10.8.0.1 10.8.0.2 secret static.key comp-lzo keepalive 10 60 ping-timer-rem persist-tun persist-key
Add routes to remote networks
route 192.168.2.0 255.255.255.0
Site B server configuration
/etc/openvpn/site-to-site.conf
remote site-a.company.com dev tun ifconfig 10.8.0.2 10.8.0.1 secret static.key comp-lzo keepalive 10 60 ping-timer-rem persist-tun persist-key
Add routes to remote networks
route 192.168.1.0 255.255.255.0 ```_
Client Konfiguration
Grundlegende Konfiguration des Clients
```bash
client.ovpn
client dev tun proto udp remote vpn.company.com 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client.crt key client.key tls-auth ta.key 1 cipher AES-256-CBC auth SHA256 verb 3 ```_
Inline Client Konfiguration
```bash
client-inline.ovpn
client dev tun proto udp remote vpn.company.com 1194 resolv-retry infinite nobind persist-key persist-tun cipher AES-256-CBC auth SHA256 verb 3
Client-spezifische Konfiguration
```bash
/etc/openvpn/ccd/client1
ifconfig-push 10.8.0.10 10.8.0.11 push "route 192.168.10.0 255.255.255.0" iroute 192.168.10.0 255.255.255.0
/etc/openvpn/ccd/client2
ifconfig-push 10.8.0.20 10.8.0.21 push "route 192.168.20.0 255.255.255.0" iroute 192.168.20.0 255.255.255.0 push "redirect-gateway def1" ```_
Service Management
Systemierte Servicesteuerung
```bash
Start OpenVPN server
sudo systemctl start openvpn-server@server sudo systemctl enable openvpn-server@server
Start OpenVPN client
sudo systemctl start openvpn-client@client sudo systemctl enable openvpn-client@client
Check service status
sudo systemctl status openvpn-server@server sudo systemctl status openvpn-client@client
View logs
sudo journalctl -u openvpn-server@server -f sudo journalctl -u openvpn-client@client -f
Restart services
sudo systemctl restart openvpn-server@server sudo systemctl reload openvpn-server@server ```_
Handbuch Service Control
```bash
Start server manually
sudo openvpn --config /etc/openvpn/server/server.conf --daemon
Start client manually
sudo openvpn --config /etc/openvpn/client/client.conf --daemon
Start with logging
sudo openvpn --config /etc/openvpn/server/server.conf --log /var/log/openvpn.log
Kill OpenVPN processes
sudo pkill openvpn sudo killall openvpn ```_
Netzwerkkonfiguration
IP Forwarding und NAT
```bash
Enable IP forwarding
echo 'net.ipv4.ip_forward=1'|sudo tee -a /etc/sysctl.conf sudo sysctl -p
Configure iptables NAT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE sudo iptables -A INPUT -i tun+ -j ACCEPT sudo iptables -A FORWARD -i tun+ -j ACCEPT sudo iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Save iptables rules
sudo iptables-save > /etc/iptables/rules.v4
UFW configuration
sudo ufw allow 1194/udp sudo ufw allow in on tun0 sudo ufw allow out on tun0 ```_
Routing Configuration
```bash
Add static routes
sudo ip route add 192.168.2.0/24 via 10.8.0.2 dev tun0
Persistent routes in /etc/network/interfaces
auto tun0 iface tun0 inet manual up ip route add 192.168.2.0/24 via 10.8.0.2 dev tun0 down ip route del 192.168.2.0/24 via 10.8.0.2 dev tun0
Route all traffic through VPN
sudo ip route add 0.0.0.0/1 via 10.8.0.1 dev tun0 sudo ip route add 128.0.0.0/1 via 10.8.0.1 dev tun0 ```_
DNS Konfiguration
```bash
Configure DNS for VPN clients
In server.conf
push "dhcp-option DNS 192.168.1.1" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DOMAIN company.local"
Client-side DNS configuration
/etc/systemd/resolved.conf
[Resolve] DNS=192.168.1.1 8.8.8.8 Domains=company.local
Manual DNS configuration
echo "nameserver 192.168.1.1"|sudo tee /etc/resolv.conf echo "nameserver 8.8.8.8"|sudo tee -a /etc/resolv.conf ```_
Sicherheitskonfiguration
Authentifizierungsmethoden
```bash
Certificate-based authentication (default)
ca ca.crt cert client.crt key client.key
Username/password authentication
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env username-as-common-name script-security 3
Two-factor authentication
auth-user-pass auth-user-pass-verify /etc/openvpn/google-authenticator.sh via-env
LDAP authentication
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login ```_
Verschlüsselung und Sicherheit
```bash
Strong encryption settings
tls-version-min 1.2 tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 cipher AES-256-GCM auth SHA256 ncp-ciphers AES-256-GCM:AES-128-GCM
Perfect Forward Secrecy
tls-auth ta.key 0 key-direction 0
Certificate verification
remote-cert-tls server remote-cert-eku "TLS Web Server Authentication" verify-x509-name server_name name
Additional security
auth-nocache tls-verify /etc/openvpn/verify-cn.sh ```_
Zugriffskontrolle
```bash
Client certificate revocation
crl-verify /etc/openvpn/crl.pem
IP-based access control
In client-specific config
ifconfig-push 10.8.0.100 10.8.0.101 iroute 192.168.100.0 255.255.255.0
Time-based access control
Custom script in auth-user-pass-verify
!/bin/bash
current_hour=$(date +%H) if [ $current_hour -ge 9 ] && [ $current_hour -le 17 ]; then exit 0 else exit 1 fi ```_
Überwachung und Protokollierung
Statusüberwachung
```bash
Server status file
status /var/log/openvpn/status.log 10
View current connections
cat /var/log/openvpn/status.log
Management interface
management localhost 7505 management-client-auth management-client-pf
Connect to management interface
telnet localhost 7505 ```_
Logging Konfiguration
```bash
Logging levels
verb 0 # No output except fatal errors verb 1 # Startup info + connection initiation verb 2 # + connection handshake verb 3 # + show options verb 4 # + show parameters verb 5 # + show 'R' and 'W' characters verb 6 # + show TCP/UDP reads/writes verb 9 # + show TLS debugging info
Log files
log /var/log/openvpn/server.log log-append /var/log/openvpn/server.log
Syslog
syslog openvpn-server
Custom logging script
learn-address /etc/openvpn/learn-address.sh ```_
Leistungsüberwachung
```bash
Connection statistics
echo "status"|nc localhost 7505
Bandwidth monitoring
vnstat -i tun0 iftop -i tun0
System resource monitoring
top -p $(pgrep openvpn) htop -p $(pgrep openvpn)
Network latency
ping -I tun0 8.8.8.8 mtr -I tun0 8.8.8.8 ```_
Fehlerbehebung
Gemeinsame Themen
```bash
Connection problems
Check firewall rules
sudo iptables -L -n sudo ufw status
Check routing
ip route show ip route show table all
Check DNS resolution
nslookup vpn.company.com dig vpn.company.com
Test connectivity
ping -c 4 vpn.company.com telnet vpn.company.com 1194 nc -u vpn.company.com 1194
Certificate issues
openssl x509 -in client.crt -text -noout openssl verify -CAfile ca.crt client.crt ```_
Debug Befehle
```bash
Verbose logging
openvpn --config client.conf --verb 9
Test configuration
openvpn --config server.conf --test-crypto
Check certificates
openvpn --show-certs --config client.conf
Network debugging
tcpdump -i any port 1194 wireshark -i any -f "port 1194"
Process debugging
strace -p $(pgrep openvpn) lsof -p $(pgrep openvpn) ```_
Analyse der Ergebnisse
```bash
Common log messages
grep "Initialization Sequence Completed" /var/log/openvpn/server.log grep "TLS Error" /var/log/openvpn/server.log grep "AUTH_FAILED" /var/log/openvpn/server.log grep "VERIFY ERROR" /var/log/openvpn/server.log
Connection analysis
awk '/CLIENT_LIST/ \\{print $2, $3, $4, $5\\}' /var/log/openvpn/status.log
Error patterns
| grep -E "(ERROR | FATAL | WARNING)" /var/log/openvpn/server.log | ```_
Erweiterte Konfiguration
Last Balancing
```bash
Multiple server instances
/etc/openvpn/server1.conf
port 1194 dev tun1 server 10.8.1.0 255.255.255.0
/etc/openvpn/server2.conf
port 1195 dev tun2 server 10.8.2.0 255.255.255.0
Client configuration with multiple servers
remote vpn1.company.com 1194 remote vpn2.company.com 1195 remote-random ```_
Hohe Verfügbarkeit
```bash
Keepalived configuration for HA
/etc/keepalived/keepalived.conf
vrrp_script chk_openvpn \\{ script "/bin/pgrep openvpn" interval 2 weight 2 fall 3 rise 2 \\}
vrrp_instance VI_1 \\{ state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 authentication \\{ auth_type PASS auth_pass mypassword \\} virtual_ipaddress \\{ 192.168.1.100 \\} track_script \\{ chk_openvpn \\} \\} ```_
Leistung Tuning
```bash
Buffer sizes
sndbuf 393216 rcvbuf 393216 push "sndbuf 393216" push "rcvbuf 393216"
Compression
comp-lzo adaptive compress lz4-v2 push "compress lz4-v2"
Fast I/O
fast-io
TCP optimization
tcp-nodelay socket-flags TCP_NODELAY
Threading
nice -10 ```_
Skript und Automatisierung
```bash
Client connect script
client-connect /etc/openvpn/client-connect.sh
!/bin/bash
/etc/openvpn/client-connect.sh
echo "Client $common_name connected from $trusted_ip" echo "$(date): $common_name connected" >> /var/log/openvpn/connections.log
Client disconnect script
client-disconnect /etc/openvpn/client-disconnect.sh
!/bin/bash
/etc/openvpn/client-disconnect.sh
echo "Client $common_name disconnected" echo "$(date): $common_name disconnected" >> /var/log/openvpn/connections.log
Learn address script
learn-address /etc/openvpn/learn-address.sh
!/bin/bash
/etc/openvpn/learn-address.sh
case "$1" in add|update) echo "$(date): $1 $2 $3" >> /var/log/openvpn/addresses.log ;; delete) echo "$(date): $1 $2" >> /var/log/openvpn/addresses.log ;; esac ```_
Best Practices
Sicherheit Best Practices
```bash
Use strong encryption
cipher AES-256-GCM auth SHA256 tls-version-min 1.2
Certificate security
Use 4096-bit RSA keys
Implement certificate revocation
Regular certificate rotation
Network security
Use non-standard ports
Implement fail2ban
Regular security audits
Access control
Implement least privilege
Use client-specific configurations
Monitor and log all connections
```_
Operationelle Best Practices
```bash
Configuration management
Version control configurations
Test changes in staging
Document all modifications
Monitoring
Implement comprehensive logging
Set up alerting for failures
Regular performance monitoring
Backup and recovery
Regular configuration backups
Certificate backup procedures
Disaster recovery planning
Maintenance
Regular updates and patches
Certificate renewal procedures
Performance optimization reviews
```_
Beschäftigung Erwägungen
```bash
Capacity planning
Estimate concurrent users
Plan for peak usage
Monitor resource utilization
Network design
Plan IP address allocation
Consider routing requirements
Implement proper segmentation
Scalability
Design for horizontal scaling
Implement load balancing
Plan for geographic distribution
Compliance
Meet regulatory requirements
Implement audit logging
Document security controls
```_
Ressourcen
- OpenVPN Offizielle Dokumentation
- OpenVPN Community Wiki
- (__LINK_5___)
- OpenVPN Security Advisory
- (OpenVPN Cookbook)(_LINK_5__)