Pourquoi le trafic réseau Linux passe-t-il uniquement par eth0?

20

J'ai deux cartes réseau côté serveur, eth0? 192.168.8.140 et eth1? 192.168.8.142. Le client envoie des données à 192.168.8.142, et je m'attends iftopà montrer le trafic pour eth1, mais ce n'est pas le cas. Tous les réseaux passent par eth0, alors comment puis-je tester les deux cartes réseau?

Pourquoi tout le trafic passe-t-il par eth0 au lieu de eth1? Je m'attendais à pouvoir obtenir 1 Gbit / s par interface. Quel est le problème avec ma configuration ou ma configuration?

Serveur

ifconfig

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff

Du côté serveur

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!

Client

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!

Du côté serveur

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff
wener
la source
1
Cela ressemble à ce que vous cherchez vraiment à la liaison d'interface: wiki.linuxfoundation.org/networking/bonding
Flexo
@flexo a tout à fait raison - selon votre objectif ultime, la liaison des deux interfaces réseau ensemble peut vous donner une bande passante plus globale, mais les options de liaison varient. Le mieux que vous puissiez obtenir est 2 flux de ~ 1 Gbit, et non 1 flux de 2 Gbit. De plus, vous avez besoin des services d'un commutateur Ethernet géré. De même, la liaison 4 pourrait donner des flux 4x 1 Gbit à la fois.
Criggie

Réponses:

32

Il existe deux modèles de conception possibles pour une pile réseau TCP / IP: un modèle hôte fort et un modèle hôte faible. Vous vous attendez à un comportement qui correspondrait au modèle hôte fort. Linux est conçu pour utiliser le modèle d'hôte faible. En général, le modèle d'hôte faible est plus courant car il réduit la complexité du code de routage et peut donc offrir de meilleures performances. Sinon, les deux modèles hôtes ne sont que des principes de conception différents: aucun n'est intrinsèquement meilleur que l'autre.

Fondamentalement, le modèle d'hôte faible signifie que le trafic sortant sera envoyé à la première interface répertoriée dans la table de routage qui correspond à l'adresse IP de la destination (ou à la passerelle sélectionnée, si la destination n'est pas accessible directement), sans égard à l'IP source adresse .

C'est essentiellement pourquoi il est généralement déconseillé d'utiliser deux interfaces physiques distinctes si vous avez besoin de deux adresses IP sur le même segment de réseau. Attribuez plutôt deux adresses IP pour une interface (alias IP: par exemple eth1 = 192.168.8.142 et eth1: 0 = 192.168.8.140). Si vous avez besoin de plus de bande passante qu'une seule interface peut fournir, liez (ou équipe, le cas échéant) deux interfaces ou plus ensemble, puis exécutez les deux IP sur la liaison / équipe.

En modifiant un certain nombre de paramètres sysctl et en utilisant la fonctionnalité de «routage avancé» pour configurer des tables de routage indépendantes pour chaque carte réseau, il est possible de faire en sorte que Linux se comporte comme un système à modèle hôte fort. Mais c'est une configuration très spéciale, et je recommanderais de réfléchir à deux fois avant de l'implémenter.

Voir les réponses sur Linux Source Routing, Strong End System Model / Strong Host Model? si vous en avez vraiment besoin.

telcoM
la source
Le mode par défaut est également une mauvaise surprise en attente si vous essayez de façonner le trafic avec iptables :)
rackandboneman
oui, je me suis amusé à implémenter le modèle hôte fort dans le passé. C'était nécessaire pour ce projet, mais je ne prendrais pas la peine de traverser ce mal de tête pour une machine personnelle.
Baldrickk
11

Un autre point à considérer est que l'interface eth1 est configurée avec un masque de sous-réseau de 255.255.255.255.

Cela signifie que l'interface eth1 est configurée pour n'attendre aucun autre périphérique (hôte) sur son interface réseau. Cela signifie qu'il ne pourra pas communiquer avec votre client 192.168.8.142.

M Bend
la source
2

Après beaucoup de recherches, j'ai trouvé pourquoi netcat n'utilise pas la bonne interface associée à l'IP? , et c'est le même problème. Comme l'a dit @telcoM, le trafic sortant sera envoyé à la première interface, et c'est le problème, donc, la façon la plus simple de résoudre ce problème est:

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

Cette route fera ip route get 192.168.8.135 from 192.168.8.142retourner eth1 au lieu de eth0. Ensuite, tout fonctionne comme prévu.

wener
la source
3
Si vous omettez les paramètres sysctl ARP mentionnés dans la question à laquelle j'ai fait référence et que vous traitez avec des commutateurs et des routeurs de niveau entreprise, votre administrateur réseau sera un peu mécontent de vous causer des messages inutiles de "flappage d'adresse IP" sur le routeur, comme le le système peut toujours répondre aux demandes ARP pour les deux IP sur les deux interfaces. Ou si vous disposez d'une protection contre le piratage IP sur le réseau, elle peut activer et désactiver tout le trafic vers votre système.
telcoM