Routing mit iproute2 nach NAT

Routing mit iproute2 nach NAT

In einem Linux-System, das als Gateway in meinem LAN fungiert, habe ich versucht, den Verkehr mit iproute2 zu routen. Darüber hinaus ist es vor dem Routing notwendig, das NAT durchzuführen, da die Linux-Maschine mit einem Gerät verbunden ist, das eine Internetverbindung zulässt, und es über 2 IP-Adressen verfügt 172.16.61.1und172.16.62.100

Ich habe 2 Netzwerkkarten mit folgender Konfiguration:

DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.1.150
USERCTL=no
IPV6INIT=no
PEERDNS=yes  

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=172.16.61.1

und ich benutze die folgende Anleitung für die IP-Übersetzung über iptables

/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2  

Mit der oben genannten Konfiguration können alle Computer im Netzwerk 192.168.1.0/24, die 192.168.1.150 als Gateway haben, eine Verbindung zum Internet herstellen.

Wenn ich versuche, iproute2 zum Konfigurieren des Gateways zu verwenden, entferne ich das Standard-Gateway von eth4, was die folgende Konfiguration voraussetzt:

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes

UND ich habe die folgenden Schritte ausgeführt:

1. In /etc/iproute2/rt_tables I have added the line1 Route61
2. /sbin/ip route add 172.16.61.0/24 via 172.16.61.1 table route61 proto static
3. /sbin/ip route add default via 172.16.61.1 table route61 proto static
4. /sbin/ip rule add from 172.16.61.0/24 pref 15000 table route61

Die Ausgabe von /sbin/ip route show table route61ist

172.16.61.0/24 via 172.16.61.1 dev eth4  proto static  
default via 172.16.61.1 dev eth4  proto static   

Die Ausgabe von /sbin/ip rule showist

0:      from all lookup local 
15000:  from 172.16.61.0/24 lookup route61 
32766:  from all lookup main 
32767:  from all lookup default

aber in diesem Fall funktioniert es nicht, was mache ich falsch?

Ich habe auch versucht, /etc/sysconfig/network-scripts/ifup-routes eth4ohne Erfolg

Ich muss verstehen, warum ich das „tabellenbasierte Routing“ nicht zum Laufen bekomme, da ich es in einem Kontext mit mehreren Gateways verwenden muss.

Aktualisieren

Um zu versuchen, was von dirkt vorgeschlagen wird, habe ich das Standard-Gateway entfernt

route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4

und ich habe verwendet:

ip rule add from 192.168.1.0/24 pref 15000 table route61

was passiert ist

  1. Der PC, der 192.168.1.150 als GW verwendet, also der PC, um den es in diesem Beitrag geht, kann eine Verbindung zum Internet herstellen
  2. Ich kann keine Verbindung mehr zu GW herstellen, es sei denn, ich entferne die Anweisungip rule add from 192.168.1.0/24 pref 15000 table route61

Sollten die von 192.168.1.0/24 kommenden Pakete beim Postrouting nicht 172.16.61.2 als Quelladresse annehmen?

route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4Wenn ich das Standard-GW mit OR verwende oder entferne route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4und Folgendes tue:

ip route get 216.58.205.78 from 192.168.1.5

Ich habeRTNETLINK answers: Invalid argument

wenn ich benutze, ip route get 216.58.205.78 from 172.16.61.2habe ich216.58.205.78 from 172.16.61.2 via 172.16.61.1 dev eth4

Wenn route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4ich das tue,

nc -v 216.58.205.78 443

Ich habe

Connection to 216.58.205.78 443 port [tcp/https] succeeded!

Wenn ich das Standard-GW entferne, route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4stellt NC nur dann eine Verbindung her, wenn ich die Quell-IP angebe:

nc -v 216.58.205.78 443 -s 172.16.61.2

Antwort1

Wenn ich Sie richtig verstehe, haben Sie 192.168.1.0/24auf eth3, und Sie möchten das per NAT zu etwas dahinter routen eth4, wobei nicht angegeben ist, was genau sich dahinter befindet eth4, ob es DHCP verwendet und ob es statische Adressen benötigt oder nicht.

