Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb avec iproute : ne veut pas utiliser un gateway

1 réponse
Avatar
Cedric
Bonjour à tous.

Voici mon problème : J'ai une machine qui a deux cartes réseaux, avec une
IP différente sur chaque interface, mettons 1.1.1.10 sur eth0 et 1.1.2.20
sur eth1. Il y a donc les deux reseaux 1.1.1.0/24 et 1.1.2.0/24.

Les gateways de chacun de ses reseaux ne routent QUE les paquets dont la
sources appartient à leur sous-reseau, et sont accessibles aux ip 1.1.1.1
et 1.1.2.1.

Donc, lorsque la machine répond à une connection, elle doit absolument
renvoyer la réponse par le sous-reseaux par lequel la connection est entrée.

C'est un problème classique, qui se résoud classiquement avec iproute2.

Voilà donc la config initiale :

# ip rule ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
# ip route ls table main
1.1.2.0/24 dev eth1 proto kernel scope link src 1.1.2.20
1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.10
default via 1.1.2.1 dev eth1

symptomes : la machine ne répond pas à ping 1.1.1.10, mais bien à ping
1.1.2.20 - logique, elle répond via 1.1.2.1 qui ne route pas si l'ip source
est 1.1.1.10

Donc, j'ai crée une règle supplémantaire, de priorité 100, pour tout ce qui
provient de l'interface eth0 :

# ip rule add iif eth0 table 10 pref 100

et je crée ensuite la table de routage 10 comme ceci :

# ip route add to 1.1.1.0/24 src 1.1.1.10 table 10 dev eth0 [proto kernel]
( le "proto kernel" est là pour l'estetique je pense)
et
# ip route add default via 1.1.1.1 table 10 dev eth0

Je vérifie avec ip rule show et ip route show que tout est bien passé, et
je fait
# ip route flush cache

Mais ca ne change rien, le comportement reste inchangé. D'ou mon inquétude
(pour ne rien dire de l'inquiétude du propriétaire du serveur :-) )

Y'a deux choses qui me titillent :

premièrement, quand je test avec un IP lointain (google.com) :
# ip route get 216.239.39.99 oif eth1
216.239.39.99 via 1.1.2.1 dev eth1 src 1.1.2.20
cache mtu 1500 rtt 375ms

mais :
# ip route get 216.239.39.99 oif eth0
216.239.39.99 dev eth0 src 1.1.1.10
cache mtu 1500 rtt 375ms

vous noterez l'abscence troublante du "via 1.1.1.1" auquel je me serait
attendu.

deuxième détail choquant : en jouant avec tcpdump, j'ai l'impression que le
kernel drop purement et simplement le paquet qui arrive de eth0, sans meme
envoyer au routeur ; sans meme faire de requete arp, rien. Mais là je peut
me tromper, vu le trafic qu'il y a sur les interfaces...

Qu'en dites vous ?

1 réponse

Avatar
TiChou
Dans l'article news:4045cbab$0$28116$,
Cedric écrivait :

Bonjour à tous.


Bonjour,

Voici mon problème : J'ai une machine qui a deux cartes réseaux, avec une
IP différente sur chaque interface, mettons 1.1.1.10 sur eth0 et 1.1.2.20
sur eth1. Il y a donc les deux reseaux 1.1.1.0/24 et 1.1.2.0/24.

Les gateways de chacun de ses reseaux ne routent QUE les paquets dont la
sources appartient à leur sous-reseau, et sont accessibles aux ip 1.1.1.1
et 1.1.2.1.

Donc, lorsque la machine répond à une connection, elle doit absolument
renvoyer la réponse par le sous-reseaux par lequel la connection est
entrée.

C'est un problème classique, qui se résoud classiquement avec iproute2.

Voilà donc la config initiale :

# ip rule ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
# ip route ls table main
1.1.2.0/24 dev eth1 proto kernel scope link src 1.1.2.20
1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.10
default via 1.1.2.1 dev eth1


A partir de là je ferais ainsi :

Les paquets dont l'IP source est 1.1.1.10 doivent utiliser la table 10 :

ip rule add from 1.1.1.10 table 10 pref 100

et ceux dont l'IP source est 1.1.2.20 doivent utiliser la table 20 :

ip rule add from 1.1.2.20 table 20 pref 100

Les paquets utilisant la table 10 sont routés vers la passerelle 1.1.1.1 en
passant par l'interface eth0 :

ip route add table 10 via 1.1.1.1 dev eth0

et ceux utilisant la table 20 sont routés vers la passerelle 1.1.2.1 en
passant par l'interface eth1 :

ip route add table 20 via 1.1.2.1 dev eth1

Si on récapitule on a :

$ ip rule show
0: from all lookup local
100: from 1.1.1.10 lookup 10
100: from 1.1.2.20 lookup 20
32766: from all lookup main
32767: from all lookup default

$ ip route show table main
1.1.2.0/24 dev eth1 proto kernel scope link src 1.1.2.20
1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.10
default via 1.1.2.1 dev eth1

$ ip route show table 10
default via 1.1.1.1 dev eth0

$ ip route show table 20
default via 1.1.2.1 dev eth1

--
TiChou