Tipps & Tricks: OpenVPN auf dd-wrt Router

Loreas

Member
Inhalt:
1. OpenVPN Setup
2. Durchleiten einer einzelnen IP ohne OpenVPN

3. USB-Stick als Cert-Speicher verwenden
4. Einkaufs-Guide
5. Sonstiges...

Einleitend zum Thema dd-wrt will ich sagen, dass man unter ftp://ftp.dd-wrt.com/betas/ die aktuellste Firmware bekommt. Es gibt auch ein dd-wrt Wiki und eine dd-wrt Datenbank. Beide sind leider total veraltet.
Wenn ihr die aktuellste dd-wrt Version haben wollt, bitte den ftp-Link verwenden.

1. OpenVPN Setup

1. Download the Config-Files for Android/iOS
2. Everything we need is in the .ovpn file. Choose your server.

3. Go to the dd-wrt Webinerface:

Setup
Basic Setup
WAN-Connection Type
Automatic Setup - DHCP

Router IP

Lokal IP: 192.168.1.1
Network Mask: 255.255.255.0
Gateway: 0.0.0.0
Lokal DNS: 0.0.0.0

Network Address Server Settings (DHCP)

DHCP Type: DHCP Server
DHCP Server: activate
For static DNS 1/2/3 choose one of those DNS provided by OpenNIC https://www.opennicproject.org/
and put them in into Static DNS 1, 2 & 3
Not recommended but can be also a Google DNS 8.8.8.8 & 8.8.4.4

untick Use DNSMasq for DHC
untick Use DNSMasq for DNS
untick DHCP-Authoritative

Clock Setup
NTP-Client: activate
Time Zone: "your time zone"
Server-IP/Name: de.pool.ntp.org
and Save
Setup
IPv6
IPv6-Support
IPv6: enable
Radvd: enable
and Save
Services
VPN
OpenVPN-Client:

Start OpenVPN -> Enable
Server IP/Name: xxx.perfect-privacy.com
Port: 1149 (UDP)
Tunnel Device: TUN
Tunnel Protocol: UDP
Encryption Cipher: AES-256 CBC
Hash Algorithm: SHA512
User Pass Authentication -> Enable
Username: your username
Password: your password
Advanced Options -> Enable
TLS Cipher: None (will be edited in "Additional Config")
LZO Compression: Adaptive
NAT -> enable
MTU: 1500
UDP Fragment: 1300
Tunnel UDP MSS-Fix: Disable
nsCertType verification: enable
Open the .ovpn-File with a text-editor
copy the content
TLS Auth Key (in the .ovpn-file: <tls-auth> )
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
-----END OpenVPN Static key V1-----
Additional Config:​
Code:
redirect-gateway def1
reneg-sec 86400
mssfix
float
persist-remote-ip
route-method exe
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA
route-delay 2
tls-timeout 5
hand-window 120
inactive 604800
ping 5
ping-restart 90
replay-window 512 60
mute-replay-warnings

CA Cert (in the .ovpn-file: <ca> )
copy from .ovpn-file
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----​
Public Client Cert (in the .ovpn-file: <cert> )
copy from .ovpn-file
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----​
Private Client Key (in the .ovpn-file: <key> )
copy from .ovpn-file
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----​
Save Settings

Go to
Administation
Commands
First of all run that command in the shell:
Code:
ifconfig
If you have tun0, you have to edit the firewall command down under.
In my case i have tun1.

Paste this into your Command Shell:
Code:
iptables -P FORWARD DROP
iptables -I FORWARD -i br0 -o tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -o br0 -j ACCEPT
iptables -I FORWARD -i br0 -o vlan2 -j DROP
iptables -I INPUT -i tun1 -j DROP
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE

and press the "Save Firewall" button.

Paste this into your Command Shell:
Code:
#!/bin/sh
/usr/sbin/openvpn --config /tmp/openvpncl/openvpn.conf --route-up /tmp/openvpncl/route-up.sh --down-pre /tmp/openvpncl/route-down.sh --daemon

and press the "Save Startup Script" button.
Finally go to:
Administration
Management
and press the "Reboot Router" button.
Finished...

2. Das Durchleiten bestimmter IPs ohne VPN

Dort wo die "Additional config" eingegeben wird ist ein Kästchen darunter, wo "Policy Based Routing" bzw. "Richtlinienbasiertes Routen" steht.

View attachment 153

Dieses Kästchen kann man mit allen internen IPs füttern, die sich über VPN verbinden sollen. (eine IP pro Zeile)

IPs, die ohne VPN rausgehen sollen, müsst ihr natürlich in der Firewall auch eintragen.

