Antworte auf die gleiche Schnittstelle wie eingehend?

51

Ich habe ein System mit zwei Schnittstellen. Beide Schnittstellen sind mit dem Internet verbunden. Eine davon ist als Standardroute festgelegt. Ein Nebeneffekt davon ist, dass, wenn ein Paket auf der Nicht-Standardroutenschnittstelle eingeht, die Antwort über die Standardroutenschnittstelle zurückgesendet wird. Gibt es eine Möglichkeit, iptables (oder etwas anderes) zu verwenden, um die Verbindung zu verfolgen und die Antwort über die Schnittstelle, von der sie kam, zurückzusenden?

Shawn J. Goff
quelle

Antworten:

61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Das obige erfordert keine Paketmarkierung mit ipfilter. Dies funktioniert, weil die ausgehenden (Antwort-) Pakete die IP-Adresse haben, die ursprünglich für die Verbindung mit der 2. Schnittstelle als Quelladresse (Absenderadresse) des ausgehenden Pakets verwendet wurde.

Peter
quelle
7
Wow, genau das habe ich gesucht. Falls jemand nach RH-basierten Distributionen sucht, können Sie die relevanten Regel- und Routenbefehle in Dateien mit dem Namen 'rule-eth0' oder 'route-eth0' (zum Beispiel) ablegen, die bei ifup / ifdown hinzugefügt oder entfernt werden. Platzieren Sie diese Dateien neben der Datei ifcfg-eth0. Für IPv6 ist die Funktion 'route6-eth0' integriert, aber (noch) keine 'rule6-eth0'.
Kyle Brantley
18
Bei mir hat es nur devgeklappt, wenn ich den Parameter im ip ruleBefehl weggelassen habe , also läuftip rule add from <interface_IP> table isp2
cdauth
2
Sie können diese erstellen, wenn die Schnittstelle hochgefahren wird, indem Sie up ip rule add from <interface_IP> table isp2und up ip route add default via <gateway_IP> dev ppp0 table isp2zu Ihrer / etc / network / interfaces unter der entsprechenden Schnittstelle hinzufügen .
G. Rocket
4
Ich hatte entfernen dev <interface>aus ip rulees auf meinem Kasten zu bekommen. Wenn ich das richtig verstehe, dev <interface>wurden Pakete herausgefiltert, die irgendwie auf der falschen Schnittstelle eingestellt waren, und die über die überschriebene Route auf die richtige Schnittstelle zurückgeschrieben werden mussten, aber die Regelfilterung nach Schnittstelle verhinderte dies.
binki
2
Wie die meisten anderen musste ich mich dev <interface>aus dem ip ruleBefehl entfernen, damit dies funktionierte. Bitte aktualisieren Sie die Antwort! Abgesehen von diesem Detail wirkte es wie ein Zauber. Vielen Dank, @Peter!
MoonSweep
6

Mit den folgenden Befehlen wird eine alternative Routingtabelle eth1für Pakete erstellt, die die Markierung 1 aufweisen (mit Ausnahme von Paketen an localhost). Der ipBefehl stammt aus der iproute2- Suite (Ubuntu: iproute Install iproute http://bit.ly/software-small , iproute-doc Install iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

Die andere Hälfte des Auftrags besteht darin, Pakete zu erkennen, die die Markierung 1 erhalten müssen. Verwenden Sie dann iptables -t mangle -A OUTPUT … -j MARK --set-mark 1auf diesen Paketen, um sie durch Routing-Tabelle 1 weiterleiten zu lassen. Ich denke, das Folgende sollte es tun (ersetzen Sie 1.2.3.4 durch die Adresse der Nicht-Standard-Route-Schnittstelle):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Ich bin mir nicht sicher, ob das ausreicht. Vielleicht ist eine andere Regel für die eingehenden Pakete erforderlich, um das conntrack-Modul anzuweisen, sie zu verfolgen.

Gilles 'SO - hör auf böse zu sein'
quelle
Nett. Ich habe alles über das Markieren vergessen. Das sollte mich dahin bringen.
Shawn J. Goff
5

Ich hatte Probleme mit den lokal generierten Paketen mit der von Peter vorgeschlagenen Lösung. Ich habe festgestellt, dass Folgendes dies korrigiert:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

HINWEIS: In der vierten Zeile oben können Syntaxprobleme auftreten. In solchen Fällen könnte die Syntax für den 4. Befehl jetzt so lauten:

ip rule add iif <interface> table isp2 priority 1000
Héctor Sánchez
quelle
Versuchte so viel, aber nichts funktionierte in meinem Szenario, außer das .. vielen Dank.
Agaggi
3

Ich gehe davon aus, dass Sie Linux verwenden und weiterhin eine RedHat / CentOS-basierte Distribution verwenden. Andere Unixe und Distributionen erfordern ähnliche Schritte - die Details sind jedoch unterschiedlich.


Beginnen Sie mit dem Testen (beachten Sie, dass dies der Antwort von @ Peter sehr ähnlich ist. Ich gehe von Folgendem aus:

  • eno0 ist isp0 und hat das Standardgateway
  • eno1 ist isp1 und hat den IP / Bereich 192.168.1.2/24 mit Gateway 192.168.1.1

Die Befehle lauten wie folgt:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Die Firewall ist in keiner Weise beteiligt. Antwortpakete wurden immer von der richtigen IP gesendet - aber zuvor wurden sie über die falsche Schnittstelle gesendet. Nun werden diese Pakete von der richtigen IP über die richtige Schnittstelle gesendet.


Unter der Annahme, dass das oben Gesagte funktioniert hat, können Sie die Regel- und Routenänderungen nun dauerhaft festlegen. Dies hängt davon ab, welche Version von Unix Sie verwenden. Nach wie vor gehe ich von einer RH / CentOS-basierten Linux-Distribution aus.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Testen Sie, ob die Netzwerkänderung dauerhaft ist:

$ ifdown eno1 ; ifup eno1

Wenn das nicht funktioniert hat, müssen Sie in späteren Versionen von RH / CentOS auch eine von zwei Optionen wählen:

  • Verwenden Sie nicht den Standard- NetworkManager.service . Verwenden Sie stattdessen network.service . Die genauen Schritte dazu habe ich nicht erforscht. Ich würde mir vorstellen, dass es sich um die Standardbefehle chkconfig oder systemctl handelt , um Dienste zu aktivieren / deaktivieren.
  • Installieren Sie das NetworkManager-Dispatcher-Routing-Rules-Paket

Persönlich bevorzuge ich die Installation des Regelpakets, da dies der einfachere, besser unterstützte Ansatz ist:

$ yum install NetworkManager-dispatcher-routing-rules

Eine weitere wichtige Empfehlung ist die Aktivierung der Arp-Filterung, da hierdurch andere verwandte Probleme mit dualen Netzwerkkonfigurationen vermieden werden. Fügen Sie mit RH / CentOS den folgenden Inhalt zur Datei /etc/sysctl.conf hinzu:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
zaTricky
quelle