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

33

No sysctl, as chaves /proc/sys/net/ipv[46]/conf/ têm as seguintes subchaves: all , default e uma chave para cada interface de rede. Por exemplo, em uma máquina com uma única interface de rede eth0, ela ficará 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 chave separadamente. Por exemplo, se eu quiser desativar os anúncios do roteador IPv6 com o valor accept_ra , 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? Eu figurei all (para alterar todas as interfaces existentes) e default (para alterar todas as novas interfaces que podem aparecer depois), mas alterá-las 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?

    
por Martin von Wittich 12.09.2013 / 23:47

3 respostas

32

Encontrei a resposta enquanto continuava escrevendo a pergunta. Eu decidi publicá-lo de qualquer maneira porque os outros podem achar isto perspicaz, e então responder eu mesmo; Espero que isso não seja desaprovado:)

O usuário Philipp Matthias Hahn na lista de discussão 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_ra , mas pelo menos está claro como all e default funcionam, ou melhor, como eles não funcionam como eu esperava.

    
por 13.09.2013 / 21:50
5

O manipulador para accept_ra em net/ipv6/addrconf.c é proc_dointvec . Portanto, o código da interface genérica gerou anteriormente uma matriz de all e entradas específicas da interface, e gravá-las com sysctl ou procfs apenas coloca o valor especificado na matriz.

Estamos preocupados com a forma como esses valores são usados

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

Portanto, não há nada no kernel que net.ipv6.conf.all.accept_ra seja usado, exceto para armazenar uma entrada procfs, até onde eu possa ver.

Se você quiser alterar accept_ra de cada interface com um comando, poderá fazer isso:

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

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

    
por 24.03.2017 / 08:19
1

De acordo com o link , a lógica do rp_filter foi alterada há 9 anos. Anteriormente, era ANDed e depois alterado para MAX.

    
por 01.03.2018 / 13:21