DEBIAN OPENVPN FAQ (Stand 26.05.2013) [ © Oliver Schuetz aka OppTupacShakur | http://OPPServer.net | http://unix.oppserver.net ] Als root einloggen!!! Die IP Range 10.11.12.x kann natuerlich gegen jede andere Private IP Range gewechselt werden, z.B. 192.168.100.x. Bevor wir OpenVPN installieren, pruefen wir ob es das tun device gibt: cat /dev/net/tun Falls man die Meldung "File descriptor in bad state" bekommt, ist alles in Ordnung. Falls nicht, kann man versuchen das Device anzulegen: mkdir -p /dev/net mknod /dev/net/tun c 10 200 chmod 600 /dev/net/tun Falls dies auch nicht hilft, muss man seinen Server/VPS/VServer Provider bitten tun/tap zu aktivieren. Zunaechst installieren wir openVPN auf dem Server und auf dem Client: aptitude install openvpn Dann stellen wir sicher, dass keine ungewollten Configs herumschwirren (openVPN erstellt gerne Samples) und loeschen die Dateien (nicht die Ordner) innerhalb von /etc/openvpn: rm -rf /etc/openvpn/examples Auf dem Server erstellen wir unsere Schluessel und Zertifikate. Daher kopieren wir die easy-rsa-Tools von openVPN ins Config-Verzeichnis: cp -rf /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa Nun bereiten wir das easy-rsa-Tool auf das Erstellen der Zertifikate und Schluessel vor: Dazu editieren wir zunaechst die vars mit userem Lieblingseditor (z.B. nano /etc/openvpn/easy-rsa/vars). Dabei interessieren eigentlich nur die Werte fuer "KEY_SIZE", wo wir 2048 nehmen, "CA_EXPIRE", wo wir fuer die Ewigkeit 7300 (20 Jahre) nehmen, "KEY_EXPIRE", wo wir 7300 (20 Jahre) nehmen, und "KEY_COUNTRY", "KEY_PROVINCE", "KEY_CITY", "KEY_ORG" und "KEY_EMAIL", was wohl selbsterklaerend ist. Damit diese Werte verwendet werden, lesen wir sie in unsere Shell-Sitzung ein: . ./vars Um zunaechst reinen Tisch zu machen, fuehren wir das Clean-Tool aus, erstellen eine neue CA und erzeugen einen Diffie-Hellman-Parameter mit 2048 Bit: ./clean-all ./build-ca ./build-dh Wenn die Erzeugung des Diffie-Hellman-Paramters abgeschlossen ist, erzeugen wir nun noch ein Server-Zertifikat: ./build-key-server [Server-Name] Bei [Server-Name] koennen wir dabei einsetzen, was wir wollen. Wichtig ist dabei, dass der Name (CN) absolut eindeutig bleibt. Auch sollte bedacht werden, dass wir fuer verschiedene Configs nicht mehrere Zertifikat-Key-Paare benoetigen. Wir muessen also keine komplizierten Namen bestehend aus Verwendungszweck und Hostnamen verwenden. Ich empfehle ein simples "openVPN-Server". Was genau da nun drinsteht, interessiert letztendlich niemanden mehr. Um nun Client-Zertifikate zu erstellen, ist ab sofort nur noch folgendes Procedere noetig, uebrigens wann immer man moechte: . ./vars ./build-key [Client-Name] Am Ende mit 2x y bestaetigen. Bitte auch hier auf die Eindeutigkeit des Client-Namens achten. Nun legen wir noch einen Link fuer die Keys an und erstellen das client dir: ln -s /etc/openvpn/easy-rsa/keys /etc/openvpn/keys mkdir /etc/openvpn/clients Jetzt legen wir auf dem Server eine Config unter /etc/openvpn/ an, z.B. "server.conf". Die endung ".conf" ist dabei fuer den Daemon wichtig, denn alle .conf-Dateien in diesem Verzeichnis werden vom Init-Script automatisch bei Systemstart gestartet und beim Shutdown gestoppt: # Diese Config initiiert einen Server mit mehreren Clients mode server # zusaetzlich TLS-Authentication-Server tls-server # lokale IP local [IP des Servers] # Um die Rechte einzuschraenken user nobody group nogroup # Port (beliebig, nur mind. 4-stellig) port 5000 # UDP ist Pflicht fuer TAP, wir nutzen aber TUN ;proto udp proto tcp # Das Device muss fuer bridging TAP sein, wir nutzen aber TUN ;dev tap dev tun # Hiermit vergeben wir dem Server und den Clients IPs server 10.11.12.0 255.255.255.0 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/[Server-Name].crt key /etc/openvpn/keys/[Server-Name].key dh /etc/openvpn/keys/dh2048.pem # Wir komprimieren, um die Bandbreite zu verbessern comp-lzo # Welcher Verschluesselungs-Algorithmus? cipher AES-256-CBC # Aufrechterhaltung der Verbindung keepalive 10 120 # Client-to-Client-Traffic erlauben client-to-client # Clients mit selben Key erlauben zu verbinden duplicate-cn # Max. Anzahl an Clients erlauben max-clients 100 # einige log Configs persist-key persist-tun status openvpn-status.log verb 3 nice -10 # Clients eigene Configs zuteilen (siehe unten) client-config-dir clients Jetzt bekommt jeder normale Benutzer eine IP-Adresse von 10.11.12.0/24. Unsere "speziellen" Benutzer muessen noch mithilfe des common names vom Zertifikat spezielle Regeln bekommen, dazu gibt es den Befehl client-config-dir . client-config-dir clients Je nach common name vom Zertifikat wird jetzt die Konfiguration clients/[Client-Name] aufgerufen. Jetzt brauchen wir nur noch Dateien fuer die entsprechenden Benutzer erstellen: clients/client1: ifconfig-push 10.11.12.6 10.11.12.5 clients/client2: ifconfig-push 10.11.12.10 10.11.12.9 ifconfig-push weisst den Clients eine virtuelle IP zu, die kann dann per routing auf die entsprechenden Server gerouted werden. Die erste IP-Adresse gibt die Adresse des virtuellen Clients an, die 2. des virtuellen Server endpoints. Laut openvpn.org-HOWTO muessen Sie aus /30 Subnets geholt werden, damit die Windows Clients/TAP-Win32 Treiber mitspielen. Quote von http://openvpn.net/howto.html: Specifically, the last octet in the IP address of each endpoint pair must be taken from this set: [ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38] [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78] [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98] [101,102] [105,106] [109,110] [113,114] [117,118] [121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158] [161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198] [201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238] [241,242] [245,246] [249,250] [253,254] Jetzt legen wir auf dem Client eine Config unter /etc/openvpn/ an, z.B. "client.conf". Die endung ".conf" ist dabei fuer den Daemon wichtig, denn alle .conf-Dateien in diesem Verzeichnis werden vom Init-Script automatisch bei Systemstart gestartet und beim Shutdown gestoppt. Falls der Autostart nicht erwuenscht ist muss man openvpn aus den runleveln mit "update-rc.d -f openvpn remove"(Debian Lenny 5.0) oder "update-rc.d-insserv -f openvpn remove"(Debian Squeeze 6.0) und dann manuell mit "openvpn --config /etc/openvpn/client.conf" gestartet werden. Bei einem Windows Client muss die Endung ".ovpn" lauten: # Diese Config initiiert einen Client client # zusaetzlich TLS-Authentication-Client tls-client # UDP ist Pflicht fuer TAP, wir nutzen aber TUN ;proto udp proto tcp # Das Device muss fuer bridging TAP sein, wir nutzen aber TUN ;dev tap dev tun # Remote-Server remote [IP des Servers] [Port des Servers] # Keinen lokalen Port festlegen nobind # Kompression comp-lzo #Verschluesselungs-Algorithmus cipher AES-256-CBC ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/[Client-Name].crt key /etc/openvpn/keys/[Client-Name].key # Folgendes auskommentieren wenn man nicht mit dem DNS des Server surfen moechte redirect-gateway # Weitere Configs resolv-retry infinite ns-cert-type server persist-key persist-tun verb 3 float up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf script-security 2 Nun nur noch vom Server die Dateien /etc/openvpn/keys/ca.crt /etc/openvpn/keys/[Client-Name].crt und /etc/openvpn/keys/[Client-Name].key auf den jeweiligen Client nach /etc/openvpn/keys kopieren. FORWARD TRAFFIC VIA VPN Falls man redirect-gateway am Client nutzen will, also ueber die Ip des Servers surfen moechte, ist noch folgendes notwendig: (Im Kernel werden dafuer folgende Module benoetigt: ip_tables ip_conntrack ip_conntrack_ftp ip_conntrack_irc iptable_nat ip_nat_ftp und evtl ip_nat_irc) Im Server IP-Forwarding aktivieren waehrend der aktiven Laufzeit echo 1 > /proc/sys/net/ipv4/ip_forward Um dies bei jedem Bootvorgang permanent zu machen, muss in /etc/sysctl.conf #net.ipv4.ip_forward=1 nach net.ipv4.ip_forward=1 geaendert werden. Dann muessen einige Iptables Regeln gesetzt werden (Interface eth0 muss evtl angepasst werden, zb bei einem openvz VPS kann es venet0 sein, immer das Interface was die verbindung ins Internet hat): iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.11.12.0/24 -o eth0 -j ACCEPT Entweder wenn MASQUERADE auf dem Server aktiviert ist reicht folgendes: iptables -t nat -A POSTROUTING -s 10.11.12.0/24 -o eth0 -j MASQUERADE Wenn nicht und man die Fehlermeldung "iptables: No chain/target/match by that name" bekommt, kann man noch diese Moeglichkeit probieren: iptables -t nat -A POSTROUTING -s 10.11.12.0/24 -j SNAT --to-source 1.1.1.1 (Die IP 1.1.1.1 MUSS gegen die oeffentliche IP des Servers gewechselt werden.) Sobald alles wie gewollt laeuft, kann man die Regeln wie folgt speichern und beim Bootvorgang automatisch laden lassen: iptables-save > /etc/iptables.up.rules nano /etc/network/if-pre-up.d/iptables Hier fuegen wir folgende Zeilen ein: #!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules Dann setzen wir noch folgende Rechte: chmod +x /etc/network/if-pre-up.d/iptables Basierend auf folgenden Anleitungen: http://blog.kleen.ch/2010/06/01/von-uberall-ins-lan-mittels-openvpn/ http://sohonetwork.blogspot.de/2012/05/install-openvpn-ubuntu-vps-10-minutes.html