/proc/sys/net/ipv 中的“all”、“default”和“eth*”有什麼區別464646/conf/?
在 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/
所有相應的設置分別存在於每個鍵中。例如,如果我想使用該值禁用 IPv6 路由器廣告,則
accept_ra
該值存在四次: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
in的處理程序net/ipv6/addrconf.c
是proc_dointvec
. 因此,通用介面程式碼之前已經生成了一個特定於介面的條目數組,all
並且使用或 procfs 寫入這些條目sysctl
只是將您指定的值放入數組中。我們關心的是如何使用這些值
您會從
ipv6_accept_ra()
函式的呼叫者那裡看到include/net/ipv6.h
,每個呼叫者都使用特定的介面來呼叫該函式。因此
net.ipv6.conf.all.accept_ra
,據我所知,除了儲存 procfs 條目之外,核心中沒有其他地方可以使用。如果你想
accept_ra
用一個命令改變每個介面,你可以這樣做:for TUNABLE in $(sysctl -aN --pattern "accept_ra$") do sysctl -w "$TUNABLE=0" done
我遲到了大約 4 年,但這是正確的答案:P