Qual é a diferença entre "all", "default" e "eth *" em / proc / sys / net / ipv [46] / conf /?

37

Em sysctl, as /proc/sys/net/ipv[46]/conf/teclas têm as seguintes subchaves: all, defaulte uma chave para cada interface de rede. Por exemplo, em uma máquina com uma única interface de rede eth0, ela será assim:

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/

Todas as configurações respectivas existem em cada tecla separadamente. Por exemplo, se eu quiser desativar os Anúncios de roteador IPv6 com o accept_ravalor, esse valor existe quatro vezes:

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

Minha pergunta agora é: quais desses valores eu preciso alterar? Imaginei all(alterar todas as interfaces existentes) e default(alterar todas as novas interfaces que possam aparecer mais tarde), mas alterar essas ainda deixa o valor em 1 para lo e 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

A máquina agora aceita anúncios de roteador no eth0 ou não?

Martin von Wittich
fonte
Bem, encontrei a resposta enquanto escrevia a pergunta. Eu mesmo responderei em 7 horas (o site não me permitirá fazê-lo antes). Até então aqui está o link: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich
De acordo com github.com/torvalds/linux/commit/…, a lógica do rp_filter foi alterada há 9 anos. Anteriormente, era ANDed e depois alterado para MAX.
odivlad

Respostas:

37

Encontrei a resposta enquanto escrevia a pergunta. Decidi publicá-lo de qualquer maneira, porque outros podem achar isso perspicaz e, em seguida, responda eu mesmo; Espero que isso não seja desaprovado :)

O usuário Philipp Matthias Hahn na lista de discussão do linux-kernel descobriu pelo menos parcialmente :

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.

Ele não cobre, accept_ramas pelo menos agora está claro como alle como defaultfunciona, ou melhor, como eles não funcionam como eu esperava.

Martin von Wittich
fonte
3
e para coisas IPv6? por exemplo, eu estou procurando o use_tempaddrparâmetro ...
mattia.b89
11
A lógica do rp_filter foi alterada há 9 anos. Anteriormente, era ANDed e depois alterado para MAX. Consulte "O valor máximo de conf / {all, interface} / rp_filter é usado ao fazer a validação de origem na {interface}". em git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… e github.com/torvalds/linux/commit/… (via unix.stackexchange.com/a/427455/ 18568 )
Gaia
@Gaia Ótimo comentário!
Mvorisek 12/09
5

O manipulador para accept_rain net/ipv6/addrconf.cé proc_dointvec. Portanto, o código genérico da interface gerou anteriormente uma matriz de allentradas específicas da interface, e escrever nelas com sysctlou procfs apenas coloca o valor que você especificar na matriz.

Estamos preocupados com como esses valores são usados

Você verá pelos chamadores da ipv6_accept_ra()função include/net/ipv6.hque cada chamador usa uma interface específica para chamar essa função.

Portanto, não há nenhum lugar no kernel que net.ipv6.conf.all.accept_raseja usado, exceto para armazenar uma entrada procfs, até onde posso ver.

Se você deseja alterar accept_ratodas as interfaces com um comando, você pode fazer o seguinte:

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

Estou com cerca de 4 anos de atraso, mas esta é a resposta correta: P

suprjami
fonte
sysctl (procps versão 3.2.8): erro: parâmetro desconhecido "-aN"
qin