Debian OpenVPN

Aus Wiki
Zur Navigation springen Zur Suche springen

Allgemein

Öffentliche WLAN's sind meist nicht vertrauenswürdig und könnten abgehört werden. Um dies zu verhindern, kann mittels OpenVPN ein verschlüsselter Tunnel zum eigenen Server und von dort ins Internet aufgebaut werden. Dadurch ist es selbst für die gewieftesten Hacker nicht möglich, die Verbindung zu belauschen.

Neben dem hier beschriebenen OpenVPN, das SSL/TLS verwendet, existieren noch weitere VPN-Verfahren, wie z.B. IPSec. OpenVPN benötigt SSL-Zertifikate auf Server- und Client-Seite.


Installation

apt-get install openvpn openssl iptables iptables-persistent


Bulbgraph.png Hinweis:

Falls OpenVPN in einem LXC-Container installiert werden soll, muss Zugriff auf das tun-Device erteilt werden. Folgende Schritte sind nur erforderlich, wenn OpenVPN im LXC-Container betrieben werden soll.

Auf dem LXC-Host (physikalischer PC):

vi /var/lib/lxc/CONTAINER/config

Folgende Zeilen einfügen (vor den mountpoints):

#tun
lxc.cgroup.devices.allow = c 10:200 rwm

im LXC-Container:

mkdir /dev/net
mknod /dev/net/tun c 10 200
chmod 666 /dev/net/tun


Konfiguration

OpenVPN verwendet standarmäig den Port 1194 (OPENVPN_PORT). Falls nicht der Standardport verwendet werden soll (z.B. geringere Gefahr, dass der Port versucht wird gehackt zu werden), den Port entsprechend anpassen. Bei eigenen Versuchen wurde festgestellt, dass der Port in der OpenVPN Konfiguration identisch sein muss mit dem Port, aus dem OpenVPN später aus dem Internet erreicht werden soll. Eine unterschiedliche Portnummer, unter dem OpenVPN aus dem Internet erreicht werden soll und intern, funktioniert im Gegensatz zu vielen anderen Internetdiensten (z.B. Webserver, Mailserver, FTP, ...) nicht.

Z.B. Internet Port 5555->DSL-Router Port 5555->OpenVPN Port 1194 funktioniert nicht.
Internet Port 5555->DSL-Router Port 5555->OpenVPN Port 5555 funktioniert dagegen.

Server Konfiguration:

vi /etc/openvpn/server.conf

Folgende Zeilen einfügen (OPENVPN_PORT, IP_DNS_SERVER [z.B. 192.168.178.1] und LOCAL_LAN [z.B. 192.168.178.0]):

port OPENVPN_PORT
proto tcp
dev tun
server 10.8.0.0 255.255.255.0

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

cipher BF-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
push "route LOCAL_LAN 255.255.255.0"
push "dhcp-option DNS IP_DNS_SERVER"
push "redirect-gateway def1"
keepalive 10 120


Schlüssel und Zertifikate

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
cd /etc/openvpn/easy-rsa/2.0
mkdir keys
vi vars

Folgende Parameter am Fileende anpassen

export KEY_COUNTRY="DE"
export KEY_PROVINCE="Bavaria"
export KEY_CITY="Other"
export KEY_ORG="Private"
export KEY_EMAIL="webmaster@domain.org"

Generieren der Schlüssel:

source vars
./clean-all
./build-dh

Bei folgenden Befehlen werden Optionen abgefragt, die teilweise bereits im vars-File editiert wurden. Diese Default-Werte sind bereits in [] angegeben und können mit der ENTER-Taste übernommen werden. Die Parameter bei Bedarf anpassen

./build-ca
./build-key-server server
  • Die Frage "Sign the certificate? [y/n]:" mit y beantworten
  • Die Frage "1 out of 1 certificate requests certified, commit? [y/n]" mit y beantworten


Anlegen eines Client-Zertifikates für den User tux, das auf den Client-PC übertagen werden muss. Die abgefragten Optionen evtl. anpassen - insbesondere der Common Name [CN] und Email-Adresse sollten angepasst werden.

