Was ist der Unterschied zwischen "all", "default" und "eth *" in / proc / sys / net / ipv [46] / conf /?

37

In Sysctl, die /proc/sys/net/ipv[46]/conf/haben Schlüssel die folgenden Unterschlüssel: all, defaultund ein Schlüssel für jede Netzwerk - Schnittstelle. Auf einem Computer mit einer einzelnen Netzwerkschnittstelle eth0 sieht dies beispielsweise folgendermaßen aus:

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/

Alle entsprechenden Einstellungen sind in jeder Taste separat vorhanden. Wenn ich beispielsweise IPv6-Routerankündigungen mit dem accept_raWert deaktivieren möchte , ist dieser Wert viermal vorhanden:

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

Meine Frage ist nun: Welche dieser Werte muss ich ändern? Ich dachte all(um alle vorhandenen Schnittstellen zu ändern) und default(um alle neuen Schnittstellen zu ändern, die später erscheinen könnten), aber wenn ich diese ändere, bleibt der Wert für lo und eth0 weiterhin bei 1:

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

Akzeptiert das Gerät jetzt Router Advertisements auf eth0 oder nicht?

Martin von Wittich
quelle
Na ja, ich habe die Antwort gefunden, während ich die Frage noch schreibe. Ich werde es in 7 Stunden selbst beantworten (die Seite erlaubt mir das nicht früher). Bis dahin ist hier der Link: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich
Laut github.com/torvalds/linux/commit/… wurde die rp_filter-Logik vor 9 Jahren geändert. Zuvor wurde es mit AND verknüpft und dann in MAX geändert.
Odivlad

Antworten:

37

Ich habe die Antwort gefunden, während ich die Frage schreibe. Ich habe beschlossen, es trotzdem zu posten, weil andere dies vielleicht aufschlussreich finden und es dann selbst beantworten. Ich hoffe das ist nicht verpönt :)

Der Benutzer Philipp Matthias Hahn auf der Mailingliste des Linux-Kernels hat es zumindest teilweise herausgefunden :

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.

Er deckt nicht ab, accept_raaber es ist zumindest jetzt klar, wie allund defaultbesser gesagt, wie sie nicht so funktionieren, wie ich es erwartet hätte.

Martin von Wittich
quelle
3
und für IPv6-Sachen? zB suche ich nach dem use_tempaddrParameter ...
mattia.b89
1
rp_filter logic wurde vor 9 Jahren geändert. Zuvor wurde es mit AND verknüpft und dann in MAX geändert. Siehe "Der Maximalwert von conf / {all, interface} / rp_filter wird verwendet, wenn die Quellvalidierung auf dem {interface} durchgeführt wird." in git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… und github.com/torvalds/linux/commit/… (über unix.stackexchange.com/a/427455/ 18568 )
Gaia
@ Gaia Großartiger Kommentar!
Mvorisek,
5

Der Handler für accept_rain net/ipv6/addrconf.cist proc_dointvec. Aus diesem Grund hat generischer Schnittstellencode zuvor ein Array mit allund schnittstellenspezifischen Einträgen generiert. sysctlWenn Sie mit oder procfs in diese Einträge schreiben, wird nur der von Ihnen im Array angegebene Wert eingefügt.

Es geht uns darum, wie diese Werte dann verwendet werden

Sie werden von ipv6_accept_ra()Funktionsaufrufern feststellen, include/net/ipv6.hdass jeder Aufrufer eine bestimmte Schnittstelle verwendet, um diese Funktion aufzurufen.

Es gibt also nirgendwo im Kernel, der net.ipv6.conf.all.accept_rajemals verwendet wird, außer um einen procfs-Eintrag zu speichern, soweit ich das sehe.

Wenn Sie accept_rajede Schnittstelle mit einem Befehl ändern möchten , können Sie dies tun:

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

Ich bin ungefähr 4 Jahre zu spät, aber das ist die richtige Antwort: P

suprjami
quelle
sysctl (procps version 3.2.8): Fehler: Unbekannter Parameter "-aN"
qin