web-dev-qa-db-fra.com

Lors de l'aliasing IP Comment le système d'exploitation déterminera-t-il quelle adresse IP sera utilisée comme source pour les connexions TCP / IP sortantes?

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.x.x pour des sceptes de l'exemple, supposons que ceux-ci sont NAT-ED à une gamme d'adresses IP publiques)

L'un de nos clients publie leur inventaire via FTP, nous nous connectons donc la nuit pour télécharger un fichier volumineux de leur serveur. Leur pare-feu s'attend à ce que notre connexion FTP (passive) soit faite à partir de 192.168.1.100.

Étant donné que mon serveur dispose de quatre adresses IP sur un seul adaptateur, 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 dans mon serveur le 192.168.1.101 et exécutez 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 l'interface sur laquelle ma coquille est connectée?

Et 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 dire, cela m'a 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 que cela répertorie "Eth0" comme l'IFACE pour les itinéraires de 0.0.0.0. Cependant, toutes les indications sont qu'il utilise en réalité l'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 faire changer de code de pare-feu pour obtenir le comportement dont j'ai besoin, mais j'essaie de mieux comprendre comment cela fonctionne de savoir s'il y a un bogue dans le système d'exploitation ou juste ma compréhension naïve de la façon dont toutes les pièces vont ensemble.

Merci

15
Joe Holloway

Par défaut, sur Linux, si une interface comporte plusieurs adresses sur différents sous-réseaux, le trafic destiné aux sous-réseaux respectifs disposera de la propriété intellectuelle appropriée. C'est-à-dire que 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 à quoi que ce soit sur le sous-réseau 192.168.1.0 aura une source. 192.168.1.1. Vous pouvez également affecter des adresses source explicitement dans ce cas à l'aide de l'option "SRC 1.2.3.4" à "itinéraire IP".

Dans votre cas, toutes vos adresses sont sur le même sous-réseau, le "primaire" (comme révélé "IP Addr Liste de Dev Eth0") est utilisé comme IP source pour la sortie de la circulation sur cette interface. Je pense qu'il est possible de contrôler la source IPS dans ce cas simplement en utilisant "IP itinéraire", mais j'ai trouvé qu'il est plus facile d'utiliser des iptables pour réécrire les adresses source du trafic d'intérêt.

Si vous souhaitez forcer une adresse source spécifique à utiliser 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 adresse IP d'ETH0 "primaire" est de 192.168.100.1, mais que vous souhaitez que le trafic 1.2.3.4 ait une source de 192.168.100.2, alors faites ceci:

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 transmis Les adresses de la source de la circulation sont réécrites par cette règle.

Si vous souhaitez implémenter des configurations réseau complexes sur Linux, vous devez lire la documentation de routage avancée et de contrôle de la circulation Linux, http://lartc.org

12
user14017

Je vois dans votre exemple que tous les IP sont trop proches de ne pas être dans le même réseau

êtes-vous sûr que vous êtes réellement multi-uThoming et que vous n'avez pas simplement 4 alias IP?

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

/ SBIN/IP Itinéraire Afficher le 192.168.222.0/24 Dev Eth0 Proto Kernel Scope Link SRC 192.168.222.178 169.254.0.0/16 Dev Eth0 Lien d'étendue Par défaut via 192.168.222.1 Dev Eth0

Itinéraire SUDO/SBIN/IP Remplacer par défaut via 192.168.2222.1 SRC 192.168.2222.178

/ show sbin/ip itinéraire
[.____] 192.168.222.0/24 Dev Proto Proto Scope Link SRC 192.168.222.178 169.254.0.0/16 Dev Eth0 Lien d'étendue Par défaut via 192.168.222.1 Dev ETH0 SRC 192.168.2222.178

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

5

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

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

Étant donné que vous utilisez du mode passif et que le client d'initiera toujours la connexion, je pense que le champ IP SRC dans l'en-tête IP apparaîtra toujours comme n'importe quelle adresse IP du client connecté. S'il s'agissait de mode actif, le serveur a initié la connexion, je pense que ce serait toujours l'adresse IP "primaire". Si vos adresses sont dans le même sous-réseau, Linux fera la première adresse que vous avez ajoutée "primaire" et les autres secondaires.

Je ne suis pas tout à fait sûr, je voudrais courir Tcpdump -n et voir ce qu'il voit comme la propriété intellectuelle SRC.

EDIT2: D'accord, j'ai écrit ce qui précède du point de vue que vous exécutez le serveur, de sorte que vous êtes le client et que vous initiez la connexion, je pense qu'il semblera toujours de venir de l'adresse IP primaire, mais de nouveau, essayez-la et voyez avec tcpdump.

5
Kyle Brandt

À moins que votre travail FTP ait un moyen de spécifier l'interface à utiliser pour les connexions, je pense qu'il est par défaut de la première interface physique sur le sous-réseau correspondant (ETH0 dans ce cas). Si vous aviez un serveur avec deux niques sur différents sous-réseaux, cela déterminerait l'interface à utiliser sur la base de la table de routage.

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

4
sysadmin1138

Vous pouvez voir quel appareil et l'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.

4
tomoe

Lors de l'établissement d'une connexion sortante, votre serveur examinera sa table de routage pour déterminer laquelle de vos quatre interfaces à utiliser; Votre TCP Connections aura une adresse IP source de votre interface de sortie.

netstat -rn

Vous donnera la sortie de votre table de routage; Recherchez des entrées spécifiques correspondant à l'adresse IP du client que vous essayez de vous connecter. Si aucun n'existe, 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 avec le coût le plus bas sera celui utilisé.

1
Murali Suriar