./build-key tux
  • Die Frage "A challenge password []:" mit enter bestätigen
  • Die Frage "An optional company name []:" mit enter bestätigen
  • Die Frage "Sign the certificate? [y/n]:" mit y beantworten
  • Die Frage "1 out of 1 certificate requests certified, commit? [y/n]" mit y beantworten
Bulbgraph.png Hinweis:

Für jeden Client, der sich per VPN anmelden soll, sollte ein eigenes Client-Zertifikat angelegt werden. Dies dient der Sicherheit.


Die generierten Schlüssel und Zertifikate ins Verzeichnis /etc/openvpn/keys kopieren

mkdir -p /etc/openvpn/keys
cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn/keys/


OpenVPN Server starten

/etc/inti.d/openvpn start


Firewall Regeln

OpenVPN verwendet für den IP-Tunnel zwischen Server und Client einen anderen IP-Adressbereich als der Server selbst. Deshalb sind Firewall Regeln erforderlich, die für ein IP-Forwarding der übertragenen Daten zwischen den IP-Bereichen sorgen.

Internet und Lan Zugriff

Firewall-Script:

vi /usr/local/bin/firewall.sh

Folgende Zeilen einfügen (vpnserver anpassen):

#!/bin/bash

vpnserver="192.168.178.5"
vpnnet="10.8.0.0/24"

iptables -t filter -F
iptables -t nat -F

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $vpnnet-j ACCEPT
iptables -A FORWARD -j REJECT

iptables -t nat -A POSTROUTING -s $vpnnet-o eth0 -j SNAT --to $vpnserver
iptables -t nat -A POSTROUTING -s $vpnnet-j MASQUERADE


Internetzugriff, kein LAN Zugriff

Soll das LAN geschützt bleiben, und nur Internetzugriff für VPN Clients zur Verfügung gestellt werden, folgendes Firewall-Script verwenden:

vi /usr/local/bin/firewall.sh

Folgende Zeilen einfügen (vpnserver, lan und dnsserver anpassen):

#!/bin/bash

vpnnet="10.8.0.0/24"
vpnserver="192.168.178.5"
lan="192.168.178.0/24"
dnsserver="192.168.178.1"

iptables -t filter -F
iptables -t nat -F

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $vpnnet-d $lan -j REJECT
iptables -A FORWARD -p udp -s $vpnnet-d $dnsserver --dport 53 -j ACCEPT
iptables -A FORWARD -s $vpnnet-j ACCEPT
iptables -A FORWARD -j REJECT

iptables -t nat -A POSTROUTING -s $vpnnet-o eth0 -j SNAT --to $vpnserver
iptables -t nat -A POSTROUTING -s $vpnnet-j MASQUERADE


Firewall aktivieren

chmod +x /usr/local/bin/firewall.sh
/usr/local/bin/firewall.sh

IP-Forwarding aktivieren:

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-openvpn.conf
echo 1 > /proc/sys/net/ipv4/ip_forward 
sysctl -p /etc/sysctl.d/20-openvpn.conf

Firewall-Regeln beim Systemstart aktivieren:

vi /etc/rc.local

Folgende Zeile vor exit 0 einfügen:

/usr/local/bin/firewall.sh


OpenVPN aus dem Internet erreichbar

im Internet Router eine Portfreigabe für den Port OPENVPN_PORT zur IP-Adresse des OpenVPN Servers zum Zielport OPENVPN_PORT einrichten.


Client

Android

