/ 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路由器广告” ,则该值存在四次:

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=linux
kernel&m

github.com/torvalds/linux/commit/... rp_filter逻辑9年前发生了变化。以前,它已进行AND运算,然后更改为MAX。
odivlad

Answers:


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 '16

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很棒的评论!
Mvorisek

5

accept_rain 的处理程序net/ipv6/addrconf.cproc_dointvec。因此,通用接口代码以前已经生成了all特定于接口的条目的数组,并使用sysctlorprocs 写入这些条目只是将您指定的值放入数组中。

我们关心如何使用这些值

您会从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


的sysctl(procps的版本3.2.8):错误:未知参数“-an”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.