В чем разница между «все», «по умолчанию» и «eth *» в / proc / sys / net / ipv [46] / conf /?

37

В 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(чтобы изменить все новые интерфейсы, которые могут появиться позже), но изменение их все равно оставляет значение 1 для lo и eth0:

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

Будет ли машина теперь принимать Router Advertisements на eth0 или нет?

Мартин фон Виттих
источник
О, хорошо, я нашел ответ, пока писал вопрос. Я отвечу на это сам через 7 часов (сайт не позволит мне сделать это раньше). А до тех пор вот ссылка: marc.info/?l=linux-kernel&m=123606366021995&w=2
Мартин фон Виттих
Согласно github.com/torvalds/linux/commit/… rp_filter логика была изменена 9 лет назад. Ранее это было ANDed, а затем изменилось на MAX.
odivlad

Ответы:

37

Я нашел ответ, пока писал вопрос. В любом случае я решил опубликовать это, потому что другие могут найти это проницательным, а затем ответить на него сам; Я надеюсь, что это не осуждается :)

Пользователь Philipp Matthias Hahn из списка рассылки linux-kernel понял это хотя бы частично :

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работают, точнее, как они работают не так, как я ожидал.

Мартин фон Виттих
источник
3
а для IPv6 материал? например, я ищу use_tempaddrпараметр ...
mattia.b89
1
Логика rp_filter была изменена 9 лет назад. Ранее это было ANDed, а затем изменилось на MAX. См. «Максимальное значение из conf / {all, interface} / rp_filter используется при выполнении проверки исходного кода на {interface}». в 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_raв net/ipv6/addrconf.cесть proc_dointvec. Таким образом, общий интерфейсный код ранее генерировал массив allи специфичные для интерфейса записи, и запись в них с помощью sysctlили procfs просто помещает значение, указанное вами в массив.

Мы обеспокоены тем, как эти значения затем используются

Из вызывающих 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

suprjami
источник
sysctl (procps версии 3.2.8): ошибка: неизвестный параметр "-aN"
Цинь