OVH Cloud OVH Cloud

route selective et processus local.

23 réponses
Avatar
DoMinix
Voila mon soucis :
J'ai une machine (linux) qui est sur un LAN avec 2 routeur ADSL bas de
gamme, l'un [ADSL1] est le routeur par default et je voudrais utiliser
l'autre [ADSL2] uniquement pour un service donné.

[LAN]
|
[LINUX]
|
+-----+---------+
| |
[ADSL1] [ADSL2]
| |
[INET1] [INET2]


J'ai utilisé sur la machine linux des règles iptables pour marquer
(FWMARK) les paquets concernés dans la table mangle, puis routage par
"ip rule add fwmark" + "ip route add default <x> table y", ca fait ce
que je veux, mais ca ne fonctionne que pour des paquets *forwardé*, pas
pour des paquets généré localement. :/

j'ai beaucoup cherché sur Google et dans mes documentations, et j'ai
compris que lorsque le processus de décision de route etait pris
localement les régles de marquage ou bien "iptables -t mangle -j ROUTE"
ne fonctionnais pas car elles operent dans PREROUTING et nous n'y
passons pas. J'ai trouvé des infos allant dans le sens de ce que je veux
faire avec des techniques que je ne connais pas bien encore, telle celle
utilisant tc et le selecteur u32 ou ebtables.

Ma questions est : par quel moyens puis je donner [localement] une route
différente que celle par default a des paquets généré localement (non
forwardé), que je peux désigner par leur port.

NB : ici il n'y a pas de soucis de NAT.

merci de vos éclairages et pointeurs.

--
dominix

10 réponses

1 2 3
Avatar
Pascal Hambourg

sysctl gère les paramètres du noyau, pas les options (de compilation).


il n'avait pas precisé qu'il n'agissait de compilation. :)


Parce que c'était implicite. :-p Quand on parle des options du noyau, il
s'agit des options de compilation.

Je pense que Vincent veut parler de la politique de routage en fonction
de l'adresse source (ip rule add from), qu'il appelle de façon ambiguë
"source routing" (qui peut aussi désigner l'option de même nom de
l'en-tête IP, qui n'a rien à voir et qui est très rarement supportée par
les routeurs). Mais cela suppose que la machine utilise une adresse IP
source dédiée pour les paquets à faire sortir par l'autre routeur.



et il y a t'il moyen de faire cela sans ajouter de carte reseaux.


Il ne faut *surtout pas* ajouter une carte réseau pour faire ça ! On
ajoute une carte réseau pour connecter la machine à un autre réseau
physique, pas pour lui ajouter une adresse IP supplémentaire. Ou alors
pour faire de l'agrégation de liens (channel bonding), mais c'est une
autre histoire.

j'ai essayé en ajoutant une interface eth0:1 avec une autre adresse
mais ca route pas mieux mon service.


C'est une opération nécessaire mais non suffisante. Il faut faire en
sorte que les applications locales qui utilisent le service que tu veux
faire passer par l'autre routeur utilisent explicitement cette adresse
source, en espérant que ce soit prévu. Cela se fait par une option de la
ligne de commande ou dans le fichier de configuration.

Mais avant d'en arriver à ces extrémités, as-tu essayé ma suggestion de
marquer les paquets dans la chaîne OUTPUT ?


Avatar
Pascal Hambourg

Désolé mais désormais il va falloir régler ca avec iptables par exemple
ou bien avec 2 cartes réseaux en spécifiant dans la table de routage que
pour tel port il s'adresse a tel interface (physiquement relié a tel
routeur) et pour le reste il utilise la config par defaut.


La table de routage de Linux ne permet pas de prendre en compte les
ports TCP ou UDP. D'autre part, une carte réseau supplémentaire ne sert
à rien pour faire ça.

Avatar
DoMinix

Il ne faut *surtout pas* ajouter une carte réseau pour faire ça ! On
ajoute une carte réseau pour connecter la machine à un autre réseau
physique, pas pour lui ajouter une adresse IP supplémentaire. Ou alors
pour faire de l'agrégation de liens (channel bonding), mais c'est une
autre histoire.


oui, ou du "fail over" pour la haute disponibilité :)

j'ai essayé en ajoutant une interface eth0:1 avec une autre adresse
mais ca route pas mieux mon service.


C'est une opération nécessaire mais non suffisante. Il faut faire en
sorte que les applications locales qui utilisent le service que tu veux
faire passer par l'autre routeur utilisent explicitement cette adresse
source, en espérant que ce soit prévu. Cela se fait par une option de la
ligne de commande ou dans le fichier de configuration.

