Sự khác biệt giữa các tất cả các mối quan hệ giữa các nhà cung cấp, các ứng dụng mặc định và các chế độ khác


37

Trong sysctl, các /proc/sys/net/ipv[46]/conf/phím có những khóa sau: all, default, và một chìa khóa cho mỗi giao diện mạng. Ví dụ: trên một máy có giao diện mạng eth0 duy nhất, nó sẽ trông như thế này:

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/

Tất cả các cài đặt tương ứng tồn tại trong mỗi khóa riêng biệt. Ví dụ: nếu tôi muốn tắt Quảng cáo Bộ định tuyến IPv6 với accept_ragiá trị, giá trị này tồn tại bốn lần:

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

Câu hỏi của tôi bây giờ là: tôi cần thay đổi giá trị nào trong số những giá trị này? Tôi đã tìm ra all(để thay đổi tất cả các giao diện hiện có) và default(để thay đổi tất cả các giao diện mới có thể xuất hiện sau), nhưng việc thay đổi các giao diện này vẫn để giá trị ở mức 1 cho lo và 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

Bây giờ máy sẽ chấp nhận Quảng cáo Bộ định tuyến trên eth0, hay không?


Ồ, tôi đã tìm thấy câu trả lời trong khi vẫn viết câu hỏi. Tôi sẽ tự trả lời trong 7 giờ (trang web sẽ không cho phép tôi làm điều đó sớm hơn). Cho đến lúc đó đây là liên kết: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich

Theo github.com/torvalds/linux/commit/ Nhật rp_filter logic đã được thay đổi 9 năm trước. Trước đây, nó đã được ANDed và thay đổi thành MAX.
odivlad

Câu trả lời:


37

Tôi đã tìm thấy câu trả lời trong khi vẫn viết câu hỏi. Tôi đã quyết định đăng nó bằng mọi cách vì những người khác có thể thấy điều này sâu sắc, và sau đó tự trả lời nó; Tôi hy vọng điều này không được tán thành :)

Người dùng Philipp Matthias Hahn trong danh sách gửi thư linux-kernel đã tìm ra ít nhất một phần :

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.

Anh ấy không bao gồm accept_ranhưng ít nhất bây giờ rõ ràng về cách thức allvà cách defaultlàm việc, hay đúng hơn là cách họ không làm việc như tôi mong đợi.


3
và cho các công cụ IPv6? ví dụ: tôi đang tìm use_tempaddrtham số ...
mattia.b89

1
logic rp_filter đã được thay đổi 9 năm trước. Trước đây, nó đã được ANDed và thay đổi thành MAX. Xem "Giá trị tối đa từ conf / {all, interface} / rp_filter được sử dụng khi thực hiện xác thực nguồn trên {interface}." trong git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/...github.com/torvalds/linux/commit/... (thông qua unix.stackexchange.com/a/427455/ 18568 )
Gaia

@Gaia Nhận xét tuyệt vời!
Mvorisek

5

Các xử lý cho accept_ratrong net/ipv6/addrconf.cproc_dointvec. Vì vậy, mã giao diện chung trước đây đã tạo ra một mảng allvà các mục cụ thể giao diện, và viết vào đó bằng sysctlhoặc Procfs chỉ đặt giá trị bạn chỉ định trong mảng.

Chúng tôi quan tâm đến việc làm thế nào những giá trị đó được sử dụng

Bạn sẽ thấy từ những người gọi ipv6_accept_ra()chức năng trong include/net/ipv6.hđó mỗi người gọi sử dụng một giao diện cụ thể để gọi chức năng đó.

Vì vậy, không có nơi nào trong kernel đã net.ipv6.conf.all.accept_ratừng được sử dụng ngoại trừ để lưu trữ một mục nhập Procfs, theo như tôi có thể thấy.

Nếu bạn muốn thay đổi accept_ramọi giao diện bằng một lệnh, bạn có thể thực hiện việc này:

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

Tôi trễ khoảng 4 năm nhưng đây là câu trả lời đúng: P


sysctl (phiên bản Procps 3.2.8): lỗi: Tham số không xác định "-aN"
qin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.