web-dev-qa-db-ja.com

/ proc / sys / net / ipv [46] / conf /の「all」、「default」、「eth *」の違いは何ですか?

Sysctlでは、/proc/sys/net/ipv[46]/conf/キーには次のサブキーがあります:alldefault、および各ネットワークインターフェースのキー。たとえば、単一のネットワークインターフェイス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でルーターアドバタイズを受け入れるようになりますか、または受け入れませんか?

37

質問を書きながら答えを見つけました。とにかく他の人がこの洞察に満ちていると感じて自分で答える可能性があるので、私はそれをとにかく投稿することにしました。これが眉をひそめられないことを願っています:)

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ですが、少なくともalldefaultがどのように機能するか、つまり、私が期待したように機能しないことは、今では明らかです。

38

_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

6
suprjami