Code:
iptables -P FORWARD DROP
iptables -I FORWARD -i br0 -o tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -o br0 -j ACCEPT
iptables -I FORWARD -i br0 -o vlan2 -j DROP
iptables -I FORWARD -i br0 -s 192.168.1.xyz -j ACCEPT
iptables -I FORWARD -o br0 -d 192.168.1.xyz -j ACCEPT
iptables -I INPUT -i tun1 -j DROP
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE


Tipp: Wenn man über einen USB-Steckplatz am Router verfügt, kann man diesen als Speicher nutzen.Vorausgesetzt eure dd-wrt Version bzw. Version für den Router verfügt über USB-Speicherunterstützung könnt ihr die certs für die Server dort ablegen.

3. USB-Speicher als Ablage für Zertifikate

Ich will hier mal einen bequemeren Weg vorstellen Zertifikate auf dem Router zu hinterlegen. Allerdings funktioniert das nur auf dd-wrt-Versionen, die USB-Port haben.

Am PC:
  • Zuerst nehmt einen beliebig großen USB-Stick und legt darauf 2 Partitionen an. Die erste Partition könnt ihr als swap-Speicher (ca.512 MB), den Rest könnt ihr als ext3 formatieren und als kleinen NAS-Speicher verwenden.
  • Die ext3-Partition muss mit "jffs" benannt werden. Denn nur so wird der USB-Stick automatisch gemountet.
Am Router:
  • Die Einstellung unter dd-wrt sieht wie folgt aus: USB-ddwrt.png
  • Weiter unten m Fenster "Services -> USB" seht ihr einen kleinen Log wen der USB-Stick angesteckt wird. Hier sucht ihr die UUID-Nummer der jffs-Partition raus und kopiert diese in das Kästchen "Diese Partition als /jffs einbinden"
Zurück am PC:
  • Um jetzt auf dem USB-Stick, der jetzt am Router steckt, die Config abzulegen, muss man mit der Router-IP zB. 192.168.1.1/jffs verbinden.
  • Legt dort den Ordner "openvpn" und einen Unterordner "config" an. (Ordnung muss sein... ;) )
  • Der USB-Stick verhält sich jetzt wie ein normaler NAS-Speicher. Kopiert die .crt und .key Dateien auf den USB-Stick in den einen neu angelegten Ordner.
und wieder zum Router:
  • Unter Services -> VPN könnt ihr nun in der OpenVPN-Konfiguration diese Pfade angeben, die zu den Schlüssel führen.
Code:
ca /jffs/openvpn/config/ca.crt
cert /jffs/openvpn/config/xxx_cl.crt
key /jffs/openvpn/config/xxx_cl.key
tls-auth /jffs/openvpn/config/xxx_ta.key 1
(Achtung: den 1er nach dem ..._ta.key nicht vergessen)

FERTIG! Nun könnt ihr bequem zwischen den Servern herum wechseln, ohne aufwendig alle Certs etc. rauszusuchen.
4. Einkaufsguide

Wenn der Router wirklich mit vernünftigem Speed über OpenVPN durchleiten soll, benötigt es einen Dualcore. Natürlich geht es mit nem Singlecore auch, aber langsamer.
Zum Glück sind 2015 hier (endlich) einige Modelle auf den Markt gekommen.

Beispiele hierfür wären:
  • Netgear R6300 V2 @ 2x800 MHz um ca. 120€
  • Asus RT-AC56U @ 2x800 MHz um ca. 100€
  • Netgear R7000 @ 2x1 GHz um ca. 140€
  • Asus RT-AC87U @ 2x1 GHz um ca. 200€
  • Linksys WRT1900AC @ 2x1,2 GHz um ca. 220€
  • Linksys WRT1900ACS @ 2x1,6 GHz um ca. 230€
(Preise laut geizhals.de - Stand 12/2015)

Wenn euch dd-wrt nicht so gefällt, das kann ja vorkommen, dann achtet auch darauf, welche anderen Custom Firmwares es für das Gerät der Wahl gibt. z.B. Geht nicht bei allen OpenWRT, Merlin nur bei Asus, R7000 taugt für TomatoUSB Mod, etc.
2016 werden sicher noch weitere Alternativen kommen. Man darf gespannt sein, welche CPUs darin noch verbaut werden.

Als Referenz: Bei 2x1GHz schafft man ca. 20-24 MBit/s
5. Sonstiges

Don't forget to keep your Router up to date!
Here you'll get your updated firmware:
ftp://ftp.dd-wrt.com/betas/


So, ich hoffe es ist jetzt mal übersichtlich genug zusammengefasst.