Mais avant d'en arriver à ces extrémités, as-tu essayé ma suggestion de
marquer les paquets dans la chaîne OUTPUT ?


j'essaie cette solution des que je retourne sur la machine en question.
je suis pas sur d'avoir dejà essayé tant j'ai essayé de choses :/

mais les encouragements vont me guider dans cette voie.
merci du soutient.

--
dominix


Avatar
DoMinix

Désolé mais désormais il va falloir régler ca avec iptables par exemple
ou bien avec 2 cartes réseaux en spécifiant dans la table de routage que
pour tel port il s'adresse a tel interface (physiquement relié a tel
routeur) et pour le reste il utilise la config par defaut.


La table de routage de Linux ne permet pas de prendre en compte les
ports TCP ou UDP. D'autre part, une carte réseau supplémentaire ne sert
à rien pour faire ça.


Hors iptables il me semble qu'il /devrait/ exister une solution avec tc
et le selecteur u32 qui sait selectionner les ports(et les flags) ?

ou ebtables en output/postrouting ? mais je n'ai jamais fait ça
(pas encore ) :-)

ca vous parle ?

--
dominix


Avatar
Pascal Hambourg

Hors iptables il me semble qu'il /devrait/ exister une solution avec tc
et le selecteur u32 qui sait selectionner les ports(et les flags) ?


Je ne connais pas spécialement tc, n'en ayant jamais eu besoin, mais je
doute qu'il puisse influencer le routage.

ou ebtables en output/postrouting ? mais je n'ai jamais fait ça
(pas encore ) :-)


J'imagine qu'on doit pouvoir utiliser la cible 'dnat' pour remplacer
l'adresse MAC destination des trames sortantes contenant les paquets à
router via l'autre routeur par l'adresse MAC de ce dernier. Mais ça me
paraît un peu lourd.

Avatar
Vincent Bernat
OoO En cette fin de matinée radieuse du lundi 18 décembre 2006, vers
11:03, DoMinix disait:

Sinon, une
solution assez vieille que j'utilisais :
http://groups.google.fr/group/fr.comp.os.unix/browse_thread/thread/f5a57bdeb9f49b2f/7c9aca692deb8022?lnk=st&q=tos+vincent+bernat&rnum=1&hl=fr#7c9aca692deb8022

Cela marche impec.


j'ai lu mais j'ai pas compris en quoi cela me permettrais de regler un
probleme de route ? désolé.


Laurent Wacrenier donne un code qui permet de modifier les bits TOS
des paquets d'une application particulière. Ensuite, le routage avancé
de Linux permet de router ce paquet comme tu veux selon la valeur de
ce bit. Il faut juste lancer certaines applications avec le LD_PRELOAD
qui va bien.
--
#if 0
2.2.16 /usr/src/linux/fs/buffer.c


Avatar
dominix

[...]
j'ai essayé en ajoutant une interface eth0:1 avec une autre adresse
mais ca route pas mieux mon service.


C'est une opération nécessaire mais non suffisante. Il faut faire en
sorte que les applications locales qui utilisent le service que tu veux
faire passer par l'autre routeur utilisent explicitement cette adresse
source, en espérant que ce soit prévu. Cela se fait par une option de la
ligne de commande ou dans le fichier de configuration.

Mais avant d'en arriver à ces extrémités, as-tu essayé ma suggest ion de
marquer les paquets dans la chaîne OUTPUT ?


voila c'est bien ça, ça fonctionne maintenant avec la chaine OUTPUT.


En fait j'etait resté perplexe sur l'usage du fwmark dans cette chaine

car j'avais fait des tests sur une [autre] machine avec 2 interfaces
mais
ça ne fonctionnais pas car les paquets partaient vers le routeur
choisi
mais avec l'adresse de la carte de l'autre LAN.

[ADSL1]
|
| Eth1
[LINUX]
| Eth2
|
[ADSL2]

le paquet sortant par ADSL2 semblait venir de eth1 et les reponses
(qui arrivait pourtant) ne permettait pas d'etablir de connection
je comprend bien qu'au depart le paquet soit "fabriqué" de cette
façon mais je ne comprend pas pourquoi le paquet retourné via
l'autre routeur dans cas n'est pas accepté ?? une idée ??

merci en tous cas.

--
dominix


Avatar
Pascal Hambourg

voila c'est bien ça, ça fonctionne maintenant avec la chaine OUTPUT.

En fait j'etait resté perplexe sur l'usage du fwmark dans cette chaine


Comme le NAT destination en sortie, je comprends que ça puisse être...
déroutant. ;-)

