Mar 052011
 

Beim Versuch auf einem DD-WRT Router (DD-WRT v24-sp2) mittels OpenVPN eine Lan2Lan Kopplung zu bauen bin ich ueber ein kleines gemeines Detail gestolpert: DD-WRT nimmt das mit dem OpenVPN “Client” sehr ernst, es nattet alles was ueber den VPN Tunnel rausgeht, und laesst keine neuen Anfragen aus dem Tunnel heraus zu, nur Pakete die zu einer bestehenden Verbindung gehoeren. PCs hinter dem Router koennen also wunderbar auf das Netz hinter dem OpenVPN Server zugreifen, aber nicht umgekehrt. Ist natuerlich bloed wenn ein System auf Serverseite die Verbindung aufbauen will, z.b. wenn irgendwas auf einem Drucker hinter dem DD-WRT Router ausgeben soll.

Fuer eine echte Lan2Lan Kopplung gibt es im DD-WRT Wiki die abenteuerlichsten Vorschlaege – das einfachste duerfte aber mein Weg sein: einfach folgende Befehle im DD-WRT Webinterface unter “Administration” -> “Commands” eintragen und als Firewall-Regeln speichern:

iptables -N VPN
iptables -F VPN
iptables -A VPN -i tun0 -o br0 -j ACCEPT
iptables -I INPUT -i tun0 -j VPN
iptables -I FORWARD -i tun0 -j VPN
iptables -I POSTROUTING -t nat -o tun0 -j RETURN

Was dann geschieht ist folgendes:
Es wird eine neue VPN Chain angelegt und geleert. Alles was aus dem Interface tun0 kommt und aus dem Interface br0 raus will (das ist das LAN-Interface des Routers) wird akzeptiert. Jetzt sagen wir iptables das sowohl alle Pakete die aus dem Tunnel kommen durch die neu angelegte Chain laufen sollen. Klar, man haette auch direkt hier sagen koennen das die Pakete in Ordnung sind und durch duerfen, aber falls man den Traffic durch den Tunnel doch mal sauberer regeln will ist es so deutlich eleganter. Als letztes fuegen wir jetzt noch an den ANFANG (!) der POSTROUTING Chain eine Regel ein die iptables anweist die Pakete nicht zu natten, und schon ist die Lan2Lan Kopplung fertig.

Jetzt kann DD-WRT kommen und machen was es will, die dynamisch erzeugten Firewallregeln fuers NAT im VPN Tunnel landen immer am Ende der POSTROUTING-Chain, und werden damit nie ausgefuehrt.