
Ich habe zwei Netzwerke, aufeinanderfolgende Netzwerke, beide versteckt unter eigenem NAT 192.168.31.0/24
-> 192.168.33.0/24
-> Internet
Ich habe einen TCP-Server eingeschaltet 192.168.33.35
und einen Client192.168.31.32
Ein Client sendet eine TCP-Anfrage an einen Server im Internet 66.66.66.66
, beispielsweise unter . Ich möchte stattdessen das letzte Gateway, 192.168.33.1
an das die Anfrage gesendet wird, 192.168.33.35
und den Client austricksen.
Das Machbarste, was ich versucht habe, ist:
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
Der Server hat das Syn-Paket empfangen und geantwortet. Aber die Quell-IP der Serverantwort scheint 192.168.33.35
nach dem Passieren des Gateways bestehen zu bleiben. Und das vom 192.168.31.1
Gateway empfangene Paket geht verloren.
Es sieht so aus, als ob der SNAT-Teil nicht funktioniert.
Was kann ich tun, um den Server mit Standard-OpenWrt-Tools zu emulieren/vorzutäuschen?
Antwort1
Das ist, was passiert:
- Ihr
192.168.33.35
Server sieht das SYN-Paket von192.168.33.Z
(er kennt das192.168.31.0/24
Netzwerk nicht und sieht die „WAN“-Adresse des192.168.31.1
Gateways, ich weiß nicht, was dasZ
ist) und antwortet an diese Adresse. - Laut der Routing-Tabelle gehört diese Adresse zum lokalen Netzwerk, sodass die Antwort an die MAC-Adresse von gerichtet ist
192.168.33.Z
. - Auch wenn die Antwort physisch durch die
192.168.33.1
Maschine läuft, wird sie vom Gateway nicht beschädigt, da sie an die MAC-Adresse einer anderen Maschine gerichtet ist. 192.168.33.Z
sieht die Antwort von192.168.33.35
. Es erwartet eine von66.66.66.66
und weiß nicht, was es tun soll.
Beachten Sie, dass es keine Rolle spielt, ob 192.168.33.Z
NAT ausgeführt wird ( 192.168.31.1
auf der LAN-Seite). Der Mechanismus des Versagens ist sehr ähnlich dem, bei demNAT-Loopback (Hairpin-NAT) ist nur teilweise eingerichtet.
Sie müssen Ihren 192.168.33.35
Server veranlassen, Antworten an die MAC-Adresse Ihres 192.168.33.1
Gateways zu senden.
Legen Sie entweder eine Routing-Regel für
192.168.33.Z
(denken Sie daran: Ich weiß es nichtZ
, Sie wissen es; ersetzen Sie die tatsächliche Nummer) oder sogar für das gesamte192.168.33.0/24
Netzwerk fest:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
192.168.33.35
Beachten Sie, dass dies die gesamte Kommunikation von nach beeinflusst192.168.33.Z
. In Fällen, in denen es192.168.33.35
so sein sollte,192.168.33.35
werden Pakete unnötigerweise weitergeleitet; es sollte jedoch nichts kaputt machen.Oder lassen Sie das
192.168.33.1
Gateway nicht nur DNAT, sondern auch SNAT ausführen. Diese Lösung ist im Grunde dieselbe wie die für NAT-Loopback in der bereits verlinkten Antwort:# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
Dieses Fragment trifft auf Ihre Situation zu:
Beachten Sie, dass die NAT-Tabelle
iptables
nur für das erste Paket einer Verbindung verwendet wird. Spätere Pakete im Zusammenhang mit der Verbindung werden mithilfe der internen Zuordnungstabellen verarbeitet, die bei der Übersetzung des ersten Pakets erstellt wurden.
Das bedeutet, dass die zweite Zeile ( iptables … -j SNAT --to-source 66.66.66.66
) irrelevant ist, wenn Sie eine Verbindung von einem Client aus initiieren. Spätere Pakete werden ordnungsgemäß SNAT- und DNAT-getestet, da dies beim ersten Paket der Fall war.
Ich denke, wenn Ihre erste Zeile
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
Wenn Sie auf das Gateway eingewirkt haben , würde es ohne zusätzliche Tricks 192.168.31.1
das gewünschte Ergebnis für die anderen Clients erzielen .192.168.31.0/24
Diese zweite Zeile von dir
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
gilt, wenn Sie eine Verbindung herstellenaus 192.168.33.35
. Internet-Server tun dies selten, daher benötigen Sie diese Regel möglicherweise gar nicht. Falls Sie sie benötigen, beachten Sie Folgendes:
- die Regel funktioniert nur, wenn die Pakete durch das
192.168.33.1
Gateway geleitet werden, auf das diese Regel wirkt. Um Ihre lokalen Computer zu erreichen und ihnen die Pakete zu präsentieren,66.66.66.66
müssen Sie daher die Routing-Tabelle auf dem192.168.33.35
Computer ähnlich wie oben beschrieben anpassen. - Sie können
66.66.66.66
mit externen Hosts (außerhalb Ihres Netzwerks) nicht als kommunizieren, denn selbst wenn es Ihnen gelänge, sie als zu erreichen66.66.66.66
, würde ihre Antwort den echten erreichen66.66.66.66
und nicht Sie.
Antwort2
Habe es mit Routing gemacht. Leider ist es weniger flexibel, um auf den echten Server zuzugreifen, aber immerhin funktioniert es. So etwas wie das hier:
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
und auf dem Server:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up