it-swarm.com.de

Auf derselben Schnittstelle wie eingehend antworten?

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 die Antwort über die Standardroutenschnittstelle zurückgesendet wird, wenn ein Paket auf der Nicht-Standardroutenschnittstelle eingeht. 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 stammt, zurückzusenden?

54
Shawn J. Goff
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

Für das oben Gesagte ist keine Paketmarkierung mit ipfilter erforderlich. Dies funktioniert, weil die ausgehenden (Antwort-) Pakete die IP-Adresse haben, die ursprünglich für die Verbindung mit der 2. Schnittstelle als Quelladresse (von) des ausgehenden Pakets verwendet wurde.

64
Peter

Die folgenden Befehle erstellen eine alternative Routing-Tabelle über eth1 für Pakete mit der Markierung 1 (außer Pakete an localhost). Der Befehl ip stammt aus der Suite iproute2 (Ubuntu: iprouteiproute installieren http://bit.ly/software-small =, iproute-docInstallieren Sie 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 Jobs besteht darin, Pakete zu erkennen, die die Note 1 erhalten müssen. dann benutze iptables -t mangle -A OUTPUT … -j MARK --set-mark 1 für diese Pakete, damit sie durch die Routing-Tabelle 1 geleitet werden. Ich denke, das sollte dies tun (ersetzen Sie 1.2.3.4 durch die Adresse der Nicht-Standard-Routen-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. Möglicherweise wird für die eingehenden Pakete eine andere Regel benötigt, um das Conntrack-Modul anzuweisen, sie zu verfolgen.

Ich hatte Probleme mit den lokal generierten Paketen mit der von Peter vorgeschlagenen Lösung. Ich habe festgestellt, dass Folgendes Folgendes 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 4. Zeile oben können Syntaxprobleme auftreten. In solchen Fällen kann die Syntax für den 4. Befehl jetzt folgende sein:

ip rule add iif <interface> table isp2 priority 1000
5

Ich gehe davon aus, dass Sie Linux verwenden und außerdem eine RedHat/CentOS-basierte Distribution verwenden. Andere Unix-Versionen 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 allgemeine Standard-Gateway
  • eno1 ist isp1 und hat die IP/Range 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. Jetzt werden diese Pakete von der richtigen IP über die richtige Schnittstelle gesendet.


Unter der Annahme, dass das oben Gesagte funktioniert hat, können Sie jetzt die Regel- und Routenänderungen dauerhaft machen. Dies hängt davon ab, welche Unix-Version 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 dies nicht funktioniert hat, müssen Sie in späteren Versionen von RH/CentOS auch eine von zwei Optionen wählen:

  • Verwenden Sie nicht die Standardeinstellung NetworkManager.service; Verwenden Sie stattdessen network.service. Ich habe die genauen Schritte dafür nicht untersucht. Ich würde mir vorstellen, dass es sich um die Standardbefehle chkconfig oder systemctl handelt, um Dienste zu aktivieren/deaktivieren.
  • Installieren Sie das Paket NetworkManager-Dispatcher-Routing-Regeln

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

$ yum install NetworkManager-dispatcher-routing-rules

Eine weitere starke Empfehlung ist die Aktivierung der Arp-Filterung, da dies andere verwandte Probleme bei Konfigurationen mit zwei Netzwerken verhindert. 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
3
zaTricky