Wie bestimmt das Betriebssystem beim IP-Aliasing, welche IP-Adresse als Quelle für ausgehende TCP / IP-Verbindungen verwendet wird?

15

Ich habe einen Server mit Ubuntu Server mit vier IP-Adressen auf einer einzigen Netzwerkkarte.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(Nehmen wir beispielsweise an, dass 192.168.xx für eine Reihe von öffentlichen IP-Adressen verwendet wird.)

Einer unserer Kunden veröffentlicht sein Inventar über FTP, daher melden wir uns jede Nacht an, um eine große Datei von ihrem Server herunterzuladen. Ihre Firewall erwartet, dass unsere (passive) FTP-Verbindung von 192.168.1.100 hergestellt wird.

Angenommen, mein Server verfügt logischerweise über vier IP-Adressen auf einem einzelnen Adapter. Wie ermittelt das Betriebssystem, welche IP-Adresse als Quelle für ausgehende TCP / IP-Verbindungen verwendet wird?

Angenommen, ich stelle unter 192.168.1.101 eine SSH-Verbindung zu meinem Server her und führe FTP interaktiv aus. Wird die ausgehende TCP / IP-Verbindung 192.168.1.101 verwenden, da das Betriebssystem weiß, dass dies die Schnittstelle ist, über die meine Shell verbunden ist?

Was ist, wenn die FTP-Task nicht interaktiv über einen Cron-Job ohne Shell ausgeführt wird?

Wie Sie wahrscheinlich feststellen können, hat mich das ziemlich verwirrt, und ich hoffe, dass meine Fragen zumindest einen Sinn ergeben haben.

Bearbeiten

Um zu verdeutlichen, warum ich frage, habe ich keine Änderungen an der Routing-Tabelle vorgenommen und es wird tatsächlich "eth0" als IFace für die 0.0.0.0-Routen aufgeführt. Alle Anzeichen deuten jedoch darauf hin, dass tatsächlich eth0: 0 als Quelle verwendet wird.

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

Ich kann an der Routing-Tabelle herumspielen oder unseren Client dazu bringen, die Firewall-Regeln zu ändern, um das gewünschte Verhalten zu erreichen. Ich versuche jedoch, einen kleinen Einblick in die Funktionsweise zu erhalten, um festzustellen, ob ein Fehler im Betriebssystem vorliegt oder nur mein naives Verständnis wie alle Teile zusammenpassen.

Vielen Dank

Joe Holloway
quelle

Antworten:

12

Wenn eine Schnittstelle unter Linux über mehrere Adressen verfügt, die sich in verschiedenen Subnetzen befinden, hat der für die jeweiligen Subnetze bestimmte Datenverkehr standardmäßig die richtige Quell-IP. Das heißt, wenn eth0 zwei Adressen 192.168.1.1/24 und 10.1.1.1/8 hat, hat der Verkehr zu irgendetwas im Subnetz 10.0.0.0 die Quelle 10.1.1.1 und der Verkehr zu irgendetwas im Subnetz 192.168.1.0 die Quelle 192.168.1.1. Sie können in diesem Fall auch Quelladressen explizit zuweisen, indem Sie die Option "src 1.2.3.4" auf "ip route" setzen.

In Ihrem Fall befinden sich jedoch alle Ihre Adressen im selben Subnetz, sodass die "primäre" (wie durch "ip addr list dev eth0" angegeben) als Quell-IP für den Datenverkehr verwendet wird, der auf dieser Schnittstelle austritt. Ich denke, es ist möglich, die Quell-IPs in diesem Fall nur mit "ip route" zu steuern, aber ich habe festgestellt, dass es einfacher ist, iptables zu verwenden, um die Quelladressen für den Verkehr von Interesse umzuschreiben.

Wenn Sie die Verwendung einer bestimmten Quelladresse für bestimmte Ziele erzwingen möchten, können Sie dies mit einer SNAT-Regel tun:

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

Wenn Ihre "primäre" eth0-IP 192.168.100.1 ist, Sie jedoch möchten, dass der Verkehr zu 1.2.3.4 eine Quelle von 192.168.100.2 hat, gehen Sie folgendermaßen vor:

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

Beachten Sie, dass "-s 192.168.100.1" wichtig ist: Es verhindert, dass die Quelladressen des weitergeleiteten Datenverkehrs durch diese Regel neu geschrieben werden.

