GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Datenverkehr auf verschiedenen Schnittstellen basierend auf dem Zielport ausgeben?

Meine Frage ist im Grunde dieselbe 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 über wlan0 läuft .
Wenn ich nun die in der anderen Frage vorgeschlagene Lösung verwende, wird der https-Verkehr durch wlan0 geleitet , hat aber immer noch die Quelladresse von eth1 (10.0.0.2). Da diese Adresse für das wlan0 nicht routebar ist Gateway, Antworten werden 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 denke, ich muss die 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 die ausgehenden Pakete gut und eingehende Pakete kommen für 192.168.0.2 an, aber sie landen wahrscheinlich nie in der Anwendung, weil alles, was ich jemals sehe, ist, dass die Anwendung das SYN-Paket erneut sendet, obwohl das SYN- ACK wurde bereits empfangen.

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

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

aber auch das ging nicht. Also ich hänge hier irgendwie fest. Irgendwelche Vorschläge?

Akzeptierte Antwort:

Du bist in der Nähe.

Der eigentliche Grund dafür, dass die Anwendung den Rückverkehr nicht sieht, liegt am eingebauten IP-Spoofing-Schutz des Kernels. D.h. der Rückverkehr passt nicht zur Routing-Tabelle 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. Der richtigere Weg ist, eine alternative Routing-Instanz zu erstellen.

  1. Die Markierung ist notwendig. Behalte es.
  2. Quell-NAT ist ebenfalls erforderlich.
  3. Das letzte DNAT ist unnötig, also können Sie es entfernen.

Stellen Sie sicher, dass Sie die iproute haben Paket installiert. Wenn Sie die ip Befehl, dann sind Sie fertig (was es so aussieht, aber wenn nicht, holen Sie sich das zuerst).

Bearbeiten Sie /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 konfigurieren 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. Natürlich muss dies 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

Linux
  1. Linux – Raspberrypi Serielle Schnittstelle?

  2. Linux – Verschiedene Formate von Objektdateien in Linux?

  3. Überprüfen Sie die Portverwendung in Linux

  4. tee-Befehlsbeispiele in Linux

  5. Linux-SCP definiert den Zielport

So führen Sie einen Port-Scan unter Linux durch

So installieren und verwenden Sie den webbasierten Linux Network Traffic Analyzer von Darkstat

So pingen Sie eine Portnummer in Linux an

Eingabe-Ausgabe-Umleitung unter Linux erklärt

Beispiele für Linux-Echo-Befehle

Öffnen eines Ports unter Linux