Debian OpenVPN
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
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
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
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