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.1
und172.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 line
1 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 route61
ist
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 show
ist
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 eth4
ohne 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
- 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
- Ich kann keine Verbindung mehr zu GW herstellen, es sei denn, ich entferne die Anweisung
ip 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 eth4
Wenn 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 eth4
und 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.2
habe 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 eth4
ich 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 eth4
stellt 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/24
auf 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 $EXTIF
ist Ihre externe Schnittstelle ( eth4
). Die MASQUERADE
ist SNAT
mit 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, eth4
das die Gateway-Informationen für die Standardroute verteilen würde, tun Sie einfach
ip route default via 172.16.61.1
Vorausgesetzt, Sie eth4
haben bereits eine Adresse in 172.16.61.*/24
, ist dies ausreichend (die 172.16.61.0/24
Route 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.Y
kann es hilfreich sein, da dies tcpdump
auf 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 static
sollte proto scope link
die 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 from
sollte die ursprüngliche Quell-IP verwendet werden.
# 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