ใน Linux ตัวชี้วัดใดที่มีเส้นทางที่ไม่มีตัวชี้วัด


11

หากคุณมี (ใน Linux) ทั้งสองเส้นทาง:

default via 192.168.1.1 dev enp58s0f1
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

ฉันคาดหวังว่าจะใช้อันแรก แต่ไม่ใช่ในกรณีที่: อันที่สองถูกใช้แทน

ถ้าฉันเปลี่ยนสิ่งนี้เป็น:

default via 192.168.1.1 dev enp58s0f1  proto static  metric 100 
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

จากนั้นทำงานตามที่คาดไว้ ดูเหมือนว่า "ไม่มีการวัด" เป็นเมตริกที่แย่กว่า (สูงกว่า) จำนวนใด ๆ แทนที่จะเป็นเมตริก 0

เกิดอะไรขึ้น? เป็นเฉพาะกับ Linux หรือมาตรฐานเครือข่ายหรือไม่

ขอบคุณล่วงหน้า.

คำตอบ:


6

คุณแน่ใจเกี่ยวกับการสังเกตครั้งแรกของคุณหรือไม่ อะไรip route showหรือroute -nแสดงแล้ว? ผลลัพธ์จะเปลี่ยนไปหรือไม่ถ้าคุณเพิ่มproto staticในกรณีแรก

ฉันได้พบทรัพยากรอย่างน้อยสองแห่งที่กล่าวอย่างชัดเจนว่า0เป็นค่าเริ่มต้นใน Linux:

  • http://0pointer.de/lennart/projects/ifmetric/ : การวัดเริ่มต้นสำหรับเส้นทางในเคอร์เนล Linux คือ 0 ซึ่งหมายถึงลำดับความสำคัญสูงสุด
  • http://www.man7.org/linux/man-pages/man8/route.8.html : หากตัวเลือกนี้ไม่ได้ระบุตัวชี้วัดสำหรับค่าเริ่มต้นของตระกูลที่อยู่ inet6 (IPv6) เป็น '1' สำหรับ inet (IPv4) มันเริ่มต้นที่ '0' (มันบอกเป็นนัยว่าค่าเริ่มต้นอาจแตกต่างกันเมื่อใช้iproute2แต่การวิเคราะห์แหล่งที่มาเหล่านี้ไม่แสดงว่ามันคืออะไร)

แฮกเกอร์เคอร์เนลของ Linux จะต้องใช้เพื่อคัดแยก

นอกจากนี้สิ่งที่เลือกเริ่มต้นจะชัดเจนเฉพาะระบบปฏิบัติการ บทความนี้ ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ) ตัวอย่างเช่นแสดงให้เห็นว่า Windows เลือกการวัดเริ่มต้น ขึ้นอยู่กับแบนด์วิดท์ของลิงค์


ฉันทำเครื่องหมายคำตอบของคุณเป็นคำตอบที่ถูกต้องเพราะฉันไม่เห็นพฤติกรรมนี้อีกในคอมพิวเตอร์ของฉัน ฉันโทษในสิ่งแปลก ๆ ที่เกิดขึ้นในคอมพิวเตอร์เดสก์ท็อปกับ Ubuntu อย่างน้อยกับรุ่นที่ฉันมีในขณะที่ถามคำถาม ฉันไม่เห็นว่ามันเกิดขึ้นในกล่องอื่น ๆ ที่ใช้ Ubuntu LTS ดังนั้นไฟล์ X (อ้างอิงนี้เก่าเกินไปหรือไม่) ขอบคุณสำหรับคำตอบ!
rsuarez

6

เนื่องจากเส้นทางเหล่านี้อยู่ในเครือข่ายย่อยต่างๆจึงมีส่วนเกี่ยวข้องมากกว่าที่นี่เพียงแค่ระบบเมตริก หากการรับส่งข้อมูลเริ่มต้นอยู่บนเครือข่ายย่อย 192.168.1.1 และมีเส้นทางที่ไม่ใช่ค่าเริ่มต้นที่ตรงกันในตารางเส้นทางของคุณเส้นทางนั้นจะจับคู่ผ่านการจับคู่คำนำหน้าที่ยาวที่สุดก่อนที่จะมีการพิจารณาตัวชี้วัด

การสันนิษฐานว่าเส้นทางที่ไม่ใช่ค่าเริ่มต้นนั้นไม่ได้จับคู่กันดังนั้นการไม่มีเคอร์เซอร์ควรตีความโดยเคอร์เนลว่ามีเมตริกเป็น 0 ดังนั้นเส้นทางที่มีลำดับความสำคัญสูงสุด แม้ว่าจะเป็นมุมมองแบบง่าย ๆ เนื่องจากบาง daemons การกำหนดเส้นทางในภายหลังจะแปลเมตริกเริ่มต้นนั้นเป็นค่าอื่นเช่น 1024 ฉันคาดหวังว่านี่คือสิ่งที่เกิดขึ้นกับคุณและ distro ที่ไม่มีชื่อของคุณ

ถ้าip routeแสดงให้เห็นว่าไม่มีตัวชี้วัดที่ทุกท่านสามารถยืนยันได้ว่าเป็นจริง 0 โดยใช้ที่มีอายุมากกว่าคำสั่งจากแพคเกจสุทธิเครื่องมือหรือroute -n cat /proc/net/routeอย่างไรก็ตามเอาต์พุตนี้ไม่จำเป็นต้องตรงกับ daemon การกำหนดเส้นทางที่จะใช้ภายในเมื่อพบ 0 ค่าเมตริก

นอกจากนี้วิธีที่คุณสร้างเส้นทางมีความสำคัญเช่นกัน ip routeใช้ netlink API ในขณะที่routeใช้ ioctl รหัสสำหรับวิธีการสร้างตัวชี้วัดเริ่มต้นระหว่างวิธีการสองวิธีทำให้ได้ค่าตัวชี้วัดที่แตกต่างกัน ตัวอย่างเช่น: การสร้างเส้นทางเริ่มต้นของ IPv6 ผ่านip routeจะส่งผลให้ค่าตัวชี้วัด 1024 บน RHEL 7 ในขณะที่การสร้างเส้นทางเดียวกันผ่านrouteจะส่งผลให้ตัวชี้วัดที่ 1

จากRedHat :

  • หากไม่มีสิ่งใดถูกส่งผ่านไปยังคำสั่งเส้นทางตามตัวชี้วัดเส้นทางเราจะใช้ค่า 1 โดยคำสั่งนั้น
  • หากไม่มีสิ่งใดถูกส่งไปยังคำสั่ง ip เป็นตัวชี้วัดเส้นทางแอตทริบิวต์จะไม่ถูกสร้างเลยและเคอร์เนลจะเข้าใจเป็น 0 ซึ่งแปลในภายหลัง 1024 เป็นค่าเริ่มต้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.