Table of Contents

Problème de configuration de deux cartes réseau sur différents sous-réseaux

Lorsque RHEL a plusieurs adresses IP configurées, une seule est accessible à partir d'un réseau distant

Problèmes

Résolution

Définir la valeur du paramètre ajustable du noyau net.ipv4.conf.all.rp_filter sur 2 :

sysctl -w net.ipv4.conf.all.rp_filter=2

Pour rendre cette modification persistante lors des redémarrages, ajouter le paramètre réglable au fichier /etc/sysctl.conf.

Cause première

RHEL 6 et supérieur sont configurés par défaut pour appliquer le filtrage Strict Reverse Path Forwarding recommandé dans RFC 3704 - Ingress Filtering for Multihomed Networks.

Le filtrage strict signifie que lorsqu'un paquet arrive sur le système, le noyau prend l'adresse IP source du paquet et effectue une recherche dans sa table de routage pour voir si l'interface sur laquelle le paquet est arrivé est la même interface que le noyau utiliserait pour envoyer un paquet. à cette IP. Si les interfaces sont identiques, le paquet a réussi le test de filtrage strict et il est traité normalement. Si les interfaces ne sont pas les mêmes, le paquet est rejeté sans autre traitement et dans RHEL 7+, le compteur IPReversePathFilter est incrémenté.

L'effet principal d'un filtrage strict est que pour une IP distante donnée, le système ne communiquera avec elle que via une interface spécifique. Configurez des routes statiques pour contrôler quelle interface répond à une adresse IP ou à un réseau distant donné.

La méthode de filtrage est contrôlée globalement par le sysctl net.ipv4.conf.all.rp_filter décrit dans la documentation du noyau : https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt. RHEL 6+ remplace la valeur par défaut du noyau de 0 (désactivé) pour ce paramètre et la définit sur 1 (strict).

Options de rp_filter

La pratique actuellement recommandée dans la RFC3704 consiste à activer le mode strict pour empêcher l'usurpation d'adresse IP par les attaques DDos. Si vous utilisez un routage asymétrique ou tout autre routage compliqué, le mode lâche est recommandé.

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

La valeur par défaut est 0. Notez que certaines distributions l'activent dans les scripts de démarrage.

Le moyen le plus simple de désactiver la vérification stricte consiste à définir le sysctl net.ipv4.conf.all.rp_filter sur 2 (lâche) car cela remplacera les paramètres spécifiques à l'interface. Définir net.ipv4.conf.all.rp_filter sur 0 (désactivé) ne remplace pas les paramètres spécifiques à l'interface, il n'est donc pas recommandé.

Sans la vérification stricte, le système peut répondre à un paquet via une interface différente de celle sur laquelle il est arrivé. Que cela se traduise par la connectivité attendue dépend de nombreux facteurs externes au système, tels que la topologie du réseau physique et les politiques de pare-feu.

Une autre façon de configurer un système pour qu'il fonctionne avec rp_filter en mode strict consiste à configurer un routage basé sur une politique.

Dans RHEL 5 et versions antérieures, le noyau ne prenait pas en charge le filtrage strict. Ainsi, dans ces anciennes versions, le paramètre net.ipv4.conf.all.rp_filter n'a que deux valeurs possibles, 0 (désactivé) et 1 (libre). La valeur par défaut est 1 (libre).

Diagnostiques

Vérifier la valeur des sysctls rp_filter:

sysctl -a 2>/dev/null | grep "\.rp_filter"

     net.ipv4.conf.all.rp_filter = 1
     net.ipv4.conf.default.rp_filter = 0
     net.ipv4.conf.enp0s31f6.rp_filter = 0
     net.ipv4.conf.lo.rp_filter = 0
     net.ipv4.conf.tun0.rp_filter = 0
     net.ipv4.conf.virbr0.rp_filter = 0
     net.ipv4.conf.virbr0-nic.rp_filter = 0
     net.ipv4.conf.virbr1.rp_filter = 0
     net.ipv4.conf.virbr1-nic.rp_filter = 0
     net.ipv4.conf.wlp58s0.rp_filter = 0

Pour RHEL 7 et versions ultérieures, vérifier le compteur SNMP IPReversePathFilter. Si des paquets sont ignorés en raison d'un filtrage strict, ce compteur s'incrémentera à chaque fois que cela se produit :

nstat-rsz | grep IPReversePathFilter

     TcpExtIPReversePathFilter 52537 0.0
netstat -s | grep IPReversePathFilter

     IPReversePathFilter : 52537

Pour une adresse IP distante donnée dont les paquets semblent être ignorés par le système, effectuer une recherche de route pour voir quelle interface le système utilisera pour atteindre cette adresse IP distante. S'il ne s'agit pas de la même interface sur laquelle les paquets de l'IP distant arrivent, l'application stricte les rejettera :

ip route get <remote IP>