Wenn Sie komplexe Netzwerkkonfigurationen unter Linux implementieren möchten, lesen Sie die Dokumentation zu Linux Advanced Routing and Traffic Control ( http://lartc.org)

user14017
quelle
Ersetzen Sie in dem Beispiel "-d 1.2.3.4/0" möglicherweise durch "-d 1.2.3.4/332" oder "-d 1.2.3.4"
Christian
5

Ich sehe in Ihrem Beispiel, dass alle IPS zu nah sind, um nicht im selben Netzwerk zu sein

Sind Sie sicher, dass Sie tatsächlich Multihoming betreiben und nicht nur 4 IP-Aliase haben?

Wenn letzteres der Fall ist, können Sie die Quell-IP auf einer Route mit etwas ähnlichem einstellen

/ sbin / ip route show 192.168.222.0/24 dev eth0 protokernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default via 192.168.222.1 dev eth0

sudo / sbin / ip route ersetzen standardmäßig über 192.168.222.1 src 192.168.222.178

/ sbin / ip route show
192.168.222.0/24 dev eth0 protokernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link default via 192.168.222.1 dev eth0 src 192.168.222.178

In man-Interfaces erfahren Sie, wie Sie es zwischen Neustarts dauerhaft machen können

Aleksandar Ivanisevic
quelle
Du hast Recht. Vielleicht missbrauche ich den Begriff Multi-Homing. Unser Rechenzentrum gibt uns vier IP-Adressen, die sich alle im selben Subnetz befinden.
Joe Holloway
Sie wissen, dass Sie Ihre Frage bearbeiten können, oder?
Hayalci
5

Es wird verwendet, was auch immer das Standard-Gateway in der Routing-Tabelle ist, es sei denn, es gibt eine bestimmte Route, die es auffordert, eine andere zu verwenden: route -n

EDIT: Ich habe deine Frage offenbar zu schnell gelesen ...

Da Sie den passiven Modus verwenden und der Client die Verbindung immer initiiert, wird das Feld src ip im IP-Header immer als die IP angezeigt, mit der der Client verbunden ist. Wenn es aktiver Modus war, initiierte der Bediener die Verbindung, ich denke, es würde immer die „primäre“ IP sein. Befinden sich Ihre Adressen im selben Subnetz, erstellt Linux die erste Adresse, die Sie hinzugefügt haben, als 'Primär' und die anderen als sekundär.

Ich bin mir jedoch nicht ganz sicher, ob ich tcpdump -n ausführen und sehen würde, was es als src-IP ansieht.

EDIT2: Okay, ich habe das oben Gesagte unter dem Gesichtspunkt geschrieben, dass Sie den Server ausgeführt haben. Da Sie also der Client sind und die Verbindung initiieren, wird es anscheinend immer von der primären IP-Adresse stammen, aber probieren Sie es erneut aus mit tcpdump.

Kyle Brandt
quelle
Die Routing-Tabelle ist nur die Standardeinstellung und es gibt nur ein Subnetz. Ein anderes Plakat wies darauf hin, dass ich den Begriff Multihoming missbraucht habe. Ich würde jedoch immer noch davon ausgehen, dass der Alias ​​eth0 verwendet wird. Ich habe wget verwendet, um whatsmyip.net herunterzuladen, und es zeigt mir, dass ich stattdessen irgendwie eth0: 0 verwende.
Joe Holloway
Das macht für mich keinen Sinn, whatsmyip.net sollte deine öffentliche IP zeigen ...
Kyle Brandt
Um es klarer zu machen, zeigt es die öffentliche IP-Adresse, die der privaten IP mit eth0: 0 zugeordnet ist, während ich erwarten würde, dass sie die öffentliche IP-Adresse zeigt, die der privaten IP mit eth0 zugeordnet ist
Joe Holloway
1
Diese Antwort hier ist zu hoch bewertet und enthält zu viele Änderungen und verwirrt viele Dinge und hilft nicht. Die Antworten von tbman und jknapka sind hervorragend und haben mir sehr geholfen.
Christian
4

Sofern Ihr FTP-Auftrag nicht die Möglichkeit bietet, die für Verbindungen zu verwendende Schnittstelle anzugeben, wird meines Erachtens standardmäßig die erste physische Schnittstelle im relevanten Subnetz verwendet (in diesem Fall eth0). Wenn Sie einen Server mit zwei Netzwerkkarten in verschiedenen Subnetzen haben, wird anhand der Routingtabelle ermittelt, welche Schnittstelle verwendet werden soll.

Da es auf dem System nur eine einzige physische Schnittstelle (eth0) und vier virtuelle / Aliase (eth0: 0 bis eth0: 2) im selben Subnetz gibt, verwendet der ausgehende Datenverkehr die eth0-IP-Adresse als Quelle, sofern die Anwendung nicht intelligent genug ist eine ausgehende Schnittstelle zu deklarieren.

sysadmin1138
quelle
2
Dies war meine Annahme, aber alle meine Tests deuten darauf hin, dass eth0: 0 als Quelle verwendet wird.
Joe Holloway
Dann ist die Standardroute möglicherweise für die Verwendung der Schnittstelle eth0: 0 konfiguriert. Ich habe eine Installation, die eine Ethernet-Brücke verwendet, und es wurde konfiguriert, um die virtuelle Brückenschnittstelle für die Standardroute zu verwenden.
sysadmin1138
Ich habe ein einfaches Programm auf einem anderen Computer eingerichtet, um die IP zu drucken, von der die Verbindung hergestellt wurde. Das Verbinden mit nc -s <ip of eth0:2>oder was auch immer immer die Quelladresse anzeigt, ist tatsächlich die IP von eth0: 0, obwohl Netcat dies bind(2)zuvor getan hat connect(2). Es sieht also so aus, als würden Aliase nicht funktionieren, um einem Computer die Möglichkeit zu geben, Verbindungen von mehreren Quelladressen herzustellen.
Peter Cordes
4

Sie können sehen, welches Gerät und welche Quell-IP-Adresse vom Befehl ip route get wie folgt verwendet werden:

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

Ich habe dies nicht in einer voreingenommenen Umgebung versucht, hoffe aber, dass dies hilft.

Tomoe
quelle
1

Wenn Sie eine ausgehende Verbindung herstellen, ermittelt Ihr Server anhand der Routing-Tabelle, welche Ihrer vier Schnittstellen verwendet werden sollen. Ihre TCP-Verbindungen haben eine Quell-IP Ihrer Exit-Schnittstelle.

netstat -rn

Gibt Ihnen die Ausgabe Ihrer Routingtabelle; Suchen Sie nach Einträgen, die mit der Client-IP übereinstimmen, zu der Sie eine Verbindung herstellen möchten. Wenn keine vorhanden ist, verwenden Sie eine Standardroute (0.0.0.0, Maske 0.0.0.0). Wenn Sie mehrere Standardrouten verwenden, wird die Route mit den niedrigsten Kosten verwendet.

Murali Suriar
quelle