Datenverkehr auf verschiedenen Schnittstellen basierend auf dem Zielport ausgeben


23

Meine Frage ist im Grunde die gleiche wie Nur bestimmten ausgehenden Datenverkehr auf bestimmten Schnittstellen zulassen .

Ich habe zwei Schnittstellen eth1(10.0.0.2) und wlan0(192.168.0.2). Meine Standardroute ist für eth1. Nehmen wir an, ich möchte, dass der gesamte https-Verkehr durchläuft wlan0. Wenn ich nun die in der anderen Frage vorgeschlagene Lösung verwende, wird der https-Verkehr durchlaufen wlan0, hat jedoch weiterhin die Quelladresse eth1(10.0.0.2). Da diese Adresse für das wlan0Gateway nicht routingfähig ist , werden Antworten niemals zurückkommen. Der einfache Weg wäre, einfach die bind-addr in der Anwendung richtig einzustellen, aber in diesem Fall ist sie nicht anwendbar.

Ich glaube, ich muss das src-addr umschreiben:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Jetzt sieht tcpdump, dass die ausgehenden Pakete in Ordnung sind und eingehende Pakete für 192.168.0.2 eintreffen. Wahrscheinlich landen sie jedoch nie in der Anwendung. Alles, was ich jemals zu sehen bekomme, ist, dass die Anwendung das SYN-Paket erneut sendet. ACK wurde bereits empfangen.

Also dachte ich mir, ich muss vielleicht auch die eingehende Adresse umschreiben:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

aber das hat auch nicht geklappt. Also stecke ich irgendwie hier fest. Irgendwelche Vorschläge?

Antworten:


24

Du bist in der Nähe.

Der eigentliche Grund dafür, dass die Anwendung den zurückkommenden Datenverkehr nicht sieht, ist der integrierte IP-Spoofing-Schutz des Kernels. Dh der Rückverkehr stimmt nicht mit der Routing-Tabelle überein und wird daher verworfen. Sie können dies beheben, indem Sie den Spoofing-Schutz wie folgt deaktivieren:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Aber ich würde es nicht empfehlen. Am besten erstellen Sie eine alternative Routing-Instanz.

  1. Die Markierung ist notwendig. Behalte es.
  2. Quell-NAT ist ebenfalls erforderlich.
  3. Die endgültige DNAT ist nicht erforderlich, sodass Sie sie entfernen können.

Stellen Sie sicher, dass Sie das iproutePaket installiert haben. Wenn Sie den ipBefehl haben, sind Sie eingestellt (wie es aussieht, aber wenn nicht, bekommen Sie das zuerst).

Bearbeiten /etc/iproute2/rt_tablesund fügen Sie eine neue Tabelle hinzu, indem Sie die folgende Zeile anhängen:

200 wlan-route

Anschließend müssen Sie Ihre neue Routingtabelle wlan-routemit einem Standardgateway konfigurieren und Regeln erstellen, um bedingt Datenverkehr an diese Tabelle zu senden. Ich gehe davon aus, dass Ihr Standard-Gateway 192.168.0.1 ist. Dies muss natürlich mit Ihrem tatsächlichen Netzwerk übereinstimmen und nicht nur mit meinen Annahmen.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Das endgültige mit Anmerkungen versehene Skript würde folgendermaßen aussehen:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu untersuchen. Dies ist jedoch bereits das, was ich verwendet habe (wie in der anderen Frage beschrieben), so dass ich die zusätzliche Route eingerichtet habe, aber es ist immer noch das gleiche. Die SYN-ACKs kehren zu 192.168.0.2 zurück, erreichen aber anscheinend nie die Anwendung.
Rumpel

Geh zurück und lies meine Antwort noch einmal. Ich habe das angesprochen.
Bahamat

Der Teil über den Fälschungsschutz? Keine Änderung, auch nach dem Versuch. Tut mir leid, lese es ein paar Mal hin und her, habe aber noch nicht verstanden, was ich vermisse.
Rumpel

Sie müssen srcden ip routeBefehlen eine Option hinzufügen , um die richtige Quelladresse anzugeben.
David Schwartz

@DavidSchwartz: das POSTROUTING SNATwird sich darum kümmern.
Bahamat

8

Bahamats Lösung ist richtig; Beachten Sie jedoch, dass ich diese Funktion nur ausführen konnte, indem ich den rp_filter für jede Schnittstelle im System deaktivierte, nicht nur für die beiden, die am NAT-Vorgang beteiligt sind (in diesem Fall eth1 und wlan0).

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(Siehe den WICHTIGEN Hinweis am Ende dieser Seite: Advanced Routing Howto - der dort gepostete Link existiert nicht mehr, aber ich habe ihn über die Wayback-Maschine gefunden.)


Vielen Dank für diese Antworten, ich konnte auch nur Bahamats Lösung unter Berücksichtigung Ihrer Antwort zum Laufen bringen.
Dynalon

für mich auf einer ziemlich normalen Ubuntu 12.04 LTS-Box musste ich neben dem Deaktivieren von rp_filter und dem Leeren des Routencaches auch den Schnittstellennamen aus den iptables-Argumenten streichen. Ich hatte nicht genug Zeit, um zu untersuchen, warum.
Costin Gușă

0

Ein Vorschlag: Sie sollten immer --sportstatt --dportin der Ausgabekette verwenden.

NATs ändern das dportund das macht Ihre Regel uneinsichtig.


2
Gibt es etwas, das ich nicht bekomme? Der dport kann wie im Zielport nicht geändert werden. Dies ist der Port des Dienstes, den die Sitzung zu erreichen versucht, z. B. http, ssh, smtp. Entweder hast du Sport und Sport verwirrt, oder mir fehlt etwas Offensichtliches. : P
Jemand

0

Ich denke, dass unten benötigt wird:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.