Lors d'un alias IP, comment le système d'exploitation détermine-t-il quelle adresse IP sera utilisée comme source pour les connexions TCP / IP sortantes?

15

J'ai un serveur exécutant Ubuntu Server avec quatre adresses IP aliasées sur une seule carte réseau.

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

(En utilisant 192.168.xx à titre d'exemple, supposez que ceux-ci sont NAT-ed pour une plage d'adresses IP publiques)

Un de nos clients publie leur inventaire via FTP, nous nous connectons donc tous les soirs pour télécharger un fichier volumineux depuis leur serveur. Leur pare-feu attend que notre connexion FTP (passive) soit établie à partir de 192.168.1.100.

Étant donné que mon serveur possède logiquement quatre adresses IP sur une seule carte, comment le système d'exploitation détermine-t-il quelle adresse IP est utilisée comme source pour les connexions TCP / IP sortantes?

Disons que je ssh sur mon serveur sur 192.168.1.101 et que j'exécute FTP de manière interactive. La connexion TCP / IP sortante utilisera-t-elle 192.168.1.101 car le système d'exploitation sait que c'est l'interface sur laquelle mon shell est connecté?

Que faire si la tâche FTP est exécutée de manière non interactive via un travail cron où il n'y a pas de shell?

Comme vous pouvez probablement le constater, cela me rend assez confus, alors j'espère que mes questions ont au moins un sens.

Éditer

Pour clarifier pourquoi je demande - je n'ai apporté aucune modification à la table de routage et elle répertorie en fait «eth0» comme IFace pour les routes 0.0.0.0. Cependant, toutes les indications indiquent qu'il utilise réellement eth0: 0 comme source.

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

Je peux jouer avec la table de routage ou demander à notre client de modifier ses règles de pare-feu pour obtenir le comportement dont j'ai besoin, mais j'essaie de comprendre comment cela fonctionne pour savoir s'il y a un bogue dans le système d'exploitation ou tout simplement ma compréhension naïve de la façon dont toutes les pièces s'assemblent.

Merci

Joe Holloway
la source

Réponses:

12

Par défaut, sous Linux, si une interface a plusieurs adresses qui se trouvent sur différents sous-réseaux, le trafic destiné aux sous-réseaux respectifs aura l'IP source appropriée. Autrement dit, si eth0 a deux adresses 192.168.1.1/24 et 10.1.1.1/8, le trafic vers n'importe quoi sur le sous-réseau 10.0.0.0 aura la source 10.1.1.1 et le trafic vers n'importe quoi sur le sous-réseau 192.168.1.0 aura la source 192.168.1.1. Vous pouvez également attribuer explicitement des adresses source dans ce cas en utilisant l'option "src 1.2.3.4" à "ip route".

Dans votre cas, cependant, toutes vos adresses se trouvent sur le même sous-réseau, donc celle "principale" (comme indiqué par "ip addr list dev eth0") est utilisée comme IP source pour le trafic sortant sur cette interface. Je pense qu'il est possible de contrôler les IP source dans ce cas en utilisant simplement "ip route", mais j'ai trouvé plus facile d'utiliser iptables pour réécrire les adresses source pour le trafic d'intérêt.

Si vous souhaitez forcer l'utilisation d'une adresse source spécifique pour des destinations spécifiques, vous pouvez le faire avec une règle SNAT:

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

Donc, si votre IP eth0 "principale" est 192.168.100.1, mais que vous souhaitez que le trafic vers 1.2.3.4 ait une source de 192.168.100.2, procédez comme suit:

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

Notez que le "-s 192.168.100.1" est important: il empêche les adresses source du trafic transféré d'être réécrites par cette règle.

Si vous prévoyez d'implémenter des configurations réseau complexes sous Linux, vous devriez lire la documentation Linux Advanced Routing and Traffic Control, http://lartc.org

user14017
la source
Dans l'exemple, peut-être remplacer "-d 1.2.3.4/0" par "-d 1.2.3.4/332" ou "-d 1.2.3.4"
Christian
5

Je vois dans votre exemple que toutes les ips sont trop proches pour ne pas être dans le même réseau

êtes-vous sûr que vous êtes en fait multihébergement et que vous n'avez pas simplement 4 alias IP?

si ce dernier est le cas, vous pouvez définir l'IP source sur un itinéraire avec quelque chose de similaire à celui-ci

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

route sudo / sbin / ip remplacer par défaut via 192.168.222.1 src 192.168.222.178

/ sbin / ip route show
192.168.222.0/24 dev eth0 proto kernel 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

voir les interfaces homme sur la façon de le rendre persistant entre les redémarrages

Aleksandar Ivanisevic
la source
Vous avez raison. J'abuse peut-être du terme multi-homing. Notre centre de données nous donne quatre adresses IP sur le même sous-réseau.
Joe Holloway,
vous savez que vous pouvez modifier votre question, non?
hayalci
5