Unter Android sind zahlreiche Apps für OpenVPN verfügbar. Im folgenden wird die App "OpenVPN für Android" von Andre Schwabe verwendet und beschrieben, mit der sehr gute Ergebnisse erziehlt wurde. Diese App funktioniert ohne root-Rechte auf dem Handy. Nach der Installation der APP folgendermaßen vorgehen:

  • Die oben erstellten Zertifikate (ca.crt, user.crt und user.key) aufs Handy übertragen
  • App starten
  • Im Reiter Profile das + Symbol inter Fußzeile betätigen
  • Einen Profilnamen eingeben z.B. Zuhause und mit OK bestätigen
  • Grundeinstellungen aktivieren
    • Unter Server die Domain eingeben domain.org
    • Server Port: OPENVPN_PORT
    • von UDP auf TCP umschalten
    • LZO Komprimierung aktivieren
    • Unter Typ Zertifikate auswählen
    • CA Zertifikat: ca.crt suchen, anklicken und unten den Button Auswählen anklicken
    • Clientzertifikat: user.crt suchen, anklicken und unten den Button Auswählen anklicken
    • Clientzertifikatsschlüssel: user.key suchen, anklicken und unten den Button Auswählen anklicken
    • Mit Android Zurück Button ins Profilmenü zurückkehren
  • Authentifizierung/Verschlüsselung anwählen
    • Erwarte TLS Server: aktivieren
    • Zertifikat Namen überprüfen: aktivieren
    • Mit Android Zurück Button ins Profilmenü zurückkehren
  • Mit Android Zurück Button ins Hauptmenü zurückkehren
  • angelegtes Profil anklicken, um die Verbindung mit dem OpenVPN Server herzustellen


Windows

Der Windows Client von OpenVPN erfordert ein Profil im .ovpn Format, das mit einem Texteditor angelegt werden muss. Es gibt leider keine Bedienoberfläche dafür im Client selbst.

  • Die oben erstellten Zertifikate (ca.crt, user.crt und user.key) auf den Windows-PC kopieren
  • OpenVPN Desktop Client (nicht OpenVPN Access Client) unter: http://openvpn.net/index.php?option=com_content&id=357 downloaden und installieren.
  • Client-Profil erstellen:
    • Texteditor öffnen
    • Folgende Zeilen eingeben (domain.org,OPENVPN_PORT, und PATH_TO_CERTS anpassen) und Datei unter beliebigen Namen mit Endung .ovpn abspeichern:
client
dev tun
proto tcp
remote domain.org OPENVPN_PORT
resolv-retry infinite
nobind
persist-key
persist-tun
ca "PATH_TO_CERTS\ca.crt"
cert "PATH_TO_CERTS\user.crt"
key "PATH_TO_CERTS\user.key"
ns-cert-type server
comp-lzo
cipher BF-CBC
verb 3
  • OpenVPN Client starten
  • Neben Connection Profiles das + Symbol anklicken
  • Local File selektieren und Button Import anwählen
  • Angelegtes Profil auswählen
  • Im erscheinenden Fenster Completely trust this profile selektieren und save anwählen.
  • Im OpenVPN Fenster das angelegte Profil doppelklicken, um eine Verbindung herzustellen.
  • Nach wenigen Sekunden sollte im OpenVPN Fenster die Server IP-Adresse mit dem Status connected angezeigt werden.
  • Mit dem Button Disconnect kann die Verbindung wieder getrennt werden


Optional: Zusätzliche Authentifizierung mit Username/Passwort

Zur Erhöhung der Sicherheit kann zusätzlich zur Verwendung von Client-Zertifikaten noch eine Username/Passwort Abfrage hinzugefügt werden.

Serverkonfiguration

vi /etc/openvpn/server.conf

Unter Debian Squeeze folgende Zeile hinzufügen:

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

Unter Debian Wheezy folgende Zeile hinzufügen:

plugin /usr/lib/openvpn/openvpn-auth-pam.so login

Unter Debian Jessie folgende Zeile hinzufügen:

plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login

Als User und Passwort werden "normale" Linux- Accountdaten verwendet. Falls nicht vorhanden, Linux-User auf bekannte Art und Weise anlegen.


Windows Client

Dem .ovpn File folgende Zeile ans Ende anfügen:

auth-user-pass

.ovpn-File erneut im Client importieren (vorher die vorhandene Konfiguration entfernen mit Rechtsklick auf das Profil und Auswahl von "Delete").


Android Handy

  • OpenVPN CLient starten
  • die Einstellungen des bereits vorhandenen Profils öffnen (Einstellungsbutton am rechten Bildschirmrand anwählen)
  • Grundeinstellungen selektieren
  • Typ auf Nutzer/PW + Zertifikate ändern
  • Nun kann am unteren Rand (unter Clientzertifikatsschlüssel) Benutzername und evtl. Passwort eingegeben werden