Frage Erzwingen Sie lokalen IP-Datenverkehr zu einer externen Schnittstelle


Ich habe eine Maschine mit mehreren Schnittstellen, die ich so konfigurieren kann, wie ich möchte, zum Beispiel:

  • eth1: 192.168.1.1
  • eth2: 192.168.2.2

Ich möchte den gesamten Verkehr, der an eine dieser lokalen Adressen gesendet wurde, über die andere Schnittstelle weiterleiten. Zum Beispiel sollten alle Anfragen an einen iperf, ftp, http-Server unter 192.168.1.1 nicht nur intern weitergeleitet werden, sondern über eth2 weitergeleitet werden (und das externe Netzwerk wird dafür sorgen, dass das Paket nach eth1 umgeleitet wird).

Ich habe versucht und sah verschiedene Befehle, wie Iptables, IP-Route, etc ... aber nichts hat funktioniert.

Das engste Verhalten, das ich bekommen konnte, war getan mit:

ip route change to 192.168.1.1/24 dev eth2

die alle 192.168.1.x an eth2 senden, mit Ausnahme von 192.168.1.1, die intern noch geroutet wird. Könnte ich dann NAT-Weiterleitung des gesamten Traffics auf 192.168.1.2 auf eth1 fälschen, intern auf 192.168.1.1 umgeleitet werden? Ich kämpfe eigentlich mit Iptables, aber es ist zu schwer für mich.

Das Ziel dieses Setups ist es, Schnittstellentreiber-Tests durchzuführen, ohne zwei PCs zu verwenden.

Ich benutze Linux, aber wenn Sie wissen, wie man das mit Windows macht, kaufe ich es!

Bearbeiten:

Das externe Netzwerk ist nur ein Crossover-Kabel zwischen eth1 und eth2. Nehmen wir an, ich habe einen http-Server auf meinem Rechner. Jetzt möchte ich von demselben Rechner aus auf diesen Server zugreifen, aber ich möchte den TCP / IP-Datenverkehr über dieses eth1 / eth2-Kabel erzwingen. Wie sollte ich meine Schnittstellen dafür konfigurieren?


29
2018-03-30 12:09


Ursprung


Wollen Sie, dass der gesamte Datenverkehr über die Schnittstellen 1 und 2 gespiegelt wird, aber nur von einem anderen Router an die Schnittstelle 2 zurückgegeben wird? Könnte das nicht ein paar ziemlich seltsame Dinge im Netzwerk tun? Wäre es besser, den gespiegelten Datenverkehr von der Schnittstelle 2 zu einem anderen System zu leiten, das nur Datenverkehr löschte und dann überwachen kann, oder Virtualisierungssoftware zu verwenden, um den Datenverkehr zu erfassen? Vielleicht fehlt mir etwas in der Beschreibung. - Bart Silverstrim
Es klingt so, als wolle er ein Paket erzeugen, zum Beispiel 192.168.1.1, welches die IP von eth1 ist. Aber anstatt dass der Linux-Stack das Paket intern empfängt, will er das Paket eth2 (welches extern in eth1 und dann in den Linux-Stack geliefert wird). Ich bin mir nicht sicher, ob das möglich ist; Sobald der Netzwerk-Layer erkennt, dass die Adresse eine interne Schnittstelle ist, wird es wenig Grund haben, Routing-Tabellen zu betrachten. Jemand anderes weiß es vielleicht besser. - PP.


Antworten:


Ich habe Caladonas Antwort erweitert, da ich keine Antwortpakete sehen konnte. Für dieses Beispiel:

  1. Auf meinem lokalen PC habe ich NICs in verschiedenen Subnetzen, 192.168.1 / 24, 192.168.2 / 24 
  2. Es gibt einen externen Router / PC, der Zugriff auf beide Subnetze hat.
  3. Ich möchte bidirektionalen Datenverkehr über die NICs auf dem lokalen PC senden.
  4. Die Konfiguration erfordert zwei nicht verwendete IP-Adressen für jedes Subnetz.

Lokale PC-iptable-Routen sind auf SNAT und DNAT-ausgehenden Datenverkehr zu der "gefälschten" IP eingestellt.

iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source      192.168.2.100
iptables -t nat -A PREROUTING  -d 192.168.1.100 -i eth0           -j DNAT --to-destination 192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source      192.168.1.100
iptables -t nat -A PREROUTING  -d 192.168.2.100 -i eth1           -j DNAT --to-destination 192.168.2.1

