plusieurs interfaces physiques avec IP sur le même sous-réseau

13

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é eth1de se faire passer pour tous les autres, mais je ne parviens toujours pas à cingler autre chose que eth1l'adresse de. (par exemple à partir d'un deuxième ordinateur sur le même commutateur, ne 192.168.123.1ré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)

frustrated_tester
la source
Pouvez-vous publier la table de routage?
ponsfonze
2
Quel est votre objectif dans la création de cette configuration? Qu'est-ce que vous essayez d'accomplir?
David Schwartz
de cette façon, la folie se trouve.
Sirex
si vous voulez lier ces interfaces, vous devrez les lier.
resmon6
1
@DavidSchwartz Non, la machine n'est pas censée agir comme un commutateur (ou un routeur). Pensez-y davantage comme exécutant 8 machines virtuelles avec une carte réseau physique dédiée pour chaque VM ( Remarque: je n'exécute pas de VM, ce n'est qu'une analogie ). Du point de vue d'une autre box sur le même réseau, mon PC unique devrait être totalement indiscernable de huit PC discrets.
frustrated_tester

Réponses:

17

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:

  1. Configurez arp_filter = 1 et arp_ignore = 2 sur toutes les interfaces.

  2. 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.)

  3. 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.

David Schwartz
la source
6

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.

Be2eB
la source
AFAIK, cela devrait en fait être la bonne réponse pour Linux. Linux contourne bon nombre des problèmes mentionnés dans la réponse de David en utilisant des périphériques de pont (alias éviter les problèmes L3 en construisant un meilleur réseau logique L2).
Dave
4

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.

bahamat
la source
4

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.

Skaperen
la source
Ressources de lecture: Programmation réseau Unix: l'API Sockets Networking, par Stevens, Fenner et Rudoff. Voir également RFC1122 et RFC4907.
Skaperen
0

Oui, c'est possible suite à la suggestion de David Schwartz:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

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

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// configure la table "new_rt_table" pour router les paquets via eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// marque les paquets pour que 'ip route' puisse les acheminer via eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

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

noel av
la source