Beantworten auf derselben Schnittstelle, von der die Anfrage stammt

7

Erstens weiß ich, dass IP nicht so beabsichtigt ist. Aber wie immer muss es so funktionieren.

Ich arbeite für eine Sicherheitsfirma. Es gibt mindestens 2 Netzwerkschnittstellen. Beide Schnittstellen sollten ein Standard-Gateway haben. Eine Schnittstelle ist eine Standard-Ethernet-Schnittstelle, die zweite ist eine 3g-Schnittstelle. Beide verbinden sich mit dem Internet. Verschiedene Konfigurationen sind möglich, da in einer Schnittstelle die Haupt- und die andere die Sicherung ist. Oder die Ethernet-Schnittstelle ist ein lokales LAN (mit verschiedenen Subnetzen, Gateway) und das 3G-Modem ist die Internetverbindung.

Meine Hauptfrage ist, wie ich den Linux-TCP / IP-Stack dazu bringen kann, auf derselben Schnittstelle zu antworten, von der eine Anfrage kam.

Die zweite Frage: Wie kann ich eine Verbindung über die Schnittstelle meiner Wahl herstellen, ohne mit verschiedenen Subnetzen auf verschiedenen Schnittstellen zu spielen?

Malic
quelle

Antworten:

9

Sie können Routen unter Linux basierend auf der Quell-IP-Adresse festlegen. Während es unter Linux möglich ist, sich an eine bestimmte Schnittstelle zu binden, ist dies sehr ungewöhnlich. Durch Routing basierend auf der Quell-IP können Sie ein Standard-Gateway pro ausgehender Schnittstelle erstellen. Da der Socket für den Server, auf dem sich die Anforderungen befinden, an eine IP gebunden werden kann, wird sichergestellt, dass die Antworten von derselben Schnittstelle gesendet werden, auf der sie eingegangen sind. (Wenn der Server die Platzhalteradresse ( 0.0.0.0) abhört und nicht an eine bestimmte Schnittstelle gebunden ist, können Sie diese Methode nicht verwenden. Es sollte weiterhin möglich sein, das Conntrack-Modul und die iptables-Markierungen zu verwenden, aber ich habe gewonnen. ' Darauf gehe ich hier nicht ein.

Sie können dies erreichen, indem Sie mit dem Befehl eine weitere Routing-Tabelle erstellen ip. Die '10' hier ist willkürlich.

# 10.0.0.1 = gateway for the secondary interface
# 10.0.0.10 = ip address for the secondary interface eth1

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.10 table 10

Wenn Sie an mehrere Adressen gebunden sind oder über DHCP verfügen, können Sie eine Regelbasis für das Subnetz erstellen

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.0/8 table 10

Wenn Sie sicher sind, dass der Server an ein Gerät gebunden ist, reicht ein anderes Standard-Gateway mit einer höheren Metrik aus.

ip route add default via 10.0.0.1 dev eth1 metric 2
JimB
quelle
In diesem Gerät ist es möglich, dass beide eine dynamische IP-Adresse haben. Wenn ich es richtig verstehe, könnte ich es mit den folgenden Funktionen zum Laufen bringen: IP-Route Standard über IP-Eth0-Tabelle hinzufügen 10 IP-Regel hinzufügen OIF-Eth0-Tabelle 10 IP-Route Standard hinzufügen über IP-PPP0-Tabelle 20 IP-Regel hinzufügen OIF-PP0-Tabelle 20
Malic
Es klappt! Aber mit der IP-Adresse nicht mit dem Namen der Schnittstelle
Malic
@Malic - Ja, das Gateway (Standard über ...) muss eine IP-Adresse sein.
JimB
Alles funktioniert mit Ihrem ersten Teil des Beispiels (geben Sie die Quell-IP-Adresse an). Da die IP-Adresse über DHCP abgerufen wird, versuche ich Ihren zweiten Teil des Beispiels über die Schnittstelle. "ip rule add oif eth1 table 10". oif wird nicht akzeptiert, die Verwendung von iif wird gerne akzeptiert. Aber die Funktionalität bricht zusammen, die Pakete werden nicht über die "eth1" -Schnittstelle gesendet. Haben sie eine Idee? Für mich scheint alles richtig zu sein. (IP-Regel hinzufügen iif eth1 Tabelle 10)
Malic
@Malic - oif und iif (ausgehend und eingehend) sind nicht dasselbe, daher verstehe ich nicht, warum Sie denken würden, dass dies funktionieren würde. Was meinst du damit, dass "oif nicht akzeptiert wird"? Bitte überprüfen Sie die ipManpage für eine vollständige Referenz.
JimB
1

Ich bin mir nicht sicher, ob dies in dem von Ihnen gewünschten allgemeinen Sinne möglich ist. Sie können sicher steuern, welche Netzwerkschnittstelle ein auf Ihrem Computer ausgeführtes Programm verwendet, indem Sie es an eine bestimmte Adresse binden.

Im Allgemeinen glaube ich jedoch nicht, dass es eine Möglichkeit gibt, eingehende Netzwerkpakete mit ausgehenden Paketen zu verbinden. Das Beste, was Sie tun können, ist, dem System Anweisungen zu geben, die lauten: "Wenn Sie versuchen, eine Verbindung zu diesem Netzwerk herzustellen, verwenden Sie immer diese Schnittstelle." Dies kann auf verschiedene Arten über die Systemrouting-Tabelle ( iproute) oder mit iptablesFirewall-Regeln erfolgen.

Wenn dies aus Sicherheitsgründen geschieht, haben Sie darüber nachgedacht, virtuelle Maschinen zu verwenden, die auf Ihrem physischen Server ausgeführt werden? Sie können eine VM so konfigurieren, dass nur auf eine Schnittstelle zugegriffen wird, und eine andere VM nur auf die andere. Da die VM die andere Schnittstelle überhaupt nicht sehen kann, kann sie niemals auf Pakete aus dem falschen Netzwerk reagieren.

Sie sollten sich wahrscheinlich auch diese Serverfehlerfrage ansehen, in der beschrieben wird, wie Sie steuern können, auf welchen Schnittstellen-Arp-Anforderungen ausgeführt werden. Sie sollten sich auch den rp_filter sysctl ansehen, der so eingestellt werden kann, dass Pakete ignoriert werden, die auf der falschen Schnittstelle angezeigt werden.

Phil Hollenback
quelle