Hola l’autre, comment il me traite ! Si on ne peut plus se laisser aller à un peu d’immodestie…
Comme promis, voici des explications sur rp_filter (reverse path filtering).
Le reverse path filtering est une fonctionnalité optionnelle qui fait partie de la validation d’adresse source des paquets IPv4 reçus, utilisée pour lutter contre l’usurpation d’adresse source (IP spoofing). Cette vérification a lieu au cours de la décision de routage d’entrée après les chaînes PREROUTING et avant les chaînes INPUT ou FORWARD d’iptables. Il y a deux modes, “strict” et “loose” (lâche) définis dans RFC3704.
Le principe de base est simple : on prend l’adresse source du paquet reçu et on regarde par quelle interface cette adresse serait routée si on devait répondre au paquet. Si l’interface correspond à l’interface d’entrée du paquet (en mode strict) ou simplement existe (en mode loose), alors le paquet peut continuer son chemin. Sinon il est écarté.
Le reverse path filtering en mode strict fonctionne bien dans une configuration de routage classique (basé seulement sur la destination) et symétrique (les deux direction d’une communication avec une adresse donnée passent par la même interface). Dans une configuration de routage avancé, où le routage est basé sur d’autres données que la destination, ou asymétrique, le reverse path filtering peut bloquer des paquets légitimes, car l’interface qui reçoit le trafic est différente de l’interface de sortie “par défaut” (sans routage avancé). Des améliorations sont censées prendre en compte le routage avancé, mais ce n’est pas très clair.
Comme la plupart des paramètres du noyau dans net.ipv4.conf, la valeur fonctionnelle pour une interface ${interface} est le résultat d’une combinaison logique ou arithmétique entre les valeurs de net.ipv4.conf.${interface}.rp_filter et net.ipv4.conf.all.rp_filter. La valeur par défaut de net.ipv4.conf.${interface}.rp_filter est la valeur de net.ipv4.conf.default.rp_filter quand l’interface ${interface} est créée. Dans Debian, des valeurs initiales peuvent être fixées dans le fichier /etc/sysctl.conf.
Pour compliquer le tout, le fonctionnement du reverse path filtering a évolué avec les versions du noyau. Historique :
avant 2.6.30
- rp_filter est un booléen avec 1=activé (strict) et 0=désactivé
- combinaison “et logique” entre all et interface
2.6.30
- rp_filter devient un entier avec 0=désactivé, 1=strict et 2=loose
- mise à jour de ip-sysctl.txt pour refléter le changement
2.6.31
- changement de de combinaison en “max” entre all et interface
2.6.32
- utilisation du routage avancé par marque pour le reverse path filtering (à préciser)
2.6.33
- mise à jour de ip-sysctl.txt pour refléter le changement de logique en 2.6.31
Le changement le plus notable est qu’avant le noyau 2.6.30 net.ipv4.conf.all.rp_filter=1 est une condition nécessaire (mais pas suffisante) pour activer le reverse path filtering sur une interface, et donc net.ipv4.conf.all.rp_filter=0 est une condition suffisante pour le désactiver sur toutes les interfaces. A partir du noyau 2.6.30, net.ipv4.conf.all.rp_filter=1 devient une condition suffisante pour l’activer sur toutes les interfaces, et net.ipv4.conf.all.rp_filter=0 est une condition nécessaire (mais plus suffisante) pour le désactiver sur une interface. Une installation peut donc se retrouver avec le reverse path filtering involontairement activé sur toutes les interfaces après une mise à jour du noyau, par exemple lors du passage de Lenny à Squeeze.
En conclusion je n’ai en fait pas grand mérite à avoir identifié le problème car d’expérience c’est la cause la plus fréquence de dysfonctionnement du routage avancé. Cette particularité devrait à mon avis figurer en gros dans le T&A.