J'ai trouvé la réponse tout en écrivant la question. J'ai décidé de le publier quand même parce que d'autres peuvent trouver cela perspicace, puis y répondre moi-même; J'espère que ce n'est pas mal vu :)
L'utilisateur Philipp Matthias Hahn de 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_ra
mais au moins c'est clair maintenant comment all
et default
fonctionnent, ou plutôt, comment ils ne fonctionnent pas comme je m'y attendais.
Le gestionnaire pour accept_ra
en net/ipv6/addrconf.c
est proc_dointvec
. Ainsi, le code d'interface générique a précédemment généré un tableau de all
et des entrées spécifiques à l'interface, et en y écrivant avec sysctl
ou 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
Vous verrez des appelants de ipv6_accept_ra()
fonction en include/net/ipv6.h
que chaque appelant utilise une interface spécifique pour appeler cette fonction.
Il n'y a donc nulle part dans le noyau que net.ipv6.conf.all.accept_ra
n'est jamais utilisé sauf pour stocker une entrée procfs, pour autant que je sache.
Si vous souhaitez modifier accept_ra
de chaque interface avec une seule commande, vous pouvez faire ceci :
for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
sysctl -w "$TUNABLE=0"
done
J'ai environ 4 ans de retard mais c'est la bonne réponse :P