Die Regeln machen folgendes:

  1. Schreiben Sie 192.168.2.1 Quelle auf 192.168.2.100 für ausgehende Pakete neu
  2. Schreiben Sie das Ziel 192.168.1.100 bei eingehenden Paketen auf 192.168.1.1 zurück
  3. Schreiben Sie 192.168.1.1 für ausgehende Pakete in 192.168.1.100 um
  4. Schreiben Sie das Ziel 192.168.2.100 bei eingehenden Paketen auf 192.168.2.1 zurück

Zusammenfassend kann das lokale System nun mit einer "virtuellen" Maschine mit den Adressen 192.168.1.100 und 192.168.2.100 kommunizieren.

Als nächstes müssen Sie Ihren lokalen PC zwingen, den externen Router zu benutzen, um Ihre gefälschte IP zu erreichen. Dazu erstellen Sie eine direkte Route zu den IP-Adressen über den Router. Sie möchten sicherstellen, dass Sie die Pakete auf das Gegenteil des Ziel-Subnetzes zwingen.

ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP 
ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP

Schließlich muss der externe Router wissen, wie er die gefälschten IPs auf Ihrem lokalen PC erreichen kann. Sie können Thins ausführen, indem Sie Proxy-ARPs für Ihr System aktivieren.

echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Mit diesem Setup können Sie die gefälschten IPs nun als echtes System auf Ihrem lokalen PC behandeln. Durch das Senden von Daten an das .1-Subnetz werden Pakete aus der .2-Schnittstelle herausgedrückt. Durch das Senden von Daten an das Subnetz ".2" werden Pakete aus der .1-Schnittstelle herausgefiltert.

ping 192.168.1.100
ping 192.168.2.100

15
2018-04-02 03:34



Viel besser ist dein Weg! Beachten Sie, dass ich auch einen ip_forward brauche, damit die ARP-Funktion funktioniert: echo 1> / proc / sys / net / ipv4 / ip_forward - calandoa


Unter Linux habe ich Folgendes erfolgreich getestet, um den Durchsatz einer neuen Dual-Port-10Gbps-Karte im "Loopback" -Modus zu testen, dh ein Port wurde direkt in den anderen gesteckt. Das ist alles nur ein bisschen Voodoo, nur um Pakete aus der Leitung herauszuzwingen, aber wenn nicht, wird Linux nur den Verkehr durch den Kernel kurzschließen (daher die Frage des OP). In der obigen Antwort von Casey bin ich nicht sicher, ob es wirklich notwendig war, einen externen Router zu haben oder nicht, aber das Folgende ist vollständig in sich abgeschlossen. Die zwei Schnittstellen sind eth2 und eth3.

Weisen Sie den Schnittstellen IPs zu und stellen Sie sie in separate Netzwerke:

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

Als Nächstes richten wir ein doppeltes NAT-Szenario ein: Zwei neue gefälschte Netzwerke haben das andere erreicht. Auf dem Weg nach draußen, Quelle NAT zu Ihrem gefälschten Netzwerk. Auf dem Weg dorthin das Ziel festlegen. Und umgekehrt für das andere Netzwerk:

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

Jetzt sagen Sie dem System, wie man zu jedem gefälschten Netzwerk gelangt, und füllen Sie die arp-Einträge vorab aus (stellen Sie sicher, dass Sie Ihre MAC-Adressen ersetzen, benutzen Sie nicht meine):

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

Das täuscht Linux genug, um Pakete tatsächlich auf die Leitung zu setzen. Zum Beispiel:

ping 10.60.1.1

goes out eth2, die Quell-IP 10.50.0.1 erhält NATted auf 10.60.0.1, und da es in eth3 ankommt, wird das Ziel 10.60.1.1 auf 10.50.1.1 NATted. Und die Antwort geht eine ähnliche Reise.

Verwenden Sie jetzt iperf, um den Durchsatz zu testen. An die richtigen IPs binden und sicher sein, welche IP-Adresse du kontaktierst (die falsche Adresse des anderen Endgeräts):

# server
./iperf -B 10.50.1.1 -s

# client: your destination is the other end's fake address
./iperf -B 10.50.0.1 -c 10.60.1.1 -t 60 -i 10

Stellen Sie sicher, dass der Datenverkehr wirklich an die Leitung geht:

tcpdump -nn -i eth2 -c 500

Sie können auch / proc / interrupts beobachten, nur um absolut sicher zu sein, dass die Karte verwendet wird:

while true ; do egrep 'eth2|eth3' /proc/interrupts ; sleep 1 ; done

Wie dem auch sei, ich fand diesen Beitrag auf der Suche nach dem Weg, danke für die Q & A-Leute, und hoffe, das hilft jedem, der diesen Post in Zukunft findet.


