Linux

/proc/sys/net/ipv 中的“all”、“default”和“eth*”有什麼區別464646/conf/?

  • January 7, 2022

在 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/

所有相應的設置分別存在於每個鍵中。例如,如果我想使用該值禁用 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_rain的處理程序net/ipv6/addrconf.cproc_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

引用自:https://unix.stackexchange.com/questions/90443