Jaka jest różnica między „all”, „default” i „eth *” w / proc / sys / net / ipv [46] / conf /?


37

W sysctl, że /proc/sys/net/ipv[46]/conf/klawisze mają następujące podklucze: all, default, a kluczowy dla każdego interfejsu sieciowego. Na przykład na komputerze z jednym interfejsem sieciowym eth0 będzie wyglądać następująco:

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/

Wszystkie odpowiednie ustawienia istnieją w każdym kluczu osobno. Na przykład, jeśli chcę wyłączyć reklamy routera IPv6 z tą accept_rawartością, ta wartość istnieje cztery razy:

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

Moje pytanie brzmi: które z tych wartości muszę zmienić? Pomyślałem all(aby zmienić wszystkie istniejące interfejsy) i default(aby zmienić wszystkie nowe interfejsy, które mogą pojawić się później), ale ich zmiana nadal pozostawia wartość 1 dla lo i 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

Czy urządzenie będzie teraz akceptować Reklamy routera na eth0, czy nie?


No cóż, znalazłem odpowiedź, pisząc pytanie. Odpowiem sam za 7 godzin (strona nie pozwoli mi na to wcześniej). Do tego czasu oto link: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich

Według github.com/torvalds/linux/commit/... logikę rp_filter zmieniono 9 lat temu. Wcześniej był AND i następnie zmieniany na MAX.
odivlad

Odpowiedzi:


37

Znalazłem odpowiedź, pisząc pytanie. Postanowiłem opublikować to mimo wszystko, ponieważ inni mogą uznać to za wnikliwe, a następnie odpowiem samemu; Mam nadzieję, że nie jest to rozczarowane :)

Użytkownik Philipp Matthias Hahn na liście mailingowej jądra systemu Linux odkrył to przynajmniej częściowo :

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.

Nie obejmuje, accept_raale przynajmniej teraz jest jasne, jak alli jak defaultdziałają, a raczej, jak nie działają tak, jak bym się spodziewał.


3
a dla IPv6? np. szukam use_tempaddrparametru ...
mattia.b89

1
Logika rp_filter została zmieniona 9 lat temu. Wcześniej był AND i następnie zmieniany na MAX. Zobacz „Maksymalna wartość z conf / {all, interface} / rp_filter jest używana podczas sprawdzania źródła na {interface}.” w git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… i github.com/torvalds/linux/commit/… (przez unix.stackexchange.com/a/427455/ 18568 )
Gaia,

@Gaia Świetny komentarz!
Mvorisek

5

Program obsługi dla accept_rain net/ipv6/addrconf.cjest proc_dointvec. Tak więc ogólny kod interfejsu wcześniej wygenerował tablicę alli wpisy specyficzne dla interfejsu, a zapisanie ich za pomocą sysctllub procfs po prostu umieszcza wartość podaną w tablicy.

Obawiamy się, w jaki sposób te wartości są następnie wykorzystywane

Od osób wywołujących ipv6_accept_ra()funkcję zobaczysz, include/net/ipv6.hże każdy dzwoniący używa określonego interfejsu do wywołania tej funkcji.

Tak więc net.ipv6.conf.all.accept_ra, o ile widzę, w jądrze nie ma miejsca, w którym kiedykolwiek byłby używany, poza przechowywaniem wpisu procfs.

Jeśli chcesz zmienić accept_rakażdy interfejs za pomocą jednego polecenia, możesz to zrobić:

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

Spóźniłem się około 4 lat, ale to poprawna odpowiedź: P.


sysctl (wersja procps 3.2.8): błąd: Nieznany parametr „-aN”
qin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.