[Tutorial] OpenVPN Server mit DD-WRT einrichten (Bridged Mode)
Hallo zusammen,
nachdem ich mich nun über mehrere Wochen mit den Einstellungen für einen OpenVPN Server auf meinem Linksys/Cisco E2000 (Firmware: DD-WRT v24-sp2 (12/19/10) mega) herumgeschlagen habe, läuft das ganze nun! (Mittlerweile habe ich mehrere verschiedene Konfigurationen gestestet, und es so beispielsweise geschafft, den Proxy meiner Schule zu umgehen, bzw. eine VPN-Verbindung durch den Proxy hindurch aufzubauen! Somit läuft nun wieder mein kompletter Traffic ungefiltert und verschlüsselt durch mein VPN, dazu evtl. ein anderes mal mehr ;))
Um euch ähnlichen Ärger zu ersparen, hier noch einmal die einzelnen Schritte (das ganze sollte nicht länger als eine Stunde dauern!). Ich setze voraus, dass ihr bereits ein aktuelles DD-WRT Image auf eurem Router laufen habt, und ihr auch noch genug RAM frei habt, um den Server zu betreiben.
Falls ihr noch kein DD-WRT auf eurem Router laufen habt, dann schaut erstmal in der Router-Database nach, ob es überhaupt ein Image für euren Routertyp gibt. Da der Flashvorgang bei jedem Router anders ist, solltet ihr euch erstmal in Ruhe darüber informieren, und erst dann hierher zurück kommen, sobald ihr das DD-WRT Image erfolgreich geflasht habt.
Zum Verständnis sei noch angemerkt, dass das Image immer ähnlich aufgebaut ist, egal auf welchem Router es läuft. D.h. diese Anleitung funktioniert auch für andere Router Typen als den von mir verwendeten E2000!
Eine Erläuterung bzw. Beschreibung zu den verschiedenen Builds gibt es hier.
Schritt 1 – Zertifikate erstellen
Dazu gibt es mittlerweile genug HowTo’s, so dass ich das nicht auch noch einmal alles im Detail beschreiben muss.
Für Windows und Linux User empfehl ich folgendes Tutorial direkt von OpenVPN: Klick mich!
Bei Verständnisfragen bzw. anderen Konfigurationswünschen, empfehle ich an dieser Stelle wirklich noch einmal einen Blick ins OpenVPN HowTo, bzw. auf die Beispiel-Konfigurationen für Client und Server zu werfen.
Schritt 2 – Server auf eurem Router einrichten
Dazu öffnet ihr den Browser eurer Wahl und gebt die lokale IP eures Routers ein (in meinem Beispiel wäre das die 192.168.178.2). Nun navigiert ihr zu dem Reiter ServicesVPN. Unter „Starte OpenVPN Daemon“, könnt ihr den Services einschalten. Nun seht ihr die ganzen Konfigurationsmöglichkeiten.
Den „Start Type“ setzen wir auf „WAN Start“ und bei „Switch Server config“ klicken wir auf „old Style“.
Nun sind benötigen wir, die vorher generierten Zertifikate. Als erstes nehmen wir den Inhalt der „ca.crt“ und tragen es unter „Öffentliches CA-Zertifikat“ ein, „Öffentliches Server-Zertifikat“ bekommt den Inhalt der „server.crt“, unter „Privater Server-Schüssel“ tragen wir den Inhalt von „server.key“ ein, und unter „DH PEM“ den Inhalt der „dh2048.pem“.
Wichtig: In manchen der oben aufgeführten Dateien, gibt es mehr Inhalt, als nur die benötigten Zertifikate. Hier nur das Zertifikat kopieren. Außerdem muss jedes Zertifikat inklusive —–BEGIN CERTIFICATE—– und —–END CERTIFICATE—– kopiert werden. Diese Zeile am Anfang und am Ende des Zertifkats darf nicht weggelassen werden!
Letzter Punkt ist die „OpenVPN Konfiguration“, hier tragt ihr die nachfolgende Server-Config ein und passt sie euren lokalen Gegenheiten an.
Server-Config:
mode server
proto udp
port 1194
dev tap0
# Gateway (VPN Server) Subnetmask Start-IP End-IP
server-bridge 192.168.178.3 255.255.255.0 192.168.178.200 192.168.178.250
keepalive 10 120
daemon
verb 5
client-to-client
management 127.0.0.1 5002
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem
Wichtig: Unter dem Punkt „Gateway (VPN Server)“ muss eine IP-Adresse vergeben werden, die zum einen innerhalb des Heimnetzes noch nicht vergeben ist, und zum anderen außerhalb des DHCP-Pools liegt. In meinem Fall war die 192.168.178.3 die erste freie IP-Adresse in meinem Netzwerk (mein Gateway hat die 192.168.178.1 und mein E2000 die 192.168.178.2), mein DHCP-Pool beginnt bei 192.167.178.50 und endet bei 192.167.178.100. Und der VPN-DHCP-Pool beginnt, wie aus der Server-Config ersichtlich, bei 192.168.178.200 und endet bei 192.168.178.250. Ebenso dürft ihr natürlich auch nicht die Netzadresse (192.168.178.0) oder die Broadcastadresse benutzen (192.168.178.255).
Edit: Der Abschnitt darüber trifft nur auf manche Leute zu – mittlerweile habe ich auch „server-bridge 192.168.178.1 255.255.255.0 192.168.178.200 192.168.178.250″ erfolgreich getestet. Es funktioniert also auch (zumindest bei mir) die Gateway-IP. Probiert es aus 😉
Zum Verdeutlichen, hier noch ein Screenshot meines DD-WRT Control Panels:
Nun scrollt ihr an das Ende der Seite und klickt auf „Speichern“, wartet ein paar Sekunden und klickt dann auf „Anwenden“. Nun wechselt ihr zu dem Reiter StatusOpenVPN. Scrollt etwas nach unten zu dem Punkt „Log“, wenn das so aussieht wie hier, dann sollte euer VPN-Server laufen und ihr habt den ersten Schritt erfolgreich gemeistert!
Serverlog 20110307 02:52:15 I OpenVPN 2.1.3 mipsel-unknown-linux-gnu [SSL] [LZO2] [EPOLL] built on Dec 19 2010
20110307 02:52:15 MANAGEMENT: TCP Socket listening on 127.0.0.1:5002
20110307 02:52:15 W NOTE: when bridging your LAN adapter with the TAP adapter note that the new bridge adapter will often take on its own IP address that is different from what the LAN adapter was previously set to
20110307 02:52:17 Diffie-Hellman initialized with 2048 bit key
20110307 02:52:17 W WARNING: file '/tmp/openvpn/key.pem' is group or others accessible
20110307 02:52:17 TLS-Auth MTU parms [ L:1573 D:138 EF:38 EB:0 ET:0 EL:0 ]
20110307 02:52:17 Socket Buffers: R=[114688->131072] S=[114688->131072]
20110307 02:52:17 I TUN/TAP device tap0 opened
20110307 02:52:17 TUN/TAP TX queue length set to 100
20110307 02:52:17 I /tmp/openvpn/route-up.sh tap0 1500 1573 init
20110307 02:52:17 Data Channel MTU parms [ L:1573 D:1450 EF:41 EB:4 ET:32 EL:0 ]
20110307 02:52:17 I UDPv4 link local (bound): [undef]:1194
20110307 02:52:17 I UDPv4 link remote: [undef]
20110307 02:52:17 MULTI: multi_init called r=256 v=256
20110307 02:52:17 IFCONFIG POOL: base=192.168.178.200 size=51
20110307 02:52:17 I Initialization Sequence Completed
20110307 03:14:42 MANAGEMENT: Client connected from 127.0.0.1:5002
20110307 03:14:42 D MANAGEMENT: CMD 'state'
Schritt 3 – Firewall und Startup-Script
Nun fehlt nur noch die Einträge für die Firewall und das Startup-Script, bevor wir uns der Client-Konfiguration zuwenden können.
Wir wecheln nun auf den Reiter AdministrationDiagnose und tragen unter „Kommandos“ folgendes ein:
openvpn --mktun --dev tap0
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up
Jetzt klicken wir auf „Startup Speichern“.
Nun löschen wir das Kommandos-Feld wieder leer, und kopieren folgendes in das Feld und klicken auf „Firewall speichern“.
iptables -A INPUT -i tap0 -j ACCEPT
iptables -I INPUT -p udp --dport 1194 -j ACCEPT
Das war die komplette Server-Konfiguration!
Schritt 4 – Client Konfiguration
Als erstes benötigt ihr OpenVPN, das kann man hier herunterladen. In diesem Artikel habe ich die Version OpenVPN 2.1.4 — released on 2010.11.09 benutzt. Falls eine neuere Version nicht funktionieren sollte, dann probiert es zuerst einmal mit dieser.
Nach dem Download OpenVPN installieren und danach einen neuen Ordner erstellen, in dem wir die Client-Config ablegen werden. Der Ort und Name des Ordners bleibt euch überlassen. Nun erstellen wir ein leeres Textdokument (RechtsklickNeuTextdokument) – achtet bitte darauf, dass ihr die Dateierweiterung (.txt) angezeigt bekommt, falls nicht, könnt ihr dies in den Ordneroptionen ändern.
Kopiert nun den folgenden Inhalt in das Textdokument, passt es euren Einstellungen an und speichert.
remote ****.dyndns.org 1194
client
dev tap0
proto udp
resolv-retry infinite
nobind
persist-key
float
ca "C:\ca.crt"
cert "C:\client.crt"
key "C:\client.key"
ns-cert-type server
Hinter „remote“ kommt die DynDNS-Adresse des VPN-Servers, alternativ eine IP, falls ihr eine feste IP haben solltet (das ist aber sehr unwahrscheinlich, normalerweise bekommt jeder von seinem Internetprovider eine IP zugeteilt, die sich mind. 1x in 24h ändert – aus diesem Grund benötigt man eine DynDNS-Adresse, damit man auch nach einem IP-Wechsel auf den VPN-Server connecten kann). Wie man eine solche DynDNS-Adresse einrichtet sollte in genug Tutorials erklärt werden, hier ist google eure Freund 😉
Unter Windows muss der Pfad zu euren Zertifikaten immer zwei Backslashs „\“ enthalten. Falls der eure Zertifikate beispielsweise unter „C:OpenVPN“ liegen, dann ist der korrekte Pfad „C:\OpenVPN\*.crt“.
Nachdem ihr alles angepasst und gespeichert habt, markieren wir das Textdokument und drücken „F2“, nun können wir den Namen ändern. Aus „Neues Textdokument.txt“ machen wir „OpenVPN.ovpn“ und Enter – die Meldung, dass die Datei evtl. unbrauchbar wird, bestätigen wir mit JA. Wichtig hierbei ist, dass aus der Endung „txt“ ein „ovpn“ wird, den Namen davor könnt ihr frei wählen.
Nun ist es soweit, der erste Verbindungstest kann stattfinden! Rechtsklick auf die „OpenVPN.ovpn“ und den Punkt „Start OpenVPN on this config file“ anklicken. Wenn alles gut geht sollte sich jetzt ein DOS-Fenster öffnen, dass euch den Verbindungsstatus anzeigt.
Mon Mar 07 03:48:14 2011 OpenVPN 2.1.4 i686-pc-mingw32 [SSL] [LZO2] [PKCS11] built on Nov 8 2010
Mon Mar 07 03:48:14 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Mon Mar 07 03:48:14 2011 UDPv4 link local: [undef]
Mon Mar 07 03:48:14 2011 UDPv4 link remote: XXX.XXX.XXX.XXX:1194
Mon Mar 07 03:48:17 2011 [server] Peer Connection Initiated with XXX.XXX.XXX.XXX:1194
Mon Mar 07 03:48:18 2011 WARNING: potential TUN/TAP adapter subnet conflict between local LAN [192.168.178.0/255.255.255.0] and remote VPN [192.168.178.0/255.255.255.0]
Mon Mar 07 03:48:19 2011 TAP-WIN32 device [LAN-Verbindung 2] opened: \.Global{086E6137-8ACF-4BD3-A8C1-73162010DE45}.tap
Mon Mar 07 03:48:19 2011 Notified TAP-Win32 driver to set a DHCP IP/netmask of 192.168.178.200/255.255.255.0 on interface {086E6137-8ACF-4BD3-A8C1-73162010DE45} [DHCP-serv: 192.168.178.0, lease-time: 31536000]
Mon Mar 07 03:48:19 2011 Successful ARP Flush on interface [65540] {086E6137-1ABF-4BD6-A8A1-73162010AE43}
Mon Mar 07 03:48:24 2011 WARNING: potential route subnet conflict between local LAN [192.168.178.0/255.255.255.0] and remote VPN [192.168.178.0/255.255.255.0]
Mon Mar 07 03:48:24 2011 Initialization Sequence Completed
Lasst euch nicht von eventuellen Warnmeldungen („subnet conflicts“) stören, dass liegt daran, dass wir aus dem Netz 192.168.178.0 in das VPN-Netz 192.168.178.0 connecten, das gibt natürlich immer Probleme mit dem Routing. Von außerhalb sollte das nicht mehr auftreten, sofern ihr euch nicht wieder in einem lokalen Netz mit genau diesem Bereich befindet (das ist das Standard Netz einer Fritzbox). Das wichtigste hier ist folgende Meldung: Initialization Sequence Completed – ihr könnt euch also absofort von überall auf der Welt nach Hause, in euer Netz einwählen, und zwar verschlüsselt!
Viel Spaß 🙂
Nachtrag: Evtl. kann es passieren, dass bei eurem Client der Gateway nicht richtig gepushed wird, in diesem Fall, hilft es, wenn man einmal den Gateway von Hand in den OpenVPN Netzwerkadapter einträgt. Dazu geht ihr unter SystemsteuerungNetzwerk und InternetNetzwerkverbindungen, Rechtsklick auf den VPN-Adapter, Eigenschaften, Doppelklick auf „Internetprotokoll Version 4 (TCP/IPv4)“, „Erweitert…“ und unter Standardgateways klickt ihr auf hinzufügen. Dort tragt ihr nun den Gateway des VPN-Netzes ein – in meinem Fall die 192.168.178.1. Keine Angst, dass muss wirklich nur einmal gemacht werden, da der Adapter den Gateway nicht mehr „vergisst“.
Nachtrag2: Ich freu mich natürlich auch immer über Kommentare, egal ob Verbesserungsvorschläge, ob das Tutorial gelungen ist, etc. – lasst mir was da! 🙂
Hier noch eine kurze Anleitung zum Zertifikate unter Linux erstellen:
1) OpenVPN-Pakete je nach OS installieren. Im Folgenden gehe ich von einer Linux-Installation aus, sorry, unter Windows hats nie geklappt ..
2) Normalerweise wechseln jetzt alle immer in ihre Guides nach ‚/usr/share/doc/packages/openvpn‘ und führen dort den Prozess als root durch. Ich kopiere mir den Ordner nach ~, ändere die Zugriffsrechte und mache es als „ich“:
$ cp -R /usr/share/doc/packages/openvpn ~
$ sudo chown myusername openvpn
3) Umgebung initialisieren:
$ ./vars
$ ./clean-all
$ ./build-ca
4) Serverzertifikat erzeugen:
$ ./build-key-server server
5) Für jeden Client ein Zertifikat erzeugen:
$ ./build-key client1
6) Diffie Hellman Parameter erzeugen:
$ ./build-dh
Et voilà: Alles da 😉 (s.a.: http://openvpn.net/index.php/open-source/documentation/howto.html). Weiß nur nimmer, wie wir die 2048er Schlüssellänge eingestellt haben..
Danke für das Tutorial.
Leider klappt es bei mir noch nicht ganz so 🙁
„mode server“ bei der „Server Config“ mußte ich weglassen. Sonst kam ein Fehler.
Ich glaube auch, dass „mode server“ nicht notwendig ist wenn man eine „server-bridge“ macht?
Mittels OpenVPN Client kann ich mich connecten.
Ich erhalte eine IP Adresse aus dem angegebenen Range zugewiesen – jedoch wars das auch schon.
Kann weder ein Gerät im Heimnetzwerk pingen, noch erreichen.
Woran kann das liegen?
Ich befürchte wirklich, dass jede DD-WRT Version so seine eigenen Tücken hat.
Weiters ist bei mir die Ausgangssituation etwas anders.
Ich benutze den DDWRT Router als „Client Bridge“ und hole mir das Internet von einem anderen Router.
Kann es sein dass hierfür andere Scripts bzw. an der Firewall etwas geändert gehört?
Innerhalb des Heimnetzwerks bekommen die Clients eigentlich nichts vom DDWRT Router mit – da dieser direkt auf den Internetrouter bridged.
Wäre nett, wenn du mir Tipps geben könntest, wie ich den Tunnel hinbekomme und alle Geräte erreichen kann 😉
Wie könnte ich das Debugen um herauszufinden was z.B. an der Firewall nicht passt?
Gruß Erich
Hey Eriche,
*puh* um ehrlich zu sein ist der Artikel ziemlich alt und vermutlich auch nicht mehr aktuell… Seit dem Artikel hat sich einiges in der Firmware getan. Mittlerweile brauch man meines Wissens nach z.B. auch keine Firewallregeln mehr zu setzen, da das die init-Scripts selbst machen. Am besten wird sein du schaust direkt im DD-WRT Wiki nach einem aktuellen Artikel zum Thema VPN. Mein eigenes VPN läuft momentan nicht. Das ist zwar schon lange geplant das wieder einzurichten, nur leider fehlt die Zeit… Sobald es wieder läuft werde ich das Tutorial updaten, nur wann das sein wird kann ich nicht versprechen.
Aber noch ein Tipp zum debuggen, wenn du unter Additional Config „verb 7“ einträgst, solltest du unter StatusOpenVPN um einiges mehr im Log zu sehen bekommen 😉 Wenn du nichts pingen kannst fehlt vermutlich der Default Gateway oder die Default Route. Wichtig ist dass du OpenVPN auf den Clients mit Adminrechten startest, damit die neuen Routen in den Clients eingtragen wird. Sonst steht zwar die Verbindung aber Windows weiß nichts damit anzufangen. Um die Windows Routing Tabelle anzuzeigen ein CMD Fenster öffnen und „route print -4“ eingeben. Gibt es keine Route zum VPN Gateway hast du evtl. schon das Problem 😉
Falls es nur noch eine Kleinigkeit sein sollte die an meinem Tutorial nicht mehr passt, freu ich mich natürlich über Rückmeldung bevor ich selber lange suchen muss 😀
Gruß iro