Désactiver rp_filter sur une interface

9

J'ai un serveur Ubuntu 16.04 qui agit comme un routeur avec plusieurs interfaces (VLAN). Par défaut, rp_filter(filtrage de chemin inverse) est activé pour toutes les interfaces. Je veux que cela reste ainsi, mais faites une exception pour exactement une interface. (Les paquets provenant de cette interface doivent avoir une adresse IP source qui ne correspond à aucune adresse de destination de routage de cette interface.)

Disons que cette interface a le nom ens20.4, son vlan-raw-device est ens20, et l'interface de destination (pour tester le flux de paquets) est nommée ens20.2(bien qu'elle devrait fonctionner pour n'importe quelle interface de destination).

J'ai essayé de définir la rp_filterpropriété pour ens20.4seulement, sans succès:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Donc, à des fins de test, j'ai également désactivé rp_filterle périphérique vlan-raw et l'interface de destination de test:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

Toujours sans succès, les paquets avec une adresse IP source "usurpée" sont toujours abandonnés. Seulement si je désactive rp_filterpour toutes les interfaces, les paquets passer à travers:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

Cependant, je veux toujours conserver le filtrage de chemin inverse pour toutes les autres interfaces - qu'est-ce qui me manque?

Cybran
la source
Des tests supplémentaires ont révélé que le filtrage de chemin inverse est actif si rp_filter est défini sur 1 pour tous ou pour l'interface entrante. Toujours à la recherche d'une réponse définitive ou d'une référence de documentation, que je n'ai pas pu trouver jusqu'à présent.
Cybran

Réponses:

12

Infos ici: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

Notez la dernière phrase qui expliquerait vos tentatives:

La valeur maximale de conf / {all, interface} / rp_filter est utilisée lors de la validation de la source sur {interface}.

Cela devrait donc fonctionner:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Maintenant max (conf / {all, ens20.4} / rp_filter == 0: pas de validation de la source. Vérifiez simplement que les autres interfaces sont toujours protégées.

Vous pouvez également vérifier le rpf "lâche" avec la valeur 2. Dans le cas où le paquet devrait normalement être routé par une autre interface, ce serait mieux que pas de validation.

UN B
la source
2
Merci, ça explique très bien! Un merci spécial pour la suggestion de rpf "lâche", qui est en effet le meilleur choix pour ma configuration. Rend également inutile de mettre all / rp_filter à 0, ce qui est le bienvenu.
Cybran