![/proc/sys/net/ipv[46]/conf/ の「all」、「default」、「eth*」の違いは何ですか?](https://linux33.com/image/46373/%2Fproc%2Fsys%2Fnet%2Fipv%5B46%5D%2Fconf%2F%20%E3%81%AE%E3%80%8Call%E3%80%8D%E3%80%81%E3%80%8Cdefault%E3%80%8D%E3%80%81%E3%80%8Ceth*%E3%80%8D%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
sysctlでは、これらのキーには各ネットワークインタフェースのキーと呼ばれるサブキーがあります/proc/sys/net/ipv[46]/conf/
。たとえば、単一のネットワークインターフェイスであるeth0を持つコンピュータでは、次のようになります。all
default
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でルーター広告を受け入れますか?
答え1
質問を書いて答えを見つけました。とにかく、他の人がこの内容を洞察力を持って見て直接答えることもできるので、投稿することにしました。
この問題は、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
それとも彼らが私が期待したように動作しないのかを明らかにしています。
答え2
多くのGoogleの検索結果がここを指しており、インターネットにはこれについての古くて間違った情報がたくさんあるため、この質問に対する新しい回答を提供しようとしています。
net.ipv{4,6}.conf.default.*
@ Martin von Wittichの動作の正確さは、default
新しいインターフェースにのみ適用されます。ホストインターフェイスの場合、default
このデバイスは新しいデバイスを作成するときにのみ適用されます。所有者伝統的に、インターフェイスは起動時にのみ生成されます。したがって、パラメータのみを変更すると、default
その値は次に適用されません。所有者ホストが再起動されるまでインタフェースします。
違う振る舞いコンテナ、クーバーネティス、CNI。新しいコンテナインタフェースが常に作成されます。したがって、パラメータのみを変更すると、default
新しいコンテナで作成された新しいインターフェイスに適用されますが、既存のコンテナインターフェイスまたはホストインターフェイスには適用されません。これは非常に混乱する可能性があります!
net.ipv{4,6}.conf.all.*
そしてnet.ipv{4,6}.conf.<net device>.*
@gaiaと@odivladが指摘したように、の動作はnet.ipv{4,6}.conf.all.*
変更されるパラメータによって異なります。実際の答えはカーネル文書にあり、時間の経過とともに変わりました(同様にrp_filter
マルチホームシステムで広く使用されているパラメータです)。上記のMartinの答えは正しいですが、今は時代遅れです。
この機能の動作は、次の場所で見つけることができるカーネル文書に文書化されています。https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txtまたはhttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/Documentation/networking/ip-sysctl.txt?h=linux-4.15.y (右上の特定のカーネルバージョンを選択してください)。
たとえば、値rp_filter
最大化する(前述のようにAND演算ではありません):
The max value from conf/{all,interface}/rp_filter is used
when doing source validation on the {interface}.
arp_filter
、一方、はいまたは動作:
arp_filter for the interface will be enabled if at least one of
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise
しかし、約accept_ra
?素晴らしい、カーネル 4.15 ドキュメントこの場合、動作は指定されておらず、実際にはインターフェイスごとにIIRCでは許可されなくなりました。以前は、カーネル2.6(CentOS 6など)で許可されました。
答え3
accept_ra
in のハンドラはnet/ipv6/addrconf.c
ですproc_dointvec
。したがって、通常のインターフェースコードは以前にall
インターフェース固有の項目の配列を生成していました。または、sysctl
procfsを使用してその項目を作成すると、単に指定した値を配列に入れます。
私たちが興味を持っているのは、これらの値をどのように使用するかです。
ipv6_accept_ra()
include/net/ipv6.h
各呼び出し側が特定のインタフェースを使用して関数を呼び出すことを関数呼び出し側から確認できます。
net.ipv6.conf.all.accept_ra
したがって、私が知っている限り、procfsエントリを保存する以外に、カーネルの他の場所では使用されません。
1 つのコマンドで各インターフェイスを変更するには、accept_ra
次の操作を行います。
for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
sysctl -w "$TUNABLE=0"
done
4年ほど遅れましたが、これは正解です:P