Ich habe einen kniffligen Fall:
+---+ +----+
|D1 +->eth0---------<-eth0-+D2 |
| | | |
| +->eth1---------<-eth1-+ |
+---+ +----+
Auf D2 eth0
und eth1
haben IP-Adressen aus demselben Subnetz: eth0
10.1.1.1/24
, eth1
10.1.1.2/24
. Schnittstellen auf D1 haben keine zugewiesenen Adressen und es verhält sich wie ein Switch.
10.1.1.2
Jetzt möchte ich, dass D2 den Datenverkehr über senden kann eth0
, daher muss der Paketpfad wie folgt lauten: D2(eth0)--D1(eth0)--D1(eth1)--D2(eth1).
Wenn ich derzeit 10.1.1.2
von D2 aus pinge, werden Pakete lokal gesendet, d. h. D1 empfängt keine. Was muss ich an D2 ändern, um das gewünschte Verhalten zu erreichen?
Danke.
Antwort1
Was du willst, ist unter Linux nicht möglich. Zumindest nicht innerhalb der Routing-Schicht. Wenn eine Zieladresse zu einer lokalen Schnittstelle gehört, geht das Paket immer durch die Loopback-Schnittstelle, von wo aus es (per RfC) nicht nach außen geroutet werden kann.
Ich dachte, es wäre vielleicht möglich iptables
, DNAT
das Ziel auf eine unbenutzte Adresse im Subnetz zu ändern und ip neigh
die MAC-Adresse statisch auf die der anderen Netzwerkkarte einzustellen, aber nicht einmal die DNAT
Regel trifft auf Pakete an lokale Adressen zu.
Mit einer virtuellen Maschine oder mit Netzwerk-Namespaces ist dies möglicherweise möglich, sodass der Kernel 10.1.1.1
es nicht sieht eth0
. Sie benötigen jedoch Proxy-ARP und DNAT, um die eingehenden Pakete von der physischen zur virtuellen Schnittstelle zu verschieben.
Ist es diesen Aufwand wert?
Antwort2
Netzwerk-Namespaces können eine Option sein. Sie sind im Wesentlichen unabhängige Instanzen des Netzwerkstapels und sollten daher zumindest theoretisch in der Lage sein, zwei Schnittstellen zu trennen.
Als ich das letzte Mal versucht habe, mit ihnen zu spielen, habe ich es allerdings nicht geschafft, dass es richtig funktionierte.