car j'avais fait des tests sur une [autre] machine avec 2 interfaces
mais ça ne fonctionnais pas car les paquets partaient vers le routeur
choisi mais avec l'adresse de la carte de l'autre LAN.


Normal s'il y a eu reroutage et changement d'adresse de sortie à cause
d'une marque posée par iptables. Comme on peut le voir sur ce schéma :

http://www.plouf.fr.eu.org/bazar/netfilter/schema_netfilter.txt

pour les paquets émis localement, il y a deux décisions de routage : une
première avant les chaînes OUTPUT (qui ne peut prendre en compte les
marques ou le NAT destination) et une seconde après, qui sert au
reroutage en cas de marquage ou de NAT destination. L'adresse source, si
elle n'est pas déjà fixée par la socket émettrice, est déterminée par la
première décision de routage avant que le paquet traverse les chaînes
OUTPUT. En cas de reroutage suite à une marque, l'interface de sortie
peut changer mais pas l'adresse source. Seul le NAT destination (DNAT)
en sortie peut le faire avec les versions de noyau antérieures à 2.6.11,
mais les versions ultérieures ne le font plus.

[ADSL1]
|
| Eth1
[LINUX]
| Eth2
|
[ADSL2]

le paquet sortant par ADSL2 semblait venir de eth1


Correction : le paquet sortant par ADSL2 porte l'adresse source de eth1.

et les reponses (qui arrivait pourtant)


Qui arrivaient jusqu'où ? Jusqu'au routeur ADSL2, à la machine Linux ?

ne permettait pas d'etablir de connection
je comprend bien qu'au depart le paquet soit "fabriqué" de cette
façon mais je ne comprend pas pourquoi le paquet retourné via
l'autre routeur dans cas n'est pas accepté ?? une idée ??


Peut-être le routeur ADSL2 qui ne route/déNATe pas correctement un
paquet vers l'adresse de eth1 qui n'appartient pas à son sous-réseau ?
Une solution consiste à modifier l'adresse source avec une règle SNAT
dans la chaîne POSTROUTING en fonction de l'interface de sortie.
Attention avec la cible MASQUERADE qui semble à première vue plus
pratique : avec les versions de noyau antérieures à 2.6.10, elle ne
fonctionne pas toujours bien avec le routage avancé car elle se base non
pas sur l'interface de sortie mais sur une décision de routage partielle
pour déterminer la nouvelle adresse source.

Avatar
Pascal Hambourg
[supersedes]


voila c'est bien ça, ça fonctionne maintenant avec la chaine OUTPUT.

En fait j'etait resté perplexe sur l'usage du fwmark dans cette chaine


Comme le NAT destination en sortie, je comprends que ça puisse être...
déroutant. ;-)

car j'avais fait des tests sur une [autre] machine avec 2 interfaces
mais ça ne fonctionnais pas car les paquets partaient vers le routeur
choisi mais avec l'adresse de la carte de l'autre LAN.


Normal s'il y a eu reroutage et changement d'interface de sortie à cause
d'une marque posée par iptables. Comme on peut le voir sur ce schéma :

http://www.plouf.fr.eu.org/bazar/netfilter/schema_netfilter.txt

pour les paquets émis localement, il y a deux décisions de routage : une
première avant les chaînes OUTPUT (qui ne peut prendre en compte les
marques ou le NAT destination) et une seconde après, qui sert au
reroutage en cas de marquage ou de NAT destination. L'adresse source, si
elle n'est pas déjà fixée par la socket émettrice, est déterminée par la
première décision de routage avant que le paquet traverse les chaînes
OUTPUT. En cas de reroutage suite à une marque, l'interface de sortie
peut changer mais pas l'adresse source. Seul le NAT destination (DNAT)
en sortie peut le faire avec les versions de noyau antérieures à 2.6.11,
mais les versions ultérieures ne le font plus.

[ADSL1]
|
| Eth1
[LINUX]
| Eth2
|
[ADSL2]

le paquet sortant par ADSL2 semblait venir de eth1


Correction : le paquet sortant par ADSL2 porte l'adresse source de eth1.

et les reponses (qui arrivait pourtant)


Qui arrivaient jusqu'où ? Jusqu'au routeur ADSL2, à la machine Linux ?

ne permettait pas d'etablir de connection
je comprend bien qu'au depart le paquet soit "fabriqué" de cette
façon mais je ne comprend pas pourquoi le paquet retourné via
l'autre routeur dans cas n'est pas accepté ?? une idée ??


