Apa perbedaan antara "semua", "default" dan "eth *" di / proc / sys / net / ipv [46] / conf /?

37

Di sysctl, yang /proc/sys/net/ipv[46]/conf/kunci memiliki subkunci berikut: all, default, dan kunci untuk setiap antarmuka jaringan. Misalnya, pada mesin dengan antarmuka jaringan tunggal eth0, akan terlihat seperti ini:

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/

Semua pengaturan masing-masing ada di setiap tombol secara terpisah. Sebagai contoh, jika saya ingin menonaktifkan Iklan Router IPv6 denganaccept_ra nilai, nilai ini ada empat kali:

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

Pertanyaan saya sekarang adalah: nilai-nilai manakah yang perlu saya ubah? Saya pikir all(untuk mengubah semua antarmuka yang ada) dan default(untuk mengubah semua antarmuka baru yang mungkin muncul kemudian), tetapi mengubah ini masih meninggalkan nilai pada 1 untuk lo dan 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

Akankah mesin sekarang menerima Iklan Router pada eth0, atau tidak?

Martin von Wittich
sumber
Oh well, saya sudah menemukan jawabannya ketika masih menulis pertanyaan. Saya akan menjawabnya sendiri dalam 7 jam (situs tidak akan membiarkan saya melakukannya lebih cepat). Sampai saat ini inilah tautannya: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich
Menurut github.com/torvalds/linux/commit/… rp_filter logic telah diubah 9 tahun yang lalu. Sebelumnya itu ANDed dan kemudian diubah menjadi MAX.
Odivlad

Jawaban:

37

Saya telah menemukan jawabannya ketika masih menulis pertanyaan. Saya tetap memutuskan untuk mempostingnya karena orang lain mungkin menemukan wawasan ini, dan kemudian menjawabnya sendiri; Saya harap ini tidak disukai :)

Pengguna Philipp Matthias Hahn di milis linux-kernel telah menemukan jawabannya setidaknya sebagian :

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.

Dia tidak membahas accept_ratetapi setidaknya sekarang jelas bagaimana alldan defaultbekerja, atau lebih tepatnya, bagaimana mereka tidak bekerja seperti yang saya harapkan.

Martin von Wittich
sumber
3
dan untuk hal-hal IPv6? misalnya saya sedang mencari use_tempaddrparameter ...
mattia.b89
1
Logika rp_filter telah diubah 9 tahun yang lalu. Sebelumnya itu ANDed dan kemudian diubah menjadi MAX. Lihat "Nilai maks dari conf / {all, interface} / rp_filter digunakan ketika melakukan validasi sumber pada {interface}." di git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/… dan github.com/torvalds/linux/commit/… (via unix.stackexchange.com/a/427455/ 18568 )
Gaia
@ Gaia Komentar luar biasa!
Mvorisek
5

Pawang untuk accept_ramasuk net/ipv6/addrconf.cadalah proc_dointvec. Jadi kode antarmuka generik sebelumnya telah menghasilkan sebuah array dari alldan entri khusus antarmuka, dan menulis ke sysctldalamnya dengan atau procfs hanya menempatkan nilai yang Anda tentukan dalam array.

Kami prihatin dengan bagaimana nilai-nilai itu kemudian digunakan

Anda akan melihat dari penelepon ipv6_accept_ra()fungsi include/net/ipv6.hbahwa setiap penelepon menggunakan antarmuka spesifik untuk memanggil fungsi itu.

Jadi tidak ada tempat di kernel yang net.ipv6.conf.all.accept_rapernah digunakan kecuali untuk menyimpan entri procfs, sejauh yang saya bisa lihat.

Jika Anda ingin mengubah accept_rasetiap antarmuka dengan satu perintah, Anda dapat melakukan ini:

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

Saya terlambat sekitar 4 tahun tetapi ini adalah jawaban yang benar: P

suprjami
sumber
sysctl (procps versi 3.2.8): error: Parameter tidak dikenal "-aN"
qin