Erstellen eines 1:1-NAT mit iptables

Erstellen eines 1:1-NAT mit iptables

Ich versuche, etwas über NAT-Übersetzungen in Linux zu lernen, habe aber noch keinen Proof-of-Concept gesehen, der auf das Wesentliche reduziert wurde.

Wie dem auch sei. Hier ist eine Zeichnung meines Aufbaus:

einfaches Netzwerk mit zwei Subnetzen

Ich habe einen sehr einfachen Router für den Internetanschluss. Er kann im Grunde nur zwei Dinge:

  • Stellen Sie eine Verbindung zum Internet her.
  • Verteilen Sie die IP-Adresse nur an ein Subnetz.

Eskann nichtFühren Sie überhaupt ein statisches Routing durch.

... und es weiß nicht einmal, wie eine IPv6-Adresse aussieht! (Kein Scherz!)

Ich möchte von aus eine Verbindung zum Internet herstellen können , aber auch von hier aus eine Verbindung zum oder zu jedem anderen Gerät im anderen Subnetz Raspberry 3herstellen können .My ComputerRaspberry 3

Das brachte mich auf die Idee, auf meinem ein 1:1-NAT zu implementieren Raspberry 4, bei dem alle IP-Adressen aus dem Bereich 192.168.10.x/24 in den Bereich 192.168.1.x/24 übersetzt werden.

Auf diese Weise scheint es zumindest aus der Sicht meines Routers so, als ob alle Hosts im Netzwerk zum selben Subnetz gehören, da der Adresspool von 192.168.0.0/23 von 192.168.0.0 bis 192.168.1.255 reicht.

Aber wie geht man dabei vor?

Reicht es, einfach zwei Regeln zu iptables auf dem Raspberry 4 hinzuzufügen, wie:

iptables -t nat -A PREROUTING -d 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

Oder muss ich die Richtung der IP-Pakete etwas deutlicher angeben?

Aktualisieren:

Um bei der Fehlerbehebung zu helfen, kann ich mitteilen, dass Raspberry 4 als DHCP-Server für meine beiden Subnetze fungiert.

Es gibt sich selbst als erster Hop aus, wenn ein Traceroute von einer beliebigen Maschine zum Internet durchgeführt wird – in beiden Netzen.

Ein Traceroute von My computerbeispielsweise zu Google ergibt etwa Folgendes:

  • 1: Himbeere 4
  • 2: Primitiver Router
  • 3: ISP-Gateway
  • 4: ...
  • ...
  • n: Google.com

Allerdings schlägt Traceroute fehl, wenn es von meinem aus ausgeführt wird Raspberry 3.

Der erste Sprung wird der sein Raspberry 4, also keine Überraschung, aber die Route wird keine Antwort auf Ping geben, da sie nicht weiß, wie sie das Subnetz 192.168.10.0/24 erreichen kann.

Zu Ihrer Information: Mein Server Raspberry 4fungiert bereits als Site-2-Site-VPN-Client. Wenn also alles andere fehlschlägt, kann ich einfach ein quellenbasiertes Routing durchführen und den gesamten Datenverkehr über meine VPN-Verbindung senden, allerdings mit einer erheblichen Geschwindigkeitseinbuße (Geschwindigkeitsabfall von etwa 70 %).

Aktualisierung 2:

Ausgabe vom Raspberry 4:

# ip rule show

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route show table main

default via 192.168.0.1 dev eth0 src 192.168.0.136 metric 202
192.168.0.0/23 dev eth0 proto dhcp scope link src 192.168.0.136 metric 202
192.168.100.0/24 dev tun-ipv6 proto kernel scope link src 192.168.100.10
  • Der Router befindet sich unter 192.168.0.1.
  • Das Subnetz 192.168.100.0/24 befindet sich innerhalb meines VPN.

Dieser Teil funktioniert einwandfrei, da ich nicht beabsichtige, den gesamten Datenverkehr über mein VPN zu senden.

Für mich ist es ein Kinderspiel, eine neue Routing-Tabelle zu erstellen, um von 192.168.10.0/24 über VPN umzuleiten, da ich diesen speziellen Trick bereits einmal zuvor gemacht habe, um IPv6 in meinem lokalen LAN zu verwenden. :-)

Allerdings sieht Tom Yans Lösung ziemlich nach dem aus, was ich erreichen wollte, insbesondere sein Hinweis zu „AnyIP“. :-)

Ich muss noch ein bisschen herumexperimentieren, aber ich werde seine Antwort akzeptieren. :-)

