Securing Internet Access on WRT via OpenVPN

From
Jump to navigation Jump to search

Voraussetzungen

Es müssen auf den Endpunkten die openvpn-binaries inkl. aller Bibliotheken vorhanden sein (liblzo, libopenssl); TUN/TAP-Device muss auf dem System vorhanden sein (Kernel-Modul, Treiber)

CA und Zertifikate erstellen

CA Key + Cert-Req.

$ mkdir private
$ openssl genrsa -out private/ca.key 2048   # RSA-CA-Key erstellen
$ openssl req -new -x509 -days 3650 -key private/ca.key -out ca.cert -set_serial 1  # CA-Zertifikat erstellen (ca.cert)

Keys und Zertifikate für Server/Client

$ echo 01 > serial
$ mkdir certs

$ openssl req -new -newkey rsa:1024 -out certs/server.csr -nodes -keyout private/server.key -days 3650  
# Cert-Request für Server 
$ openssl x509 -req -in certs/server.csr -out certs/server.cert -CA ca.cert -CAkey private/ca.key -CAserial serial -days 3650  
# Cert aus Request

$ openssl req -new -newkey rsa:1024 -out certs/client01.csr -nodes -keyout private/client01.key -days 3650  
# Cert-Request für 1. Client 
$ openssl x509 -req -in certs/client01.csr -out certs/client01.cert -CA ca.cert -CAkey private/ca.key -CAserial serial -days 3650  
# Cert aus Request

OpenVPN-Server-Konfiguration (/etc/openvpn/openvpn-server.conf)

# Zeilen-Kommentare koennen mit # oder ; eingeleitet werden.
# Dabei hat es sich durchgesetzt # für echte Kommentare zu verwenden und 
# ; zum Ausschalten von nicht gewuenschten Konfigurations-Parametern.

cd /etc/openvpn           # Setzt cwd des Prozesses (fuer relative Pfadangaben)
;local 192.168.x.y        # Lauscht nur auf der angegebenen IP-Adresse, hier: alle Adressen
proto udp
port 1194

dev tun                   # Benutzt das naechste freie tun-Device, falls unterstuetzt
                          # (unter MacOSX muss man z.B. /dev/tun0 oder /dev/tun1, ... angeben)

# Angaben fuer die TLS-Verbindung (pkcs#12-Container oder 3 einzelne Dateien)
;pkcs12 server.p12        # pkcs#12-Datei sofern unterstuetzt (nicht unter OpenWrt!)
ca ca.cert                # Alternativ: CA-Zert.
cert server.cert          # Alternativ: Server-Zert.
key server.key            # Alternativ: Server-Key
;crl-verify crl.pem       # (optional) CRL-Liste mit gesperrten Zertifikaten

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh1024.pem 1024
dh dh1024.pem

server 192.168.200.0 255.255.255.0   # IP-Subnetz fuer Tunnel-Enden (wird auf tun-Device gesetzt)
;duplicate-cn                        # Auskommentieren, wenn 1 Zert./Key-Paar fuer mehrere
                                     # Clienten benutzt werden soll

keepalive 30 300                     # Anpassung fuer "Hello"-Pakete, default: 10 120

# Zusaetzlicher DoS-Schutz
# Erzeuge preshared.key mit:
#    openvpn --genkey --secret preshared.key
tls-auth preshared.key 0

comp-lzo                             # Komprimiere Pakete vor dem Verschluesseln

# Gebe root-Rechte auf UNIX-Systemen nach dem Erzeugen der TUN/TAP-Devices ab 
user nobody group nobody persist-key persist-tun

verb 0                               # Kein logging nach der Testphase

float                                # Ignoriere IP-Adress-Aenderungen des Clients

OpenVPN-Client-Konfiguration (/etc/openvpn/openvpn-client.conf)

cd /etc/openvpn           # Setzt cwd des Prozesses (fuer relative Pfadangaben)

proto udp
remote 192.168.x.y 1194   # Legt VPN-Server fest (z.B. WLAN-IP-Adresse des Servers)
nobind                    # Kein Binden des Ports

resolv-retry infinite     # Versuche immer weiter ein Verbindung herzustellen 

dev tun                   # Benutzt das naechste freie tun-Device, falls unterstuetzt
                         # (unter MacOSX muss man z.B. /dev/tun0 oder /dev/tun1, ... angeben)

# Angaben fuer die TLS-Verbindung (pkcs#12-Container oder 3 einzelne Dateien)
;pkcs12 client01.p12        # pkcs#12-Datei sofern unterstuetzt (nicht unter OpenWrt!)
ca ca.cert                # Alternativ: CA-Zert.
cert client01.cert          # Alternativ: Server-Zert.
key client01.key            # Alternativ: Server-Key

client                               # Client-Modus

keepalive 30 300                     # Anpassung fuer "Hello"-Pakete, default: 10 120

# Braucht preshared.key vom Server
tls-auth preshared.key 1

comp-lzo                             # Komprimiere Pakete vor dem Verschluesseln

# Gebe root-Rechte auf UNIX-Systemen nach dem Erzeugen der TUN/TAP-Devices ab user nobody group nobody persist-key persist-tun

verb 0                               # Kein logging nach der Testphase

redirect-gateway                     # - Setze default-Gateway auf anderes Tunnel-Ende
                                    # - Erstelle Host-Route zum VPN-Server ueber ungesichertes Netz

OpenVPN starten

Debug-Modus

$ openvpn --conf /etc/openvpn/openvpn-(server|client).conf --verb 4

Regulaerer Betrieb

$ openvpn --conf /etc/openvpn/openvpn-(server|client).conf --daemon

iptables-Regeln setzen

Nachdem Pings durchkommen, Forwarding + MASQ. einrichten (tun0 = OpenVPN-Tunnel, ppp0 = DSL-Device):

$ echo 1 > /proc/sys/net/ipv4/ip_forward                        # Routing an
$ iptables -A INPUT  -p udp --dport 1194 -j ACCEPT              # Eingehende VPN-Pakete erlauben
$ iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT              # Ausgehende VPN-Pakete erlauben
$ iptables -A FORWARD -i tun0 -o ppp0 -j ACCEPT                 # Pakete weiterleiten
$ iptables -A FORWARD -o tun0 -i ppp0 -j ACCEPT 
$ iptables -t nat -A POSTROUTING -i tun0 -o ppp0 -j MASQUERADE  # Pakete ins Internet maskieren