J'ai une boîte Linux avec 9 cartes réseau, et je veux que huit d'entre elles aient des adresses uniques sur le même sous-réseau, par exemple:
ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0
Le comportement ARP par défaut est extrêmement contre-productif dans ce cas, car il se traduit par tout le trafic pour toutes les IP passant exclusivement eth1
, ce qui est à peu près exactement le contraire de ce que je veux.
J'ai donc fouillé et j'ai fini par apporter des modifications à sysctl comme ceci:
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
Cela a empêché eth1
de se faire passer pour tous les autres, mais je ne parviens toujours pas à cingler autre chose que eth1
l'adresse de. (par exemple à partir d'un deuxième ordinateur sur le même commutateur, ne 192.168.123.1
répond qu'au ping)
Je suppose que je dois faire quelque chose avec des arptables ou des iproute ou QUELQUE CHOSE, mais je suis perdu en mer dans ce domaine.
Points bonus: la solution doit être compatible avec Linux 2.6.27.27. (Plus précisément, Slax 6.1.2)
la source
Réponses:
Vous avez besoin d'un modèle de système d'extrémité solide . Linux est fondamentalement construit autour d'un modèle de système d'envoi faible, donc ce n'est vraiment pas un bon choix de système d'exploitation pour cette application.
Vous devrez simuler chaque élément du comportement dont vous avez besoin, de l'ARP au routage des stratégies en passant par la sélection de l'adresse source. Vous aurez également besoin de filtres pour empêcher les paquets d'être acceptés s'ils arrivent sur la mauvaise interface.
Les étapes absolument nécessaires sont:
Configurez arp_filter = 1 et arp_ignore = 2 sur toutes les interfaces.
Ajoutez un routage basé sur la source par interface pour le trafic sortant. (L'interface de destination doit être choisie en fonction de l'adresse source.)
Ajoutez un filtrage d'entrée par interface pour supprimer silencieusement les paquets reçus sur la mauvaise interface. (Paquets avec une adresse de destination affectée à une autre interface.)
Malheureusement, il n'y a pas de consensus sur la question de savoir si ces trois étapes suffisent. Le modèle de système d'extrémité faible est intégré à l'ensemble de la pile TCP / IP Linux, et il n'est pas clair ce qui pourrait mal tourner avec des problèmes subtils comme la multidiffusion.
Par exemple, la façon dont vous choisiriez l'interface de sortie pour les émissions n'est pas claire. Doit-il les éliminer tous? Peut être. Quel est le bon comportement si la pile reçoit une diffusion sortante avec une adresse source non affectée à l'une des interfaces?
Encore une fois, vous avez choisi le mauvais outil pour le travail.
la source
Vous souhaiterez plus probablement créer un pont avec les interfaces 8/9 puis attribuer une adresse IP à ce pont (paquet bridge-utils, commande 'brctl add').
De cette façon, le pont agira comme un commutateur et peut avoir une adresse IP dans votre sous-réseau.
la source
Je recommanderais de lier les interfaces physiques, puis de configurer toutes les adresses sur l'interface à liaison unique.
Vous aurez également besoin d'assistance sur le commutateur.
Voici un mini tutoriel que vous pouvez utiliser pour commencer.
la source
Il semble que vous souhaitiez un environnement de test équivalent à 9 machines distinctes, et vous pensiez que 9 interfaces sur une machine pourraient émuler cela. Sous Linux, il ne peut tout simplement pas le faire via une seule pile pour les raisons décrites par David Schwartz. BTDT et avoir les cicatrices. C'était déjà assez mauvais avec 2 interfaces.
Une meilleure solution pourrait être d'exécuter 8 ou 9 machines virtuelles discrètes dans votre seul hôte et de relier 8 ou 9 interfaces à ces machines virtuelles.
la source
Oui, c'est possible suite à la suggestion de David Schwartz:
// Pour une fonctionnalité correcte, c'est-à-dire que les réponses ARP de eth1 sont générées lorsque eth0 et eth1 sont dans le même sous-réseau
// configure la table "new_rt_table" pour router les paquets via eth1
// marque les paquets pour que 'ip route' puisse les acheminer via eth1
// active la prise en charge de plusieurs tables de routage dans la configuration du noyau.
Configuration du noyau
→ Prise en charge de la mise en réseau → Options de mise en réseau
[*] IP: routeur avancé
[*] IP: routage de stratégie
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
// les étapes ci-dessus redirigent les paquets destinés à être sortis de eth0 pour quitter correctement eth1.
Veuillez suggérer toute autre méthode si quelqu'un le fait fonctionner.
la source