Vorteil wenn man über Router verbindet:
- DNS-Leaks sind Geschichte
- ALLES was im Netzwerk auf Internet zugreift geht über OpenVPN raus
Nachteil:
- Bei manchen Banken sollte man aufpassen, da die IP-Adressen sperren könnten wenn man aus dem Ausland zugreift

PS: Danke @Gerd, für deinen Tipp mit der Additional Config und den Fixed Parameters in dd-wrt
http://www.dd-wrt.com/wiki/index.php/OpenVPN#Fixed_Parameters
Danke @JackCarver für die iptables Erklärungen

Bitte eine Nachricht schreiben wenn etwas unklar ist oder falsch.
Dieser Beitrag wird von mir aktuell gehalten.
 
Last edited:
hab das mal nach gemacht. wenn ich es mit deiner additional config mache, bekomme ich folgende Fehlermeldung:
Deprecated TLS cipher name 'DHE-RSA-AES128-GCM-SHA256', please use IANA name 'TLS-DHE-RSA-WITH-AES-128-GCM-SHA256'

wenn ich die additional config weglasse und anstatt bei tls sipher: none ( wie bei dir angegeben) den tls cipher vorgebe. dann funktioniert es.

woran liegt das?
 
ok. hab mal alles neu gemacht und den neuesten build von brainslayer aufgesetzt ( 27745).
bei der ersten anmeldung bzw. beim passwort setzten bekam ich folgende Fehlermeldung:

cross site action detected

Ich hatte kein Zugriff auf den Router, wieso auch immer das so ist. Für den workarround gibt es 2 Möglichkeiten:
1: via telnet
Code:
nvram set no_crossdetect=1
nvram commit
2: via firefox:
about:config; network.http.sendRefererHeader= auf 1 setzen

Sobald ich diese Hürde genommen habe, lief deine Anleitung wie oben beschrieben. Danke hierfür.

PS: hattest du auch das Problem mit der Fehlermeldung und weisst du oder jemand anderes wieso das so ist?
PSPS: ich hatte es via firefox gemacht. Fühlte sich besser an.
 
Update:
Nach ein paar Testdurchläufen muss ich sagen, dass es mit der oben genannten Anleitung nicht ganz rund läuft. Nach einem router reboot, habe ich keine vpn Verbindung hinbekommen. Musste mich dann in den Router einloggen und apply drücken. Dann erst kam die Verbindung zustande. Wie oben schon erwähnt. Wenn ich die additional config weglasse und den tls cipher im Menü auswähle geht es problemlos. Kann rebooten so oft ich will, die vpn Verbindung kommt safe zustande. Jetzt meine Frage: ist die additional config wichtig und hätte ich diese eventuell anpassen müssen? und wie wichtig ist für die anonymität das abwählen von Use DNSMasq for DHC/Use DNSMasq for DNS und DHCP-Authoritative?
 
Update:
Nach ein paar Testdurchläufen muss ich sagen, dass es mit der oben genannten Anleitung nicht ganz rund läuft. Nach einem router reboot, habe ich keine vpn Verbindung hinbekommen. Musste mich dann in den Router einloggen und apply drücken. Dann erst kam die Verbindung zustande.

Zu dem Startup-Problem einfach unter Administration -> Diagnose in Startup folgendes speichern:
Code:
#!/bin/sh
/usr/sbin/openvpn --daemon


Wie oben schon erwähnt. Wenn ich die additional config weglasse und den tls cipher im Menü auswähle geht es problemlos. Kann rebooten so oft ich will, die vpn Verbindung kommt safe zustande. Jetzt meine Frage: ist die additional config wichtig und hätte ich diese eventuell anpassen müssen?

Das sind ziemlich wichtige Konfigurations-Parameter. Die sollte man schon verwenden.

und wie wichtig ist für die anonymität das abwählen von Use DNSMasq for DHC/Use DNSMasq for DNS und DHCP-Authoritative?

Leider kann ich hierzu keine Angabe machen. Weiß ich leider nicht.
 
Ich geb´s auf. Ich hatte es mal mit einer anderen config-datei (mac/os) versucht und hatte 3 Tage Ruhe. Heute wieder hat es sich aufgehängt. Ich kann zB über Tunnelblick eine Verbindung mit Erfurt zustande bringen. Aber nicht mit Frankfurt (was auf dem Router drauf ist)
Ich bekomme den Fehler Tls Handshake failed. Das wird sich jetzt ca. eine Std. hinziehen und dann wird es irgendwann mal laufen.

