Яка різниця між "усі", "за замовчуванням" та "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

Чи тепер машина прийме рекламу маршрутизаторів на eth0, чи ні?


Ну добре, я знайшов відповідь, поки писав запитання. Я відповім на це самостійно через 7 годин (сайт не дозволить мені зробити це раніше). До цього часу тут посилання: marc.info/?l=linux-kernel&m=123606366021995&w=2
Мартін фон

Згідно з github.com/torvalds/linux/commit/… логіка rp_filter була змінена 9 років тому. Раніше він був ANDed, а потім змінений на MAX.
odivlad

Відповіді:


37

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

Користувач Філіп Маттіас Хан у списку розсилки linux-ядра з'ясував це принаймні частково :

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 використовується під час перевірки джерела на {інтерфейс}." в 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_rain net/ipv6/addrconf.cє proc_dointvec. Таким чином, загальний код інтерфейсу раніше генерував масив allта специфічні для інтерфейсу записи, а введення в них за допомогою sysctlабо procfs просто додає вказане значення в масив.

Ми стурбовані тим, як потім використовуються ці значення

З боку абонентів ipv6_accept_ra()функції ви побачите, include/net/ipv6.hщо кожен абонент використовує певний інтерфейс для виклику цієї функції.

Тому ядро ​​ніде net.ipv6.conf.all.accept_raне використовується, окрім як зберігати запис profs, наскільки я бачу.

Якщо ви хочете змінити accept_raкожен інтерфейс за допомогою однієї команди, ви можете зробити це:

for TUNABLE in $(sysctl -aN --pattern "accept_ra$")
do
    sysctl -w "$TUNABLE=0"
done

Мені запізнюється на 4 роки, але це правильна відповідь: P


sysctl (версія версія 3.2.8): помилка: невідомий параметр "-aN"
qin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.