iptables: Internet-Traffic durch Proxy leiten, LAN-Traffic auf anderes Interface

Cai-pirinha

Lt. Junior Grade
Registriert
Juni 2007
Beiträge
420
Hallo,
ich möchte auf meinem OpenWRT Router den Internet-Traffic durch wlan0 durch meine Proxy leiten. Das klappt immerhin auch bereits durch zwei PREROUTING Regeln (s.u.).

Allerdings möchte ich, dass der Zugriff auf lokale Hosts (und vice versa) weiterhin möglich ist und auf das LAN-Interface weitergeleitet wird. Das kriege ich einfach nicht gebacken...

Ich habe wlan0 das Subnetz 192.168.179.0/24 zugewiesen, das LAN ist über Interface eth0 auf 192.168.178.0/24 unterwegs.
Das LAN wird von einem Router 192.168.178.2 aufgespannt, der OpenWRT geht als 192.168.178.4 ins LAN und hat die 192.168.179.1 auf dem wlan0 Interface.

Die Proxy-Zone ist wie folgt in der /etc/config/firewall definiert:
Code:
config zone
        option name             proxy
        option network          'proxy'
        option input            REJECT
        option output           ACCEPT
        option forward          ACCEPT
        option conntrack        '1'

In der /etc/config/network habe ich:
Code:
config interface 'proxy'
        option proto 'static'
        option ipaddr '192.168.179.1'
        option netmask '255.255.255.0'

Die beiden PREROUTING-Regeln habe ich mit dem ! -d 192.168.178.0/24 Flag versehen, um den lokalen Traffic nicht durch die Proxy zu leiten, aber nun weiß ich nicht, wie ich den Rest genau anpacken muss. Eine naive Static route von 192.168.179.0/24 nach 192.168.178.0/24 über das Gateway 192.168.178.4 (oder auch 192.168.178.2) führt zu gar keiner Veränderung, die 178er IPs bringen mit oder ohne static route nur ein "Connection refused".

Ich schätze, ich muss die Pakete noch maskieren, liege ich da richtig? Ich habe es mit den beiden unteren Regeln versucht:
Code:
iptables -t nat -A PREROUTING -i wlan0 ! -d 192.168.178.0/24 -p udp --dport 53 -j REDIRECT --to-port 9053
iptables -t nat -A PREROUTING -i wlan0 ! -d 192.168.178.0/24 -p tcp --syn -j REDIRECT --to-port 9040
iptabels -t nat -A POSTROUTING -i wlan0 -d 192.168.178.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

... leider ohne Erfolg (weiterhin Connection refused), und bitte nun um ein bisschen Input in der Sache, da ich vom googlen langsam den Wald vor lauter Bäumen nicht mehr sehe...

Vielen Dank!
 
-i geht nicht in der POSTROUTING Kette ;)

Probier mal:
Code:
iptables -t nat -A POSTROUTING -s 192.168.179.0/24 -o eth0 -j MASQUERADE

Wozu eigentlich das 192.168.179.0 Netz? Läuft dort ein DHCP-Server?
 
Zuletzt bearbeitet:
Im privaten Netzwerk sollte man NAT vermeiden. Es funktioniert zwar, ist aber eine schlechte Angewohnheit, weil man so am Zielgerät die Möglichkeit verliert, den Traffic je nach Herkunft anders zu behandeln.

Wenn die Connection refused wird, liegt das evtl an der Firewall des Zielgeräts. Windows mag es zB ab Werk gar nicht, aus einem anderen Subnetz als dem eigenen angesprochen zu werden. Heißt: Dateifreigaben via SMB werden von der Windows-Firewall ausschließlich aus dem lokalen Subnetz erlaubt. Wenn du jedoch daheim mehrere Subnetze hast, wird Windows den Zugriff wie beschrieben blockieren. Um das zu ändern, muss man in die Firewall-Einstellungen gehen und unter den eingehenden Regeln die passende suchen (zB für SMB) und dort in den Eigenschaften unter "Bereich" die zugelassenen Quell-IPs bzw. -Subnetze eintragen. Dann sollte auch nix mehr refused werden. Für andere Dienste, die so erreichbar sein sollen, muss man das natürlich ebenso einstellen.
 
  • Gefällt mir
Reaktionen: tony_mont4n4
till69 schrieb:
-i geht nicht in der POSTROUTING Kette ;)

