PROJET AUTOBLOG


Shaarli - Les discussions de Shaarli

Archivé

Site original : Shaarli - Les discussions de Shaarli du 23/07/2013

⇐ retour index

ip-rule(8) - Linux manual page [ tables de routage multiples + openvz ]

vendredi 27 mars 2015 à 01:50
GuiGui's Show - Liens 27/03/2015
On a des conteneurs OpenVZ avec une configuration réseau en mode routé. Ces conteneurs ont une IP dans le même réseau que le conteneur voisin... ou pas. Ces conteneurs sont situés dans une VM GNU/Linux. La VM est en mode bridgé donc le premier routeur (d'un point de vue de la VM) est le routeur du réseau, pas l'hôte de la VM.

Dans chaque conteneur, la table de routage contient : default dev venet0 et <mon_subnet> dev venet0 (ajoutée automatiquement par le kernel lors du up de l'interface réseau). La table de routage de la VM contient : autant de routes /32 dev venet0 qu'il y a de conteneurs ainsi que la route correspondante à l'interface eth0 et la default route : default via <IP_premier_routeur> dev eth0.

Que se passe-t-il quand deux conteneurs veulent communiquer entre eux ?
   - S'ils sont dans le même subnet -> pas d'importance, une venet est toujours en NOARP. Le trafic sera donc forcément forwardé dans la venet, réceptionné par le kernel, lookup dans la table de routage, obtention d'une route /32 pour le conteneur destinataire et donc forward sur la venet0
   - S'ils ne sont pas dans le même subnet -> forward IP dans la venet0, réception par le kernel, lookup dans la table de routage, obtention d'une route /32 pour le conteneur destinataire et donc reforward sur la venet0

Et si l'on veut que ces trafics sortent de la VM et remontent jusqu'au premier routeur ? Il faut créer une table de routage supplémentaire qui contiendra les routes /32 des conteneurs et indiquer que le trafic entrant depuis eth0 et à destination des conteneurs doit être routé selon les informations contenues dans cette table de routage au lieu de celles contenues dans la table main. La table de routage principale (main) contiendra seulement la route correspondante à l'interface eth0 et la default route.

     Ainsi, un paquet entrant dans la VM par eth0 et à destination d'un conteneur sera forwardé sur la venet0 grâce à la nouvelle table de routage et arrivera dans le conteneur. Quand le conteneur voudra émettre vers l'extérieur ou vers un conteneur sur la même VM, le paquet arrivera depuis la venet, le kernel regardera dans la table main, ne verra plus les routes /32 plus spécifiques et utilisera donc la default route pour forwarder les paquets.

   Comment on met ça en place ?
       - On ajoute une table dans /etc/iproute2/rt_tables (voir : http://shaarli.guiguishow.info/?xT-HMA)

       - On déplace les routes des conteneurs de la table main vers la nouvelle table. ip r d <IP> / ip r a <IP> dev venet0 table <nom_table>

       - On modifie la politique de routage pour que le noyau utilise la nouvelle table seulement pour forwarder les paquets entrants par eth0 : ip rule add iif eth0 table <ma_table>

   Comment on automatise ça ?
       - Si les conteneurs sont statiques aka on n'en ajoute/supprime pas tous les jours : un initscript au boot de la VM, lancé après les conteneurs, qui ip r d toutes les routes /32 connues (à partir d'un fichier texte, par exemple) et les injecte dans la table de routage alternative.
       - Sinon : hooks OpenVZ ($CTID.start, $CTID.stop) qui fait ip r d puis ip r a table <ma_table> de l'IP du conteneur. Ou vps.mount/umount pour travailler en global, sur tous les conteneurs en même temps.
(Permalink)