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


37

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でルーターアドバタイズメントを受け入れるようになりますか?


まあ、質問を書いている間に答えを見つけました。私は7時間以内に自分で回答します(このサイトではすぐに回答できません)。それまでのリンクはこちらです:marc.info/?l
マーティン・フォン・

github.com/torvalds/linux/commit/…によると、rp_filterロジックは9年前に変更されました。以前はAND処理され、MAXに変更されました。
odivlad

回答:


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思っていたとして、彼らは仕事をしませんか、仕事、というか。


3
そして、IPv6のもののために?例えば私が探しているuse_tempaddrパラメータ...
mattia.b89

1
rp_filterロジックは9年前に変更されました。以前はAND処理され、MAXに変更されました。「{interface}でソースの検証を行うときに、conf / {all、interface} / rp_filterの最大値が使用される」を参照してください。中git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/...github.com/torvalds/linux/commit/...(経由unix.stackexchange.com/a/427455/ 18568
ガイア

@Gaiaすばらしいコメント!
ムヴォリセク

5

accept_rain のハンドラnet/ipv6/addrconf.cproc_dointvecです。そのため、汎用インターフェイスコードは以前にallインターフェイス固有のエントリの配列を生成しており、これらへの書き込みsysctlやprocfsは、指定した値を配列に入れるだけです。

これらの値がどのように使用されるかが心配です

ipv6_accept_ra()関数のinclude/net/ipv6.h呼び出し元から見ると、すべての呼び出し元が特定のインターフェイスを使用してその関数を呼び出していることがわかります。

ですからnet.ipv6.conf.all.accept_ra、私が見る限り、カーネルにはprocfsエントリを保存する以外に使用される場所はありません。

accept_ra1つのコマンドですべてのインターフェイスを変更する場合は、次の操作を実行できます。

for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
    sysctl -w "$TUNABLE=0"
done

私は約4年遅れていますが、これは正しい答えです:P


sysctl(procpsのバージョン3.2.8):エラー:不明なパラメータ"-aN"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.