28
2017-09-08 16:31



+1 Große Lösung - dies erfordert nicht einmal die ip-Weiterleitung zu aktivieren! Dies ist genau das, was ich gerade brauchte (für 10GB Tests über Loopback). - Nils
Wow, danke @ Nils für das Kopfgeld! - Steve Kehlet


Wie immer - ich bin ein bisschen spät - aber heutzutage könnte man Netzwerk-Namespaces verwenden, um die Schnittstellen zu isolieren und jede lokale Weiterleitung zu verhindern (und mit iptables zu fummeln :)).

Erstellen Sie Namespaces (alle mit den erforderlichen Berechtigungen, z. B. als root):

ip netns add ns_server
ip netns add ns_client

Beachten Sie, dass auf die Schnittstellen status / config jetzt zugegriffen werden muss der Kontext des zugewiesenen Namespace - so werden sie nicht angezeigt, wenn Sie einen Naked ausführen IP-Verbindung da dies im Kontext des Standardnamespace ausgeführt wird. Das Ausführen eines Befehls in einem Namespace kann mithilfe von ausgeführt werden

ip netns exec <namespace-name> <command>

als Präfix.

Ordnen Sie nun Namespaces Schnittstellen zu, übernehmen Sie config und setzen Sie die Schnittstellen auf:

ip link set eth1 netns ns_server
ip netns exec ns_server ip addr add dev eth1 192.168.1.1/24
ip netns exec ns_server ip link set dev eth1 up
ip link set eth2 netns ns_client
ip netns exec ns_client ip addr add dev eth2 192.168.1.2/24
ip netns exec ns_client ip link set dev eth2 up

Jetzt können Sie die Anwendungen im Namespace ausführen - für den iperf-Server ausführen

ip netns exec ns_server iperf -s -B 192.168.1.1

und der Kunde:

ip netns exec ns_client iperf -c 192.168.1.1 -B 192.168.1.2

Der Datenverkehr wird nun über die physischen Schnittstellen gesendet, da der gesamte Netzwerkstack, die Schnittstelle, das Routing ... durch die Namespaces isoliert sind, so dass der Kernel die im Datenverkehr verwendeten Adressen nicht mit lokalen (verfügbaren) Schnittstellen abgleichen kann.

Wenn Sie mit Ihren Experimenten fertig sind, löschen Sie einfach die Namespaces:

ip netns del <namespace-name>

Die Schnittstellen werden dem Standardnamespace neu zugewiesen, und alle im Namespace vorgenommenen Konfigurationen werden gelöscht (z. B. müssen keine zugewiesenen IP-Adressen gelöscht werden).


7
2017-07-11 09:12





Ok, es ist mir endlich gelungen, meine Konfiguration einzurichten.

Die Idee ist, eine andere gefälschte Adresse zu verwenden, um den Weg dieser gefälschten Adresse zu der Schnittstelle 2 zu erzwingen, und dann die gefälschte Adresse mit der realen Adresse 2 mit NAT / iptables zu übersetzen.

Mein Setup besteht eigentlich aus einem Router, den ich zwischen IF1 (Schnittstelle 1) und IF2 telnet kann

In meiner Einrichtung befinden sich FAKE_ADDR und IF1_ADDR im selben Subnetz.

ifconfig $IF1 $IF1_ADDR netmask 255.255.255.0
ifconfig $IF2 $IF2_ADDR netmask 255.255.255.0

iptables -t nat -A PREROUTING -d $FAKE_ADDR -i $IF2 -j DNAT --to-destination $IF2_ADDR
iptables -t nat -A POSTROUTING -s $IF2_ADDR -d $IF1_ADDR/24 -j SNAT --to-source $FAKE_ADDR

route add $FAKE_ADDR gw $ROUTER_ADDR

Und auf dem Router:

route add $FAKE_ADDR gw $IF2_ADDR

Wenn ich etwas an FAKE_ADDR sende, wird pkt über IF1 an den Router weitergeleitet, erneut an IF2 weitergeleitet, dann wird FAKE_IP durch IF2_ADDR ersetzt. Das Paket wird vom Server verarbeitet, das Ergebnis wird von IF2_ADDR, das durch FAKE_ADDR ersetzt wird, an IF1_ADDR zurückgesendet.

Vielleicht ist es möglich, eine einfachere Konfiguration mit nur einem Crossover-Kabel zu verwenden, aber da ich es nicht versucht habe, gebe ich lieber meine Arbeitslösung.


