Qual è la differenza tra “all”, “default” e “eth *” in / proc / sys / net / ipv [46] / conf /?


37

In sysctl, i /proc/sys/net/ipv[46]/conf/tasti hanno le seguenti sottochiavi: all, defaulte una chiave per ogni interfaccia di rete. Ad esempio, su una macchina con un'unica interfaccia di rete eth0, sarà simile al seguente:

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/

Tutte le rispettive impostazioni esistono in ciascun tasto separatamente. Ad esempio, se desidero disabilitare gli annunci router IPv6 con il accept_ravalore, questo valore esiste quattro volte:

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

La mia domanda ora è: quale di questi valori devo cambiare? Ho pensato all(per cambiare tutte le interfacce esistenti) e default(per cambiare tutte le nuove interfacce che potrebbero apparire in seguito), ma cambiarle lascia comunque il valore a 1 per 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

La macchina ora accetterà gli annunci router su eth0 o no?


Oh bene, ho trovato la risposta mentre ancora scrivevo la domanda. Risponderò io stesso entro 7 ore (il sito non mi permetterà di farlo prima). Fino ad allora ecco il link: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich,

Secondo github.com/torvalds/linux/commit/… rp_filter la logica è stata cambiata 9 anni fa. In precedenza era ANDed e poi cambiato in MAX.
odivlad

Risposte:


37

Ho trovato la risposta mentre scrivo ancora la domanda. Ho deciso di pubblicarlo comunque perché altri potrebbero trovarlo perspicace e quindi rispondere da solo; Spero che questo non sia disapprovato :)

L'utente Philipp Matthias Hahn sulla mailing list del kernel Linux l'ha capito almeno in parte :

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.

Non tratta accept_rama almeno adesso è chiaro come alle come defaultfunzionano, o meglio, come non funzionano come mi sarei aspettato.


3
e per roba IPv6? ad es. sto cercando il use_tempaddrparametro ...
mattia.b89,

1
La logica di rp_filter è stata modificata 9 anni fa. In precedenza era ANDed e poi cambiato in MAX. Vedere "Il valore massimo di conf / {all, interface} / rp_filter viene utilizzato quando si esegue la convalida del codice sorgente {interfaccia}." in git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… e github.com/torvalds/linux/commit/… (tramite unix.stackexchange.com/a/427455/ 18568 )
Gaia,

@Gaia Ottimo commento!
Mvorisek,

5

Il gestore per accept_rain net/ipv6/addrconf.cè proc_dointvec. Quindi il codice di interfaccia generico ha precedentemente generato una matrice di allvoci specifiche dell'interfaccia e la scrittura in queste con sysctlo procfs mette semplicemente il valore specificato nella matrice.

Siamo preoccupati di come questi valori vengono quindi utilizzati

Dai chiamanti della ipv6_accept_ra()funzione vedrai include/net/ipv6.hche ogni chiamante utilizza un'interfaccia specifica per chiamare quella funzione.

Quindi nel kernel non net.ipv6.conf.all.accept_raè mai stato usato da nessuna parte se non per memorizzare una voce procfs, per quanto posso vedere.

Se vuoi cambiare accept_raogni interfaccia con un solo comando, puoi fare questo:

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

Sono in ritardo di circa 4 anni ma questa è la risposta corretta: P


sysctl (procps versione 3.2.8): errore: parametro sconosciuto "-aN"
qin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.