อะไรคือความแตกต่างระหว่าง“ all”,“ default” และ“ eth *” ใน / proc / sys / net / ipv [46] / conf /?


37

ใน sysctl ที่/proc/sys/net/ipv[46]/conf/คีย์มีคีย์ย่อยต่อไปนี้: all, defaultและที่สำคัญสำหรับการเชื่อมต่อเครือข่ายแต่ละ ตัวอย่างเช่นบนเครื่องที่มีเน็ตเวิร์กอินเตอร์เฟสเดียว eth0 มันจะมีลักษณะดังนี้:

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/

การตั้งค่าที่เกี่ยวข้องทั้งหมดมีอยู่ในแต่ละปุ่มแยกกัน ตัวอย่างเช่นหากฉันต้องการปิดใช้งานการโฆษณาเราเตอร์ IPv6 ด้วยaccept_raค่าค่านี้จะมีอยู่สี่ครั้ง:

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

คำถามของฉันคือ: ฉันต้องเปลี่ยนค่าใดบ้าง ฉันคิดall(เปลี่ยนอินเทอร์เฟซที่มีอยู่ทั้งหมด) และdefault(เพื่อเปลี่ยนอินเทอร์เฟซใหม่ทั้งหมดที่อาจปรากฏในภายหลัง) แต่การเปลี่ยนสิ่งเหล่านี้ยังคงทิ้งค่าไว้ที่ 1 สำหรับ lo และ 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

เครื่องจะยอมรับ Router Advertisements ใน eth0 หรือไม่?


โอ้ฉันพบคำตอบแล้วในขณะที่ยังเขียนคำถามอยู่ ฉันจะตอบด้วยตัวเองภายใน 7 ชั่วโมง (เว็บไซต์จะไม่ยอมให้ฉันทำเร็วกว่านี้) จนถึงตอนนี้ก็คือลิงค์: marc.info/?l=linux-kernel&m=123606366021995&w=2
Martin von Wittich

ตามgithub.com/torvalds/linux/commit/… rp_filter ลอจิกเปลี่ยนไปเมื่อ 9 ปีที่แล้ว ก่อนหน้านี้มันเป็น ANDed และมากกว่าถูกเปลี่ยนเป็น MAX
odivlad

คำตอบ:


37

ฉันพบคำตอบในขณะที่ยังเขียนคำถามอยู่ ฉันตัดสินใจที่จะโพสต์ไว้เพราะคนอื่น ๆ อาจพบว่ามันมีความชาญฉลาดและตอบคำถามเอง ฉันหวังว่านี่จะไม่ขมวดคิ้ว :)

ผู้ใช้ Philipp Matthias Hahn ในรายชื่อผู้รับจดหมาย linux-kernel ได้คิดอย่างน้อยบางส่วน :

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.

เขาไม่ครอบคลุมaccept_raแต่อย่างน้อยก็เป็นที่ชัดเจนในขณะนี้วิธีการallและdefaultการทำงานหรือเปล่าว่าพวกเขาจะไม่ได้ทำงานตามที่ผมคาดว่าจะมี


3
และสำหรับสิ่งที่ IPv6? เช่นฉันกำลังมองหาuse_tempaddrพารามิเตอร์ ...
mattia.b89

1
rp_filter ลอจิกเปลี่ยน 9 ปีที่ผ่านมา ก่อนหน้านี้มันเป็น ANDed และมากกว่าถูกเปลี่ยนเป็น MAX โปรดดู "ค่าสูงสุดจาก conf / {all, interface} / rp_filter ใช้เมื่อทำการตรวจสอบความถูกต้องของแหล่งที่มาบน {interface}" ในgit.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/…และgithub.com/torvalds/linux/commit/ (ผ่านunix.stackexchange.com/a/427455/ 18568 )
Gaia

@Gaia ความคิดเห็นยอดเยี่ยม!
Mvorisek

5

ตัวจัดการสำหรับaccept_raในเป็นnet/ipv6/addrconf.c proc_dointvecดังนั้นโค้ดอินเตอร์เฟสทั่วไปได้สร้างอาร์เรย์ของallและรายการเฉพาะอินเตอร์เฟสและการเขียนลงในเหล่านี้ด้วยsysctlหรือ procfs เพียงแค่ใส่ค่าที่คุณระบุในอาร์เรย์

เรากังวลว่าจะใช้ค่าเหล่านั้นอย่างไร

คุณจะเห็นจากผู้เรียกipv6_accept_ra()ฟังก์ชั่นinclude/net/ipv6.hซึ่งผู้โทรทุกคนใช้อินเทอร์เฟซเฉพาะเพื่อเรียกฟังก์ชั่นนั้น

ดังนั้นไม่มีเคอร์เนลที่net.ipv6.conf.all.accept_raเคยใช้ยกเว้นเก็บรายการ procfs เท่าที่ฉันเห็น

หากคุณต้องการเปลี่ยนaccept_raทุกอินเตอร์เฟสด้วยคำสั่งเดียวคุณสามารถทำได้:

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

ฉันประมาณ 4 ปีที่แล้ว แต่นี่เป็นคำตอบที่ถูกต้อง: P


sysctl (procps เวอร์ชัน 3.2.8): ข้อผิดพลาด: พารามิเตอร์ที่ไม่รู้จัก "-aN"
qin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.