Sysctlでは、/proc/sys/net/ipv[46]/conf/
キーには次のサブキーがあります:all
、default
、および各ネットワークインターフェースのキー。たとえば、単一のネットワークインターフェイスeth0を備えたマシンでは、次のようになります。
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/
それぞれの設定はすべて、各キーに個別に存在します。たとえば、accept_ra
値でIPv6ルーターアドバタイズを無効にしたい場合、この値は4回存在します。
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
私の質問は次のとおりです。これらの値のどれを変更する必要がありますか?私はall
(すべての既存のインターフェースを変更するため)とdefault
(後で表示される可能性のあるすべての新しいインターフェースを変更するため)を計算しましたが、これらを変更しても、loおよびeth0の値は1のままです。
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
マシンはeth0でルーターアドバタイズを受け入れるようになりますか、または受け入れませんか?
質問を書きながら答えを見つけました。とにかく他の人がこの洞察に満ちていると感じて自分で答える可能性があるので、私はそれをとにかく投稿することにしました。これが眉をひそめられないことを願っています:)
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を使用してこれらに書き込むと、指定した値が配列に格納されます。
これらの値がどのように使用されるかを懸念しています
_include/net/ipv6.h
_のipv6_accept_ra()
関数の呼び出し元から、すべての呼び出し元が特定のインターフェイスを使用してその関数を呼び出すことがわかります。
したがって、カーネル内には、procfsエントリを格納する以外に_net.ipv6.conf.all.accept_ra
_が使用される場所はありません。
すべてのインターフェースの_accept_ra
_を1つのコマンドで変更したい場合は、次のようにします。
_for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
sysctl -w "$TUNABLE=0"
done
_
私は約4年遅れていますが、これが正解です:P