เครื่องมือระดับสูงเช่น NetworkManager มักจะลบที่อยู่และเส้นทางบนลิงก์ "linkdown" (เช่น: ด้วยการตั้งค่าสถานะ NO-CARRIER ที่แสดงบนอินเทอร์เฟซ) ดังนั้นหากอินเทอร์เฟซได้รับการจัดการโดยเครื่องมือดังกล่าว เราสามารถคาดหวังได้ว่าเส้นทางของมันจะปรากฏขึ้นและหายไปเมื่อเสียบและถอดปลั๊ก
ฉันเข้าใจว่าการใช้ NetworkManager อาจรบกวนเกินไปเมื่อใช้โปรโตคอลการกำหนดเส้นทางแบบไดนามิกพร้อมกัน ดังนั้นอาจไม่ใช่แนวคิดที่ดีที่สุด
แต่จริงๆ แล้วเคอร์เนล routing stack มีฟีเจอร์ดังกล่าวอยู่แล้ว โดยไม่ต้องแก้ไข address หรือ route ใดๆ: ละเว้น_เส้นทาง_กับ_ลิงก์ดาวน์.
เช่นเดียวกับรายการอื่น ๆ รายการนี้ซึ่งปรากฏในเคอร์เนล 4.2 (มีอยู่ในเคอร์เนล 4.19 ของ Debian 10) และเป็น แสดงใน kernelnewbies.org แล้ว เมื่อมันปรากฏขึ้นได้รับ จัดทำเป็นเอกสารตั้งแต่เคอร์เนล 5.11 เท่านั้น:
forget_routes_with_linkdown - บูลีน
ละเว้นเส้นทางที่ลิงก์ไม่ทำงานเมื่อทำการค้นหา FIB
ดังนั้นหากมีการเรียกอินเทอร์เฟซ mgmt0
และควรใช้เส้นทางที่ให้บริการเฉพาะเมื่อตรวจพบผู้ให้บริการเท่านั้น ควรทำดังนี้
sysctl -w net.ipv4.conf.mgmt0.ignore_routes_with_linkdown=1
หรือใส่ในนี้ /etc/sysctl.conf
.
ตอนนี้เมื่ออินเทอร์เฟซนี้ยังคงถูกควบคุมไว้จะถูกยกเลิกการเชื่อมต่อ รายการเส้นทางจะแสดงกลับโดย เส้นทางไอพี
จะแสดงธง ลิงก์ที่ตายแล้ว
แทนธงผืนเดียว ลิงก์ดาวน์
เพื่อบอกผู้ใช้ว่าแท้จริงแล้วเส้นทางนี้ถูกละเว้นในระหว่างการค้นหา FIB
หมายเหตุ: สำหรับอินเทอร์เฟซเพื่อตรวจหาลิงก์ จะต้องเปิดใช้งาน ดังนั้นจึงต้องอยู่บริหาร หากนำลงมาเมื่อพาหะสูญหาย จะไม่สามารถนำกลับขึ้นมาโดยอัตโนมัติในภายหลังเมื่อตรวจพบพาหะ เนื่องจากจะไม่มีการตรวจจับดังกล่าวอีกต่อไป
ตัวอย่างที่สมบูรณ์:
ip link เพิ่มชื่อ vethtest1 ขึ้นพิมพ์ veth peer name vethtest1peer
ip link เพิ่มชื่อ vethtest2 ขึ้นพิมพ์ veth peer name vethtest2peer
ลิงค์ ip ตั้งค่า dev vethtest2peer up
ที่อยู่ IP เพิ่ม 192.0.2.2/25 dev vethtest1
ที่อยู่ IP เพิ่ม 192.0.2.3/24 dev vethtest2
การตั้งค่าที่อยู่จะติดตั้งเส้นทาง LAN ของเคอร์เนลอัตโนมัติ vethtest1
ซึ่งอินเทอร์เฟซแบบเพียร์ไม่ได้ปรากฏขึ้นจะมีสถานะ NO-CARRIER และเส้นทางจะได้รับ a ลิงก์ดาวน์
ธง.
# เส้นทาง ip แสดงไปที่รูท 192.0.2.0/24
192.0.2.0/25 dev vethtest1 proto kernel scope ลิงก์ src 192.0.2.2 ลิงก์ดาวน์
192.0.2.0/24 dev vethtest2 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.0.2.3
เส้นทางไปยัง 192.0.2.100 จะใช้ vethtest1
เนื่องจากได้เส้นทางที่แคบกว่า (แม้จะมี ลิงก์ดาวน์
ธง).
# เส้นทาง ip รับ 192.0.2.100
192.0.2.100 dev vethtest1 src 192.0.2.2 uid 0
แคช
จากนั้นด้วยการตั้งค่าใหม่:
sysctl -w net.ipv4.conf.vethtest1.ignore_routes_with_linkdown=1
มาพร้อมกับพฤติกรรมใหม่:
# เส้นทาง ip แสดงไปที่รูท 192.0.2.0/24
192.0.2.0/25 dev vethtest1 proto kernel scope ลิงก์ src 192.0.2.2 ลิงก์ที่ตายแล้ว
192.0.2.0/24 dev vethtest2 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.0.2.3
# ip -4 netconf แสดง dev vethtest1
inet vethtest1 การส่งต่อบน rp_filter ปิด mc_forwarding ปิด proxy_neigh off forget_routes_with_linkdown บน
# เส้นทาง ip รับ 192.0.2.100
192.0.2.100 vethtest2 src 192.0.2.3 uid 0
แคช
ตอนนี้หากอินเทอร์เฟซได้รับพาหะ (จำลองที่นี่โดยนำอินเทอร์เฟซเพียร์ขึ้นมา):
ลิงค์ ip ตั้งค่า dev vethtest1peer up
เส้นทางถูกกู้คืนผ่าน:
# เส้นทาง ip แสดงไปที่รูท 192.0.2.0/24
192.0.2.0/25 dev vethtest1 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.0.2.2
192.0.2.0/24 dev vethtest2 โปรโตเคอร์เนลขอบเขตลิงก์ src 192.0.2.3
# เส้นทาง ip รับ 192.0.2.100
192.0.2.100 dev vethtest1 src 192.0.2.2 uid 0
แคช