3
2018-03-30 15:52



Wenn der Router $ FAKE_ADDR an $ IF2_ADDR sendet, muss die DNAT-Regel nicht "-i $ IF2" anstelle von "-i $ IF1" lauten? - cmcginty
Sie haben Recht Casey, Korrektur getan. - calandoa


Die Antwort von Thomas Tannhäuser war genau richtig!

Ich hatte eine ähnliche Situation: eine einzelne Maschine mit zwei Enet-Schnittstellen. Mein Plan war, eine Schnittstelle als Server (Empfänger) und die andere als Client (Absender) zu verwenden. Jede Schnittstelle würde an den Router angeschlossen und iperf würde den Verkehr durch den Router leiten, um Durchsatz, PPS, Verzögerung usw. zu messen.

Leider war der iptables-Ansatz nicht intuitiv und mit Problemen behaftet. Nach ein paar frustrierenden Stunden habe ich diesen Angriffsplan aufgegeben. Inspiriert von Thomas Vorschlag machte ich ein paar Hausaufgaben auf Linux IP Namespaces und begann die Einfachheit und Eleganz dieser Lösung zu schätzen.

Im Folgenden finden Sie eine Liste der genauen Befehle, mit denen ich meinen Fedora FC26 konfiguriert habe, um in dieser Funktion zu dienen. Die beiden Schnittstellen sind enp1s0 und enp3s0. Der Router hat zwei Schnittstellen mit den Adressen 192.168.2.112 und 172.16.16.2. Jeder FC26 ENET-Anschluss ist direkt mit der entsprechenden Router-Schnittstelle verkabelt.

# How to configure the IP Namespaces
ip netns add iperf-server
ip netns add iperf-client
ip link set enp1s0 netns iperf-server
ip link set enp3s0 netns iperf-client
ip netns exec iperf-server ip addr add dev enp1s0 192.168.2.139/20
ip netns exec iperf-client ip addr add dev enp3s0 172.16.16.2/24
ip netns exec iperf-client ip link set dev enp3s0 up
ip netns exec iperf-server ip link set dev enp1s0 up
ip netns exec iperf-server route add default gw 192.168.2.112
ip netns exec iperf-client route add default gw 172.16.16.1

# Test the interfaces and network using ping
ip netns exec iperf-client ping -c1 172.16.16.1
ip netns exec iperf-server ping -c1 192.168.2.112
ip netns exec iperf-server ping -c1 172.16.16.2
ip netns exec iperf-client ping -c1 192.168.2.139

# Start Iperf Server for UDP test
ip netns exec iperf-server iperf -u -s
# Run Client against Iperf server for UDP test
ip netns exec iperf-client iperf -u -c 192.168.2.139

1
2017-08-22 22:51





Es klingt wie Sie Ihre Linux-Box in eine Router / Bridge / Gateway / Firewall-Typ-Box verwandeln. Die folgenden Ressourcen sind möglicherweise das, wonach Sie suchen:

Das Linux-Router-Projekt

Liste der Router- oder Firewall-Distributionen

Linux LiveCD Router

Linux Journal - Der Linux-Router

Update basierend auf weiteren Informationen:

Ich glaube nicht, dass Sie in der Lage sein werden, zu tun, was Sie wollen. Das Betriebssystem wird immer seine interne Routing-Tabelle betrachten und beide IP-Adressen lokal "sehen". Es wird dann den Verkehr innerhalb des Betriebssystems routen und es nie auf die Leitung setzen. Sie benötigen eine zweite Maschine oder zwei virtuelle Maschinen (Auschecken Xen).


0
2018-03-30 12:35





Es gibt hier eine Menge Zeug, so dass ich meine Genauigkeit nicht hundertprozentig garantieren kann, aber die ursprüngliche Frage scheint nach dem zu suchen, was bekannt ist "Senden an sich selbst" -Technik. Die verlinkte Suche zeigt, was ich denke am besten gepflegter Kernel-Patch als Toplink + Diskussionen und Patches mit anderen Ansätzen auf verschiedenen Mailinglisten, insb. LKML.

Ich denke, man sollte auch schauen Netzwerk-Namespaces, fertig mit iproute2's "IP-Netzwerke". Dies erfordert auch zusätzliche Schnittstellen- und Routing-Magie, ist also vielleicht nicht weniger komplex als die massiven iptables hoopla in den anderen Antworten.

Kommentare sind auf jeden Fall willkommen, wenn jemand etwas Nützliches dabei gefunden hat - das Wie, das Was, das Wo über Ihre Implementierung.


0
2017-12-28 15:29