Quelle est la différence entre «all», «default» et «eth *» dans / proc / sys / net / ipv [46] / conf /?

37

En sysctl, les /proc/sys/net/ipv[46]/conf/touches ont les sous - clés suivantes: all, defaultet une clé pour chaque interface réseau. Par exemple, sur une machine avec une seule interface réseau eth0, cela ressemblera à ceci:

iserv ~ # ll /proc/sys/net/ipv[46]/conf/
/proc/sys/net/ipv4/conf/:
insgesamt 0
dr-xr-xr-x 0 root root 0 12. Sep 23:30 all/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 default/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 eth0/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 lo/

/proc/sys/net/ipv6/conf/:
insgesamt 0
dr-xr-xr-x 0 root root 0 12. Sep 23:30 all/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 default/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 eth0/
dr-xr-xr-x 0 root root 0 12. Sep 23:30 lo/

Tous les paramètres respectifs existent dans chaque touche séparément. Par exemple, si je souhaite désactiver les annonces de routeur IPv6 avec la accept_ravaleur, cette valeur existe quatre fois:

iserv ~ # sysctl -a 2>/dev/null | grep "accept_ra "
net.ipv6.conf.all.accept_ra = 1
net.ipv6.conf.default.accept_ra = 1
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.eth0.accept_ra = 1

Ma question est la suivante: laquelle de ces valeurs dois-je changer? J'ai pensé all(pour changer toutes les interfaces existantes) et default(pour changer toutes les nouvelles interfaces susceptibles d'apparaître plus tard), mais leur modification laisse toujours la valeur à 1 pour lo et eth0:

iserv ~ # sysctl -w net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra = 0
iserv ~ # sysctl -w net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra = 0
iserv ~ # sysctl -a 2>/dev/null | grep "accept_ra "  
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.lo.accept_ra = 1
net.ipv6.conf.eth0.accept_ra = 1

Est-ce que la machine acceptera maintenant les annonces de routeur sur eth0 ou non?

Martin von Wittich
la source
Oh bien, j'ai trouvé la réponse tout en écrivant la question. Je vais y répondre moi-même dans 7 heures (le site ne me permettra pas de le faire plus tôt). En attendant, voici le lien: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich
Selon github.com/torvalds/linux/commit/... logique rp_filter a été changé il y a 9 ans. Auparavant, il était ANDed et que changé en MAX.
odivlad

Réponses:

37

J'ai trouvé la réponse tout en écrivant la question. J'ai quand même décidé de le poster car d'autres personnes pourraient trouver cela intéressant, puis y répondre moi-même. J'espère que ce n'est pas mal vu :)

L'utilisateur Philipp Matthias Hahn sur la liste de diffusion linux-kernel l'a compris au moins partiellement :

As far as I researched for IPv4 some time ago, the "default" value gets
copied to newly created interfaces only once.
"all" on the other hand allways gets applied in addition to the current
setting, but it depends on the exact setting, if its ORed, ANDed, or
whatevered:
    log_martians         OR
    accept_redirects     AND
    forwarding           ?
    mc_forwarding        AND
    medium_id
    proxy_arp            OR
    shared_media         OR
    secure_redirects     OR
    send_redirects       OR
    bootp_relay          AND
    accept_source_route  AND
    rp_filter            AND
    arp_filter           OR
    arp_announce         MAX
    arp_ignore           MAX
    arp_accept
    app_solicit
    disable_policy
    disable_xfrm
    tag
(see include/linux/inetdevice.h:83 for IN_DEV_{AND,OR,MAX}CONF)

Putting a new value in "all" doesn't change the value you read from
"$interface", but it only gets computed and used internally.

Il ne couvre pas accept_ramais au moins, il est maintenant clair comment allet qui defaultfonctionnent, ou plutôt comment ils ne fonctionnent pas comme je l'aurais prévu.

Martin von Wittich
la source
3
et pour les trucs IPv6? par exemple, je cherche le use_tempaddrparamètre ...
mattia.b89
1
La logique de rp_filter a été modifiée il y a 9 ans. Auparavant, il était ANDed et que changé en MAX. Voir "La valeur maximale de conf / {all, interface} / rp_filter est utilisée lors de la validation de la source sur {interface}." dans git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… et github.com/torvalds/linux/commit/… (via unix.stackexchange.com/a/427455/ 18568 )
Gaia
@ Gaia Excellent commentaire!
Mvorisek le
5

Le gestionnaire pour accept_rain net/ipv6/addrconf.cest proc_dointvec. Ainsi, le code d'interface générique a précédemment généré un tableau d' allentrées et d'interfaces spécifiques, et l'écriture dans celles-ci avec sysctlou procfs place simplement la valeur que vous spécifiez dans le tableau.

Nous sommes préoccupés par la façon dont ces valeurs sont ensuite utilisées

Les appelants de ipv6_accept_ra()fonction verront include/net/ipv6.hque chaque appelant utilise une interface spécifique pour appeler cette fonction.

Autant net.ipv6.conf.all.accept_raque je sache, le noyau n’est utilisé que pour stocker une entrée procfs.

Si vous souhaitez modifier accept_rachaque interface avec une seule commande, vous pouvez procéder comme suit:

for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
    sysctl -w "$TUNABLE=0"
done

J'ai environ 4 ans de retard, mais voici la réponse correcte: P

suprjami
la source
sysctl (procps Version 3.2.8): Erreur: paramètre inconnu "-ân"
qin