(Im Normalfall haben Sie eine Art Router dahinter eth4, der DHCP ausführt und Adressen vergibt).

Der übliche Weg, dies zu erreichen, besteht zunächst darin, die Weiterleitung zu aktivieren und

iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

wo $EXTIFist Ihre externe Schnittstelle ( eth4). Die MASQUERADEist SNATmit der Adresse, die gerade auf ist eth4, also ist dies widerstandsfähig gegen Adressneuzuweisung. Und wenn Sie keine Protokolle erwähnen, wird einfach alles per NAT verarbeitet, was normalerweise das ist, was Sie wollen.

Zweitens gibt es keinen Grund, tabellenbasiertes Routing zu verwenden (es sei denn, es gibt zusätzliche Details, die Sie nicht erklärt haben). Vergessen Sie also die Tabellen, und wenn kein DHCP dahinter steckt, eth4das die Gateway-Informationen für die Standardroute verteilen würde, tun Sie einfach

ip route default via 172.16.61.1

Vorausgesetzt, Sie eth4haben bereits eine Adresse in 172.16.61.*/24, ist dies ausreichend (die 172.16.61.0/24Route wird festgelegt, wenn Sie die IP-Adresse festlegen).

Am besten ist es jedoch, dies einfach DHCP zu überlassen, sofern es auf Ihrem Router aktiviert ist (ich denke, das wäre der Fall BOOTPROTO=dhcp, wenn es sich um Red Hat handelt).


Wenn das Problem das Richtlinienrouting ist: Sie möchten ausgehende Pakete, die 192.168.1.0/24über eine Standardroute in Tabelle eingehen route61, routen, also müssen Sie Folgendes tun:

ip rule add from 192.168.1.0/24 pref 15000 table route61

und nicht from 172.16.61.0/24.

Allerdings bin ich mir nicht sicher, wie NAT mit Policy Routing interagiert. Ich würdeannehmenFür die zurückkommenden Pakete wird zuerst das NAT-Verfahren durchgeführt und anschließend werden sie durch die Regeln in der Haupttabelle richtig weitergeleitet, aber das habe ich selbst nie ausprobiert.

Zum Debuggen ip route get X.X.X.X from Y.Y.Y.Ykann es hilfreich sein, da dies tcpdumpauf beiden Schnittstellen der Fall sein wird, wie Sie es bereits in der anderen von Ihnen erwähnten Frage getan haben.

Es ist auch einfacher, dies zunächst ohne Tabellen zu versuchen. Sobald das funktioniert, wissen Sie, dass nichts mehr im Weg steht, und Sie können es mit Tabellen versuchen.

Antwort2

Mithilfe einer neuen Routing-Tabelle müssen Sie auch verbundene Routen hinzufügen: Stattdessen 172.16.61.0/24 via 172.16.61.1 dev eth4 proto staticsollte proto scope linkdie Quell-IP angegeben werden, und Ihnen fehlt die Route 192.168.1.0/24. Die Routing-Entscheidung wird vor der Ausgabe/nach dem NAT-Routing getroffen, daher ip rule add fromsollte die ursprüngliche Quell-IP verwendet werden. Bild

# Configure tables
echo '2 table61' >> /etc/iproute2/rt_tables 
echo '3 table62' >> /etc/iproute2/rt_tables 

# routing decision is performed before output / post routing nat
ip rule add from 192.168.1.5 lookup table62
ip rule add from 192.168.1.0/24 lookup table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table61
ip route add 172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2 table table61
ip route add default via 172.16.61.1 table table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table62
ip route add 172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100 table table62
ip route add default via 172.16.62.254 table table62

Außerdem habe ich Ihre Fragen möglicherweise im Kopf verwechselt. Wenn es nicht sofort klappt, könnten Sie Ihrer Frage bitte Folgendes hinzufügen?

ip a
ip r show table table61
ip r show table table62
ip rule show
iptables -L -n -v
iptables -t nat -L -n -v

verwandte Informationen