sysctl: / proc / sys / net / ipv / conf /: quelle est la différence entre "all", "default" et "eth *"?

Dans sysctl, les sous /proc/sys/net/ipv[46]/conf/ keys /proc/sys/net/ipv[46]/conf/ keys ont les sous-keys suivantes: all , default , et une key pour chaque interface réseau. Par exemple, sur une machine avec une seule interface réseau eth0, il 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 parameters respectifs existent dans chaque key séparément. Par exemple, si je veux désactiver les publicités de routeur IPv6 avec la valeur accept_ra , 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 maintenant: laquelle de ces valeurs dois-je changer? Je pensais all (pour changer toutes les interfaces existantes) et default (pour changer toutes les nouvelles interfaces qui peuvent apparaître plus tard), mais en changeant cela laisse 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 

La machine acceptera-t-elle maintenant les publicités routières sur eth0, ou ne le fera-t-elle pas?

J'ai trouvé la réponse en écrivant toujours la question. J'ai décidé de le postr de toute façon parce que d'autres peuvent find cela perspicace, et puis y répondre moi-même; J'espère que ce n'est pas mal vu 🙂

L'user Philipp Matthias Hahn sur la list de diffusion linux-kernel l'a compris au less partiellement :

 As far as I researched for IPv4 some time ago, the "default" value gets copyd 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 less, il est clair maintenant comment all et default travail default , ou plutôt, comment ils ne fonctionnent pas comme je l'aurais prévu.

Le gestionnaire pour accept_ra dans net/ipv6/addrconf.c est proc_dointvec . Ainsi, le code d'interface générique a déjà généré un tableau de all les inputs spécifiques à l'interface et l'écriture dans celles-ci avec sysctl ou procfs ne fait que mettre la valeur que vous spécifiez dans le tableau.

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

Vous verrez des appels de la fonction ipv6_accept_ra() dans 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 kernel que net.ipv6.conf.all.accept_ra est utilisé sauf pour stocker une input procfs, pour autant que je puisse voir.

Si vous voulez changer accept_ra de chaque interface avec une command, vous pouvez le faire:

 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