In wie fern muss ich die additional config anpassen? Denn mit der additional config bekomme ich unter status/openvpn gar kein Warnhinweis geschweige denn eine Verbindung hin. Da ist einfach alles leer. Wie oben erwähnt, lass ich sie weg und wähle den tls cipher von Hand aus. Dann gehts, aber auch nur eine bestimmte Zeit dann hauts mich raus und ich kann mich für eine Weile mit den Server nicht mehr verbinden. Weder mit dem Router noch mit Tunnelblick.

Ich muss dazu sagen, dass mein Router fast 2 Jahre problemlos lief. Das Problem tauchte erst vor 1-2 Montaten auf. Worauf ich diesen Thread aufgesucht habe. Leider ohne wirklichen Erfolg.

Wo steckt der Wurm?!

Ps:
Code:
#!/bin/sh
/usr/sbin/openvpn --daemon
hat auch keine Abhilfe geschaffen
 
Die Systemzeit in openvpn passt. Allerdings ist mir aufgefallen das unter der syslog die Zeit 2 Std. hinterher ist (ntp client ist enabled, Berlin ausgewählt und de.pool.ntp.org eingetragen). Würde ungern auf ein anderen Server wechseln. Da ich wie erwähnt schon eine weile den Frankfurt Server als mein Standard Server benutze.

Weisst du Frank wie und ob ich die oben gezeigte additional config anpassen muss? Da ich mit der oben gezeigten config nix zustande bekomme.
 
Edit:
Die Perfect-Privacy User können mit der .ovpn Datei ins Internet. Das bedeutet für mich das alle notwendigen Einstellungen in der .ovpn Datei für eine erfolgreiche Router-Konfiguration stehen.

Öffne eine UDP oder TCP .ovpn Datei und stelle die Einstellungen in der DD-WRT OpenVPN Client Konfiguration so wie du es für richtig hältst.
(Auch auf die Fixed Parameters achten) Wenn alles eingestellt wurde wechsel zu "Administration-> Commands" und gib dort ein:

Code:
cat /tmp/openvpncl/openvpn.conf

und führe es mit 'Run Commands' aus.

Gleiche die Einstellungen vom DD-WRT OpenVPN Client Menü mit der .ovpn Datei von Perfect-Privacy und mit der Ausgabe vom Commands Fenster so lange ab, bis es zum größten Teil übereinstimmt. Wenn danach die OpenVPN Verbindung immer noch nicht aufgebaut wird, dann weißt du das es nicht an der OpenVPN Client Konfiguration liegen wird, sondern an etwas anderem.

Das ist der einfachste Trick bei der DD-WRT Konfiguration, ohne große Kenntnisse über OpenVPN zu haben.
 
Last edited:
ich hatte meinen router auf einen alten build von kong zurückgesetzt und alles neu eingerichtet ( frankfurt ). lief eigentlich ganz ok, für 1 oder 2 wochen. ab und zu mal ein hänger, aber damit konnte ich leben. seit gestern aber, bekomme ich ein connected succes, aber dafür keine internet verbindung. habe alles mögliche versucht und dann doch aufgegeben (vielleicht was eingestellt was so nicht sein sollte) und den router neu geflasht mit dem neuesten kong build. Ich habe jetzt im neu geflashten router nur die internetverbindungsdaten eingegeben und das wlan eingerichtet. Just for fun hab ich mal den tunnelblick gestartet und versucht mich mit frankfurt zu verbinden. GEHT NICHT. ?! wtf! liegt das problem etwa bei euch?

edit: amsterdam über tunnelblick z.B geht
 
GEHT NICHT. ?! wtf! liegt das problem etwa bei euch?

Ich weiß nicht wie zur Zeit deine Konfiguration aussieht und kann nur vorschlagen von der Konfiguration die Bilder reinzuposten. Also von DNS Server, DNSMasq bis iptables. Der Teufel steckt oft im Detail.

Z.B. hatte ich die Fehlermeldung mit "Tls......" ebenfalls. Ich habe letztendlich die 3 Optionen von DNSMasq unter "Basic Setup" deaktiviert.

Edit:
Was ich im Vergleich zu der Konfiguration von Loreas anders machen würde, wäre die Option "key-direction 1" von Additional Config rauszunehmen, weil die wahrscheinlich von TCP config stammt.

Mit ifconfig, tun0 oder tun1 fand ich auch etwas zu umständlich. Ich habe einfach die iptables von TomatoUSB genommen.
 
Last edited:
Ich hau jetzt mal hier meine configs rein. So langsam sehe ich den Wald vor lauter Bäumen nicht. Das Problem. Ich bekomme zwar ein connected success. Aber entweder lahmt die Verbindung bis hin zum Verbindungsfehler oder es kommt erst gar keine Zustande. Was mir auch schleierhaft ist, dass wenn ich eine Verbindung habe und diese auf check-ip testen will, dauert es ewig oder es kommt ein Verbindungsfehler zustande.

