web-dev-qa-db-fra.com

Forcer le trafic réseau à la route via une interface spécifique et non par défaut

J'ai un tas de serveurs Linux avec plusieurs (3) niques et interfaces réseau associées. Je tremble sur un problème de routage bizarre, où le trafic qui doit utiliser l'itinéraire par défaut n'est pas et ne pas être acheminé par conséquent. Voici ce que ma table de routage ressemble à:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.31.96.1      0.0.0.0         UG    0      0        0 em3
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 em1
10.31.96.0      0.0.0.0         255.255.252.0   U     0      0        0 em3
10.31.96.0      0.0.0.0         255.255.252.0   U     0      0        0 em4
# ip route list
default via 10.31.96.1 dev em3  proto static 
10.0.0.0/8 dev em1  proto kernel  scope link  src 10.0.0.100 
10.31.96.0/22 dev em3  proto kernel  scope link  src 10.31.97.100 
10.31.96.0/22 dev em4  proto kernel  scope link  src 10.31.96.61

10.31.96.1 est mon itinéraire par défaut que tout le trafic devrait utiliser (que EM # Stuff est une chose de Fedora, vous pouvez substituer mentalement "ETH 'en toute sécurité" partout où vous les voyez si cela facilite la suivi). Voici une sortie ifconfig:

em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.0.100  netmask 255.0.0.0  broadcast 10.255.255.255
    inet6 fe80::b6b5:2fff:fe5b:9e7c  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7c  txqueuelen 1000  (Ethernet)
    RX packets 283922868  bytes 44297545348 (41.2 GiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 538064680  bytes 108980632740 (101.4 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfeb60000-feb80000

em3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.31.97.100  netmask 255.255.252.0  broadcast 10.31.99.255
    inet6 fe80::b6b5:2fff:fe5b:9e7e  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7e  txqueuelen 1000  (Ethernet)
    RX packets 3733210  bytes 1042607750 (994.3 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1401537  bytes 114335537 (109.0 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfea60000-fea80000

em4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.31.96.61  netmask 255.255.252.0  broadcast 10.31.99.255
    inet6 fe80::b6b5:2fff:fe5b:9e7f  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7f  txqueuelen 1000  (Ethernet)
    RX packets 2416588  bytes 196633917 (187.5 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 205038  bytes 19363499 (18.4 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfeae0000-feb00000

eM1/10.0.0.0.100 passe à un commutateur qui est attaché niquement aux serveurs dans le même rack. Son utilisé uniquement pour les serveurs dans ce rack pour communiquer entre eux. EM3 & EM4 à la fois dans le même sous-réseau. La seule différence entre eux est que EM3 n'est pas toujours en hausse (sa associée à une adresse IP flottante basée sur quel serveur est actuellement dans le rôle "Master"). Fondamentalement, tout le trafic devrait sortir par EM3 à moins que celui-ci soit destiné à quelque chose d'autre sur le sous-réseau local 10.0.0.0.1/8, auquel cas elle devrait s'éteindre sur EM1. Cependant, ce n'est pas ce qui se passe. 10.31.96.1/16, 10.31.97.1/16 et 10.31.99.1/16 Le trafic se passe par EM3, mais des trucs destinés au 10.31.45.1/16 tentent de passer par EM1 et de passer au moment de l'itinéraire trafic efficacement.

Ceci est également illustré avec la commande suivante: # TCPtraceroute Cuda-Linux Traceroute to Cuda-Linux (10.31.45.106), 30 paquets d'octets 1 Cuda-FS1A-internes (10.0.0.0.100) 3006.650 MS! H 3006.624 MS! H 3006.619 MS! H

Pourtant, lorsqu'il est exécuté à partir d'un système sur le même réseau que la case ci-dessus, avec seulement une seule interface réseau, cela fonctionne: # TCPtraceroute Cuda-Linux Traceroute to Cuda-Linux (10.31.45.106), 30 paquets de houme max, 40 paquets d'octets 1 10.31 .96.2 (10.31.96.2) 0,345 ms 0,403 ms 0.474 MS 2 Cuda-Linux (10.31.45.106) 0,209 MS 0,208 MS 0,201 MS

Je pensais que je pouvais résoudre ce problème en ajoutant un itinéraire au 10.31.45.1 pour EM3, mais cela échoue:

# route add default gw 10.31.45.1 em3
SIOCADDRT: Network is unreachable

Je suis perdu à ce point sur quoi d'autre à essayer. aider?

6
netllama

Les itinéraires sont traités à partir de la route la plus spécifique de la route la moins spécifique (par défaut).

default via 10.31.96.1 dev em3  proto static 
10.0.0.0/8 dev em1  proto kernel  scope link  src 10.0.0.100 
10.31.96.0/22 dev em3  proto kernel  scope link  src 10.31.97.100 
10.31.96.0/22 dev em4  proto kernel  scope link  src 10.31.96.61

Vous avez dit que vous voulez should be going out through em3 unless its destined for something else on the local 10.0.0.1/8 subnet. C'est exactement ce qui se passe. L'adresse IP 10.31.45.1 est dans 10.0.0.0/8 Et donc il part via EM1. Les 10.0.0.0/8 L'itinéraire correspond à cette adresse est plus spécifique que la route par défaut. L'adresse ne correspond pas à la 10.31.96.0/22 route. Par conséquent, la route EM1 est sélectionnée.

Votre problème réel est que vous avez un masque de sous-réseau sur cette interface EM1 qui est beaucoup trop grande pour ce que vous avez probablement besoin et qu'il est en conflit avec les autres réseaux. Tout ce qui est destiné à une adresse IP dans la gamme 10.0.0.1-10.255.255.254 tentera d'utiliser EM1 comme s'il était local, quelle exception des adresses dans le 10.31.96.0/22 ​​qui partieront via EM3/EM4.

Votre solution consiste à corriger le sous-réseau/réseau EM1 afin de ne pas entrer en conflit avec vos autres réseaux ou d'ajouter de nombreux itinéraires.

Quelque chose comme ip route add 10.31.45.0/24 via 10.31.96.1 pourrait faire ce que vous voulez.

11
Zoredache