Probier mal:
Code:
iptables -t nat -A POSTROUTING -s 192.168.179.0/24 -o eth0 -j MASQUERADE

Wozu eigentlich das 192.168.179.0 Netz? Läuft dort ein DHCP-Server?

das zweite netz brauche ich doch, damit ich den traffic des interfaces wlan0 getrennt behandeln kann. wenn ich wlan0 mit bridge, dann müsste ich die komplette bridge umleiten, oder gar nichts. oder verstehe ich etwas falsch?
dein tipp hat leider auch nicht geholfen. danke dennoch fürs erste!

@Raijin windows ist da überhaupt nicht involviert.. aber ich verstehe den punkt. dennoch würde ich mich freuen, wenn es überhaupt irgendwann einmal funktionieren würde wie ich beschrieben habe.

edit: leider habe ich hier auch quasi restmüll-router zur verfügung, auf denen die aktuellsten openwrt bzw dd-wrt versionen nicht laufen. auf dem router um den es gerade geht, läuft bspw. dank mediatek chipsatz jüngstens LEDE 17.01.6.
ein anderer router wäre vom chipsatz nicht so wählerisch, der hat allerdings nur 4mb flash und 32mb ram und spielt daher in meinen proxy-überlegungen erstmal keine rolle :D
 
Cai-pirinha schrieb:
windows ist da überhaupt nicht involviert
Windows war auch nur ein Beispiel. Worauf ich hinauswollte ist, dass eben das Ziel den eingehenden Traffic auch aktiv blocken kann, wenn er nicht aus dem lokalen Subnetz kommt. Meine beiden Billig-WLAN-Radios haben zwar nur eine sehr rudimentäre GUI, aber sie lässt sich nicht aus einem meiner anderen VLANs bzw Subnetze aufrufen. Nur aus dem lokalen Subnetz geht es oder eben wenn ich eine masquerade-Regel einbaue und die Radios denken, dass der Traffic aus dem eigenen Subnetz kommt.

Um solchen Problemen auf die Schliche zu kommen, solltest du mittels tcpdump / WireShark prüfen bis wohin der Traffic geht und vor allem wie dort jeweils der Header bez. Quell-/Ziel-IP aussieht. tcpdump kannst du auch bei OpenWRT installieren, ggfs nur tcpdump lite oder wie auch immer das abgespeckte Paket heißt. So kannst du am Router genau sehen was wo reinkommt und wo es wieder rausgeht.

Eine masquerade-Regel zwischen den beiden privaten Subnetzen brauchst du nur, wenn

  • die Quelle selbst keine Route ins zweite Subnetz kennt (ggfs das Standardgateway, s.u.)
  • das Standardgateway des ersten Subnetzes keine Route in das zweite Subnetz kennt
  • das Ziel im zweiten Subnetz Zugriffe aus dem ersten Subnetz (oder generell allen außer dem eigenen) blockt


Zudem kannst du bei iptables mit -v den Paket/Bytecounter sehen und so gucken welche Regeln getriggert werden. Dabei solltest du insbesondere darauf achten ob der Traffic ggfs bereits vor deinen benutzerdefinierten Regeln durch etwaige automatisch generierte Regeln von OpenWRT abgefangen wird.
 
Cai-pirinha schrieb:
das zweite netz brauche ich doch, damit ich den traffic des interfaces wlan0 getrennt behandeln kann. wenn ich wlan0 mit bridge, dann müsste ich die komplette bridge umleiten, oder gar nichts. oder verstehe ich etwas falsch?
Nein, brauchst Du nicht, deine beiden PREROUTING Regeln können nur wlan0 (auch wenn bridged):
Code:
opkg install iptables-mod-physdev
Code:
iptables -t nat -A PREROUTING ! -d 192.168.178.0/24 -p tcp --syn  -m physdev --physdev-in wlan0 -j REDIRECT --to-port 9040
Um das ganze zu testen, würde ich die OpenWRT Firewall erst mal ausschalten (service firewall stop) bis Deine manuellen Regeln funktionieren.

Cai-pirinha schrieb:
leider habe ich hier auch quasi restmüll-router zur verfügung
Eine Fritzbox 4040 ist für den Zweck prima, 32 Flash, 256 RAM, QuadCore, und kann dank USB3 prima MiniNAS sein (110 MB/s).
 
Zurück
Oben