まだ質問を書いている間に答えを見つけました。とにかく投稿することにしました。他の人がこれを洞察に満ちていると思うかもしれないので、自分で答えてください。これが嫌われないことを願っています:)
linux-kernel メーリング リストのユーザー Philipp Matthias Hahn は、少なくとも部分的にそれを理解しました:
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.
彼は accept_ra
をカバーしていません しかし、少なくとも all
が と default
私が期待していたように、彼らがどのように機能しないのか.
accept_ra
のハンドラー net/ipv6/addrconf.c
で proc_dointvec
です .そのため、ジェネリック インターフェイス コードは以前に all
の配列を生成しました。 およびインターフェイス固有のエントリ、および sysctl
を使用してこれらに書き込む または procfs は、指定した値を配列に入れるだけです。
それらの値が次にどのように使用されるかが重要です
ipv6_accept_ra()
の呼び出し元からわかります include/net/ipv6.h
の関数 すべての呼び出し元が特定のインターフェイスを使用してその関数を呼び出すこと。
したがって、カーネルには net.ipv6.conf.all.accept_ra
という場所はありません 私が見る限り、procfs エントリを保存する以外に使用されたことはありません。
accept_ra
を変更したい場合 1 つのコマンドですべてのインターフェースを管理するには、次のようにします:
for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
sysctl -w "$TUNABLE=0"
done
私は約4年遅れていますが、これが正解です:P