Antwort1

Zunächst sollte das Quell-NAT sein:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24

( POSTROUTINGmit einem -sStreichholz)

und das Ziel-NAT sollte sein:

iptables -t nat -A PREROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

( PREROUTINGmit einem -dStreichholz)

Hinweis: Soweit ich weiß, wird die Ziel-NAT-Regel nur für „NEUEN“ Datenverkehr (innerhalb des LANs) benötigt. Die Quell-NAT-Regel reicht für den Rückverkehr aus, da sie das Ziel-NAT für alle diese Daten „impliziert“.

Doch dann stellt sich das Problem: Wie will My Computerund Primitive Routerweiß man, an welche Adresse der Verkehr 192.168.1.0/24(welche „eigentlich“ 192.168.10.0/24) für die weitere Weiterleitung gehen soll Raspberry Pi 4?

Die Antwort lautet: Sie müssen Raspberry Pi 4auf ARP-Anfragen antworten 192.168.1.0/24.

Eine Möglichkeit, dies zu erreichen, besteht darin, etwas namens „AnyIP“ einzurichten (zumindest ist das der Begriff, den ich gehört habe). Im Wesentlichen bedeutet das, eine Subnetzroute vom Typ localfür hinzuzufügen 192.168.1.0/24:

ip r add local 192.168.1.0/24 dev eth0

Hinweis: Ich weiß nicht mehr genau, ob dies mit der arp_ignoreauf „eg“ eingestellten Sysctl-Einstellung funktionieren würde 1.

Stellen Sie sicher, dass Sie die IP(v4)-Weiterleitung mit sysctl aktiviert haben und dass keine Firewall Raspberry Pi 4die Weiterleitung des von Ihnen gewünschten Datenverkehrs blockiert (gemäß einer Regel oder der Kettenrichtlinie).

Antwort2

Ich versuche, etwas über NAT-Übersetzungen in Linux zu lernen, habe aber noch keinen Proof-of-Concept gesehen, der auf das Wesentliche reduziert wurde.

Hier ist mein möglichst einfaches Skript, das ich auf meinem Desktop-PC verwende, um das Internet zu „teilen“, wenn ich ein anderes Gerät über LAN daran anschließe:

#!/bin/bash

# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)

INTIF="$1"
EXTIF=${2:-wlan0}

echo $INTIF $EXTIF

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

Sie müssen es über die „interne“ Schnittstelle (das Netzwerk mit Clients, die NAT benötigen) und die „externe“ Schnittstelle (zum Internet) aufrufen. Die Einrichtung der internen Schnittstelle und von DHCP usw. ist nicht enthalten (Sie haben nur nach NAT gefragt).

Das brachte mich auf die Idee, auf meinem Raspberry 4 ein 1:1-NAT zu implementieren, bei dem alle IP-Adressen aus dem Bereich 192.168.10.x/24 in den Bereich 192.168.1.x/24 übersetzt werden.

Das ist viel schwieriger als „einfaches NAT“.

Aber das müssen Sie nicht tun, und tatsächlich würde es mit Ihrer primitiven Router-/Raspberry Pi 4-Kombination nicht gut funktionieren. Führen Sie stattdessen einfach ein einfaches NAT auf dem Raspberry Pi 4 durch. Das bedeutet, dass alles auf 192.168.10.*/24 per NAT auf 192.168.0.0 umgestellt wird, und der Router wird das problemlos verstehen.

(Und im wirklichen Leben würden Sie einfach die beiden Switches verbinden und ein einzelnes Subnetz von Ihrem Router bereitstellen lassen. Übrigens, wenn Ihr einfacher Router mit OpenWRT usw. neu geflasht werden kann, wird er auch in der Lage sein, also Routing durchzuführen.)

Antwort3

Nein, das Hinzufügen der NAT-Regeln reicht nicht aus. Denn die Erkennung von IPv4-Hosts im lokalen Netzwerk (Broadcast-Segment) funktioniert über ARP. Der Broadcast-Verkehr von ARP würde Ihre innere NAT-Box nicht passieren und die NAT-Box würde auch nicht antworten. Damit sie antwortet, müssen Sie proxy_arp

Es ist jedoch unklar, was diese Art der Einrichtung bewirken würde. Legen Sie einfach alles in ein Netzwerk oder fügen Sie Routen zu PCs hinzu (anstelle des Routers) und MASQUERADE nur zum äußeren Router.

verwandte Informationen