it-swarm.com.de

Ausgabeverkehr auf verschiedenen Schnittstellen basierend auf dem Zielport

Meine Frage ist im Grunde die gleiche wie Nur bestimmten ausgehenden Verkehr 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. Angenommen, ich möchte, dass der gesamte https-Verkehr über wlan0. Wenn ich nun die in der anderen Frage vorgeschlagene Lösung verwende, wird der https-Verkehr über wlan0, hat aber immer noch die Quelladresse von eth1 (10.0.0.2). Da diese Adresse für das wlan0 Gateway, Antworten werden nie zurückkommen. Der einfache Weg wäre, einfach die Bind-Adresse in der Anwendung richtig einzustellen, aber in diesem Fall ist sie nicht anwendbar.

Ich denke, ich muss die src-addr neu schreiben:

# 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. Sie landen jedoch wahrscheinlich nie in der Anwendung, da ich nur sehe, dass die Anwendung das SYN-Paket erneut sendet, obwohl das SYN- ACK wurde bereits empfangen.

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

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

aber das hat auch nicht funktioniert. Ich stecke also irgendwie hier fest. Irgendwelche Vorschläge?

25
rumpel

Du bist nah dran.

Der eigentliche Grund dafür, dass die Anwendung den Rückverkehr nicht sieht, liegt im integrierten IP-Spoofing-Schutz des Kernels. Das heißt, der Rückverkehr stimmt nicht mit der Routing-Tabelle überein und wird daher gelöscht. 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 Marke ist notwendig. Behalte es.
  2. Quelle NAT ist ebenfalls erforderlich.
  3. Die endgültige DNAT ist nicht erforderlich, sodass Sie sie entfernen können.

Stellen Sie sicher, dass Sie das Paket iproute installiert haben. Wenn Sie den Befehl ip haben, sind Sie gesetzt (wie es aussieht, aber wenn nicht, holen Sie sich das zuerst).

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

200 wlan-route

Anschließend müssen Sie Ihre neue Routing-Tabelle mit dem Namen wlan-route mit einem Standard-Gateway und erstellen Sie Regeln zum bedingten Senden von Datenverkehr an diese Tabelle. Ich gehe davon aus, dass Ihr Standard-Gateway 192.168.0.1 ist. Dies muss natürlich zu Ihrem tatsächlichen Netzwerk passen und nicht nur zu meinen Annahmen.

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

Ihr endgültiges kommentiertes 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
25
bahamat

Bahamats Lösung ist richtig; Beachten Sie jedoch, dass die einzige Möglichkeit für mich darin bestand, den rp_filter für jede Schnittstelle im System zu deaktivieren, nicht nur für die beiden (in diesem Fall eth1 und wlan0), die am NATing beteiligt sind.

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 veröffentlichte Link existiert nicht mehr, aber ich habe ihn über die Wayback-Maschine gefunden.)

10
Davide C

Ein Vorschlag: Sie sollten in der Ausgabekette immer --sport Anstelle von --dport Verwenden.

NATs ändern das dport und das macht Ihre Regel unkompliziert.

0
user73451

Ich denke unten wird benötigt:

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
0
user181234