Il utilise ce que la passerelle par défaut est dans la table de routage, sauf s'il existe une route spécifique lui indiquant d'en utiliser une autre: route -n

EDIT: J'ai lu votre question trop rapidement, il semble ...

Étant donné que vous utilisez le mode passif et que le client initiera toujours la connexion, je pense que le champ IP src dans l'en-tête IP apparaîtra toujours comme l'adresse IP à laquelle le client s'est connecté. Si c'était le mode actif, le serveur initiait la connexion, je pense que ce serait toujours l'adresse IP «principale». Si vos adresses se trouvent dans le même sous-réseau, Linux rendra la première adresse que vous avez ajoutée «principale» et les autres secondaires.

Je ne suis pas tout à fait sûr cependant, je lancerais tcpdump -n et verrais ce qu'il voit comme l'IP src.

EDIT2: D'accord, j'ai écrit ce qui précède du point de vue que vous exécutiez le serveur, donc puisque vous êtes le client et que vous établissez la connexion, je pense que cela semblera toujours provenir de l'adresse IP principale, mais encore une fois, essayez-le et voyez avec tcpdump.

Kyle Brandt
la source
La table de routage est juste la valeur par défaut et il n'y a qu'un seul sous-réseau. Une autre affiche indique que j'ai abusé du terme multihoming. Cependant, je m'attendrais toujours à ce qu'il utilise l'alias eth0. J'ai utilisé wget pour télécharger whatsmyip.net et cela me montre que j'utilise plutôt eth0: 0 à la place.
Joe Holloway,
Cela n'a pas vraiment de sens pour moi, whatsmyip.net devrait montrer votre adresse IP publique ...
Kyle Brandt
Pour être plus clair, il montre l'adresse IP publique qui est NAT-ed à l'IP privée associée à eth0: 0, alors que je m'attendrais à ce qu'il montre l'adresse IP publique qui est NAT-ed à l'IP privée associée à eth0
Joe Holloway
1
Cette réponse est trop votée et contient de nombreuses modifications et confond beaucoup de choses et n'aide pas. Les réponses de tbman et jknapka sont excellentes et m'ont beaucoup aidé.
Christian
4

À moins que votre travail FTP n'ait un moyen de spécifier l'interface à utiliser pour les connexions, je crois qu'il s'agit par défaut de la première interface physique sur le sous-réseau pertinent (eth0 dans ce cas). Si vous aviez un serveur avec deux cartes réseau sur des sous-réseaux différents, cela déterminerait quelle interface utiliser en fonction de la table de routage.

Comme il n'y a qu'une seule interface physique sur le système (eth0) et quatre virtuels / alias (eth0: 0 à eth0: 2) sur le même sous-réseau, le trafic sortant utilisera l'adresse IP eth0 comme source sauf si l'application est suffisamment intelligente pour déclarer une interface sortante.

sysadmin1138
la source
2
C'était mon hypothèse, mais tous mes tests indiquent qu'il utilise eth0: 0 comme source.
Joe Holloway
Alors peut-être que la route par défaut est configurée pour utiliser l'interface eth0: 0. J'ai une installation qui utilise un pont Ethernet, et elle a été configurée pour utiliser l'interface de pont virtuel pour l'itinéraire par défaut.
sysadmin1138
J'ai installé un programme trivial sur une autre machine pour imprimer l'adresse IP à partir de laquelle il a reçu une connexion. La connexion à celle-ci avec nc -s <ip of eth0:2>ou quoi que ce soit montre toujours l'adresse source est en fait l'ip de eth0: 0, même si netcat l'a fait bind(2)auparavant connect(2). Il semble donc que les alias ne fonctionnent pas pour donner à une machine la possibilité d'établir des connexions à partir de plusieurs adresses source.
Peter Cordes du
4

Vous pouvez voir quel périphérique et quelle adresse IP src seront utilisés par la commande ip route get comme ci-dessous:

$ /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

Je n'ai pas essayé cela dans un environnement aliasé, mais j'espère que cela vous aidera.

tomoe
la source
1

Lors de l'établissement d'une connexion sortante, votre serveur cherchera dans sa table de routage pour déterminer laquelle de vos quatre interfaces utiliser; vos connexions TCP auront une IP source de votre interface de sortie.

netstat -rn

Vous donnera la sortie de votre table de routage; recherchez les entrées spécifiques correspondant à l'adresse IP du client auquel vous essayez de vous connecter. S'il n'en existe pas, vous utiliserez une route par défaut (0.0.0.0, masque 0.0.0.0). Si vous avez plusieurs itinéraires par défaut, celui qui a le coût le plus bas sera celui utilisé.

Murali Suriar
la source