Blog @ herzog.network

OpenVPN via SSH Tunnel

Nur ganz kurz als reine Dokumentation ohne viel Erklärung.
OpenVPN Verbindung zwischen zwei Debian10 Hosts durch einen SSH Tunnel.

Bei dieser Konfiguration wurde wenig auf Hardening geachtet, da die Server durch eine Firewall nur sehr eingeschränkt kommunizieren dürfen. Certificate Authority sollte man grundlegend natürlich nicht auf dem OpenVPN Server betreiben. Des Weiteren können unterschiedliche Clients die gleichen Zertifikate nutzen (duplicate-cn). Diese Punkte und weitere Überlegungen sollten bei einem eventuellen produktiven Betrieb beachtet und optimiert werden.

Server

nano /etc/sysctl.conf
    # Uncomment the next line to enable packet forwarding for IPv4
    net.ipv4.ip_forward=1
sysctl -p
cd ~
apt update && apt install openvpn iptables-persistent -y
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar xvf EasyRSA-3.0.8.tgz
cd EasyRSA-3.0.8
cp vars.example vars
nano vars
    set_var EASYRSA_REQ_COUNTRY     "US"
    set_var EASYRSA_REQ_PROVINCE    "California"
    set_var EASYRSA_REQ_CITY        "San Francisco"
    set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
    set_var EASYRSA_REQ_EMAIL       "dont@email.me"
    set_var EASYRSA_REQ_OU          "My Organizational Unit"
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
./easyrsa gen-dh
openvpn --genkey --secret ta.key
cp ta.key /etc/openvpn/
cp pki/ca.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/
cp pki/issued/server.crt /etc/openvpn/
cp pki/dh.pem /etc/openvpn/
./easyrsa gen-req client nopass
./easyrsa sign-req client client
cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client.crt /etc/openvpn/client/
cp pki/private/client.key /etc/openvpn/client/
## ggf Interface anpassen:
iptables -t nat -A POSTROUTING -s 172.9.0.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/iptables/rules.v4

/etc/openvpn/server.conf

port 443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 172.9.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
duplicate-cn
verb 3
explicit-exit-notify 0

Client

Folgende Dateien vom Server auf den Client übertragen und unter /etc/openvpn ablegen

/etc/openvpn/client/ca.crt .
/etc/openvpn/client/client.crt .
/etc/openvpn/client/client.key .
/etc/openvpn/ta.key .
## Key generieren und pub key auf server hinterlegen
ssh-keygen -t rsa -b 4096

apt update && apt install openvpn iptables-persistent autossh -y

WICHTIG:
Es muss zwingend eine Route für den SSH Tunnel hinterlegt werden, da OpenVPN ansonsten alle Verbindungen blockt, der SSH Tunnel seine Route verliert und in Folge dessen auch die VPN Verbindung sofort nach dem Aufbau wieder abbricht.

nano /etc/network/if-up.d/sshtun

#!/bin/sh
# ovpnserver und default_gw
# mit den entsprechenden IP Adressen ersetzen und ggf Interface anpassen
if [ "$IFACE" = "ens32" ]; then
    ip route add ovpnserver via default_gw
fi

/etc/openvpn/client.conf

client
dev tun
proto tcp
remote localhost 443
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
verb 3

Dienste starten

Server

systemctl start openvpn@server
systemctl enable openvpn@server

Client

## via crontab einbinden:
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -f root@ovpnserver -N -L 443:localhost:443

systemctl start openvpn@client
systemctl enable openvpn@client

Weiterführendes

  • https://openvpn.net/community/
  • https://www.harding.motd.ca/autossh/
  • https://www.mybluelinux.com/debian-permanent-static-routes/
  • https://github.com/sshuttle/sshuttle - Mögliche Alternative (ungetestet)




So long -
herzog


Hast du Fragen oder Anregungen?
Erstelle ein Ticket auf GitHub, frag mich auf Twitter oder
schreib mir eine E-Mail.