Code:
ca /tmp/openvpncl/ca.crt
cert /tmp/openvpncl/client.crt
key /tmp/openvpncl/client.key
management 127.0.0.1 16
float
management-log-cache 50
verb 4
mute 5
syslog
client
resolv-retry infinite
nobind
persist-key
persist-tun
script-security 2
tls-client
fast-io


Code:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -I FORWARD -i br0 -o tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -o br0 -j ACCEPT
iptables -I FORWARD -i br0 -o vlan2 -j DROP
iptables -I INPUT -i tun1 -j REJECT
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
 

Attachments

  • 01.png
    01.png
    88.3 KB · Views: 32
  • 11.png
    11.png
    102.9 KB · Views: 35
Ich nehme an das Du die Ausgabe von Additional Config mit "cat /tmp/openvpncl/openvpn.conf" gemacht hast. Die Ausgabe scheint mir auf den ersten Blick unvollständig zu sein.
1. Nimm Additional Config von Loreas und entferne dort "key-direction 1".
2. Versuch erstmal die iptables von Tomato, also:

Code:
iptables --flush FORWARD
iptables -P FORWARD DROP
iptables -I FORWARD -o tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -t nat -I POSTROUTING -o tun+ -j MASQUERADE

Wenn später alles wieder funktioniert, kannst Du immer noch zu den ursprünglichen iptables wechseln.

Hast Du noch ein Startup Script eingetragen gehabt?

3. Wenn nach dieser Konfiguration die Verbindung immer noch abbricht, poste bitte die Ausgabe von der Log Datei die unter dem Menü Status-> OpenVPN zu finden ist.
 
Last edited:
Weil im TomatoUSB Mod Bereich die Frage aufgetaucht ist, wie auf dd-wrt das Policy Based Routing funktioniert:
DD-WRT hat noch eine "policy based routing" Option in der OpenVPN Client Konfiguration. Wie die genau funktioniert musst du dich noch erkundigen.

Policy Based Routing auf dd-wrt funktioniert so:

Dort wo die "Additional config" eingegeben wird ist ein Kästchen darunter, wo "Policy Based Routing" bzw. "Richtlinienbasiertes Routen" steht.

Bildschirmfoto1.png

Dieses Kästchen kann man mit allen internen IPs füttern, die sich über VPN verbinden sollen. (eine IP pro Zeile)

Jedoch muss dazu die Firewall-Einstellung gelöscht werden, da diese ansonsten trotzdem alles wieder über VPN routet.
Selber getestet, es funktioniert...

ABER:
Ich weiß nicht wie sicher bzw. unsicher das ohne Firewall-Einstellung ist und lass das erstmal so im Raum stehen.
 
Jedoch muss dazu die Firewall-Einstellung gelöscht werden, da diese ansonsten trotzdem alles wieder über VPN routet.

Da bräuchte man wieder zusätzliche iptables Regeln zu den Firewallregeln.
Wenn die IP 192.168.1.150 in "Richtlinienbasiertes Routen" aufgenommen wird, dann bräuchte man wahrscheinlich folgende iptables.
Ich weiß aber nicht ob sie richtig geschrieben sind.

Code:
iptables -I FORWARD -i br0 -s 192.168.1.150 -j ACCEPT
iptables -I FORWARD -o br0 -d 192.168.1.150 -j ACCEPT
 
ABER:
Ich weiß nicht wie sicher bzw. unsicher das ohne Firewall-Einstellung ist und lass das erstmal so im Raum stehen.

Kommt ja auch drauf an, welche Regeln du löscht. Ob alle oder nur die Regeln aus der NAT Tabelle, die NAT Regeln haben nichts mit dem Filtern des Traffics an sich zu tun, dafür ist die Tabelle Filter zuständig. Nur die Regeln aus der Filter Table sind für das Filtern deines Traffics zuständig und wenn du die unangetastet lässt, ist es so sicher wie vorher.

Die Regeln aus der Table Filter tragen auch nicht dazu bei, dass irgendwas über VPN geroutet wird, dazu ist die Table NAT zusammen mit der Routing Tabelle des jeweiligen Systems zuständig.
 
@JackCarver *zustimmend nickend* jedoch keinen Plan von was du hier redest.

Von welchen Filtern redest du hier? Hab nichts in NAT stehen und "Tabelle Filter" gibts hier in dd-wrt auch nicht. Kannst du für mich oder uns das jetzt vielleicht nochmal praxisnaher erklären anhand von dd-wrt? plz...
 
Back
Top