Peut-être le routeur ADSL2 qui ne route/déNATe pas correctement un
paquet vers l'adresse de eth1 qui n'appartient pas à son sous-réseau ?

Une solution consiste à modifier l'adresse source avec une règle SNAT
dans la chaîne POSTROUTING en fonction de l'interface de sortie pour
l'adresse et l'interface correspondent.

Attention avec la cible MASQUERADE qui semble à première vue plus
pratique : avec les versions de noyau antérieures à 2.6.10, elle ne
fonctionne pas toujours bien avec le routage avancé car elle se base non
pas sur l'interface de sortie mais sur une décision de routage partielle
pour déterminer la nouvelle adresse source.

Avatar
dominix

[supersedes]


voila c'est bien ça, ça fonctionne maintenant avec la chaine OUTPUT.

En fait j'etait resté perplexe sur l'usage du fwmark dans cette chaine


Comme le NAT destination en sortie, je comprends que ça puisse être...
déroutant. ;-)

car j'avais fait des tests sur une [autre] machine avec 2 interfaces
mais ça ne fonctionnais pas car les paquets partaient vers le routeur
choisi mais avec l'adresse de la carte de l'autre LAN.


Normal s'il y a eu reroutage et changement d'interface de sortie à cause
d'une marque posée par iptables. Comme on peut le voir sur ce schéma :

http://www.plouf.fr.eu.org/bazar/netfilter/schema_netfilter.txt


claro.


pour les paquets émis localement, il y a deux décisions de routage : une
première avant les chaînes OUTPUT (qui ne peut prendre en compte les
marques ou le NAT destination) et une seconde après, qui sert au
reroutage en cas de marquage ou de NAT destination. L'adresse source, si
elle n'est pas déjà fixée par la socket émettrice, est détermin ée par la
première décision de routage avant que le paquet traverse les chaîn es
OUTPUT. En cas de reroutage suite à une marque, l'interface de sortie
peut changer mais pas l'adresse source. Seul le NAT destination (DNAT)
en sortie peut le faire avec les versions de noyau antérieures à 2.6. 11,
mais les versions ultérieures ne le font plus.

[ADSL1]
|
| Eth1
[LINUX]
| Eth2
|
[ADSL2]

le paquet sortant par ADSL2 semblait venir de eth1


Correction : le paquet sortant par ADSL2 porte l'adresse source de eth1.

et les reponses (qui arrivait pourtant)


Qui arrivaient jusqu'où ? Jusqu'au routeur ADSL2, à la machine Linux ?


a la machine linux, mais comment dire, c'est comme si les paquet
n'etait pas
pris en compte.

pour simplifier et mettre en evidence mon observaton,
1/ je marque et route le traffic vers un port 25
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 2
ip rule add fwmark 0x2 table 201
ip route add defaut ADSL2 table 201
ip route flush cache
2/ je fait un
telnet monisp 25
3/ j'observe
tcpdump -n -i eth2

et la je vois bien passer mes paquets par eth2 au lieu de la route par
default.
eth1 -> monisp[25]
je vois des paquets revenir
monisp[25] -> eth1
mais mon telnet reste en 'trying" et fini par un timeout


ne permettait pas d'etablir de connection
je comprend bien qu'au depart le paquet soit "fabriqué" de cette
façon mais je ne comprend pas pourquoi le paquet retourné via
l'autre routeur dans cas n'est pas accepté ?? une idée ??


Peut-être le routeur ADSL2 qui ne route/déNATe pas correctement un
paquet vers l'adresse de eth1 qui n'appartient pas à son sous-réseau ?

Une solution consiste à modifier l'adresse source avec une règle SNAT
dans la chaîne POSTROUTING en fonction de l'interface de sortie pour
l'adresse et l'interface correspondent.



ce fut l'etape suivante
iptables -t nat -A POSTROUTING -p tcp --dport 25 -j SNAT --to-source
$eth2

mais toujours pas de telnet qui abouti.
même trace tcpdump que precedenment sauf que j'ai bien l'adresse eth2
au lieu de eth1

Attention avec la cible MASQUERADE qui semble à première vue plus
pratique : avec les versions de noyau antérieures à 2.6.10, elle ne
fonctionne pas toujours bien avec le routage avancé car elle se base non
pas sur l'interface de sortie mais sur une décision de routage partielle
pour déterminer la nouvelle adresse source.


je suis en 2.6.17 pour les tests, et en 2.6.12 pour la prod.
je viens de refaire le meme test avec MASQUERADE au lieu de SNAT que
je n'avais pas essayé et c'est pareil : toujours rien

--
dominix


1 2 3