¿Cuál es la diferencia entre "todos", "predeterminado" y "eth *" en / proc / sys / net / ipv [46] / conf /?

37

En sysctl, las /proc/sys/net/ipv[46]/conf/teclas tienen las siguientes subclaves: all, default, y una clave para cada interfaz de red. Por ejemplo, en una máquina con una única interfaz de red eth0, se verá así:

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 las configuraciones respectivas existen en cada tecla por separado. Por ejemplo, si deseo deshabilitar los anuncios de enrutador IPv6 con el accept_ravalor, este valor existe cuatro veces:

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

Mi pregunta ahora es: ¿cuál de estos valores necesito cambiar? Imaginé all(para cambiar todas las interfaces existentes) y default(para cambiar todas las nuevas interfaces que puedan aparecer más adelante), pero al cambiarlas aún queda el valor en 1 para lo y 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

¿La máquina ahora aceptará anuncios de enrutador en eth0, o no?

Martin von Wittich
fuente
Oh, bueno, encontré la respuesta mientras todavía escribía la pregunta. Lo responderé yo mismo en 7 horas (el sitio no me permitirá hacerlo antes). Hasta entonces, aquí está el enlace: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich
De acuerdo con github.com/torvalds/linux/commit/... lógica rp_filter fue cambiado hace 9 años. Anteriormente fue ANDed y luego cambió a MAX.
odivlad

Respuestas:

37

Encontré la respuesta mientras aún escribía la pregunta. He decidido publicarlo de todos modos porque otros pueden encontrar esto perspicaz y luego responderlo yo mismo; Espero que esto no esté mal visto :)

El usuario Philipp Matthias Hahn en la lista de correo del kernel de Linux lo ha descubierto al 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.

Él no cubre, accept_rapero al menos ahora está claro cómo ally cómo defaultfuncionan, o más bien, cómo no funcionan como esperaba.

Martin von Wittich
fuente
3
y para cosas de IPv6? por ejemplo, estoy buscando el use_tempaddrparámetro ...
mattia.b89
1
La lógica de rp_filter se modificó hace 9 años. Anteriormente fue ANDed y luego cambió a MAX. Consulte "El valor máximo de conf / {all, interface} / rp_filter se usa al validar la fuente en la {interfaz}". en git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… y github.com/torvalds/linux/commit/… (a través de unix.stackexchange.com/a/427455/ 18568 )
Gaia
@Gaia ¡Gran comentario!
Mvorisek
5

El controlador para accept_raen net/ipv6/addrconf.ces proc_dointvec. Entonces, el código genérico de la interfaz ha generado previamente una matriz de allentradas específicas de la interfaz, y escribir en ellas con sysctlo procfs simplemente coloca el valor que especifique en la matriz.

Nos preocupa cómo se usan esos valores

Verá por las personas que llaman la ipv6_accept_ra()función include/net/ipv6.hque cada persona que llama utiliza una interfaz específica para llamar a esa función.

Por lo tanto net.ipv6.conf.all.accept_ra, hasta donde puedo ver, no hay ningún lugar en el núcleo que se use, excepto para almacenar una entrada procfs.

Si desea cambiar accept_racada interfaz con un comando, puede hacer esto:

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

Llego unos 4 años tarde pero esta es la respuesta correcta: P

suprjami
fuente
sysctl (procps versión 3.2.8): error: parámetro desconocido "-aN"
qin