ผู้ใช้รายงานว่าแอปพลิเคชันภายในทำงานได้จากเครื่องหนึ่งและล้มเหลวจากอีกเครื่องหนึ่ง ขณะที่ ping ที่คุณรันจากเกตเวย์สำเร็จทั้งสองกรณี เมื่อมีอุโมงค์หลายเส้นที่มีต้นทุนเท่ากัน นี่ไม่ใช่ความขัดแย้ง แต่ละโฟลว์ถูกวางบนฮอปถัดไปของตัวเอง การตรวจสอบของคุณกับเซสชันของผู้ใช้จึงอาจใช้เส้นทางต่างกัน วิธีด้านล่างจะสร้างการเลือกนั้นขึ้นมาใหม่ก่อนจะเปลี่ยนแปลงสิ่งใด

ping ครั้งเดียว หลายเส้นทางที่เป็นไปได้

เมื่อเส้นทางมีฮอปถัดไปมากกว่าหนึ่งที่ต้นทุนเท่ากัน เราเตอร์ต้องเลือกหนึ่งรายการต่อแพ็กเก็ต การใช้งานส่วนใหญ่ทำแฮชฟิลด์จากแพ็กเก็ต โดยทั่วไปคือที่อยู่ต้นทางและปลายทางพร้อมโปรโตคอลและพอร์ต เพื่อให้คำตอบอยู่บนเส้นทางเดิม แอปพลิเคชันต่างกัน หรือแม้แต่การเชื่อมต่อต่างกันของแอปพลิเคชันเดียว ก็ให้แฮชต่างกัน

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

แพลตฟอร์มเลือกฮอปถัดไปอย่างไร

สร้างการเลือกขึ้นมาใหม่แทนการเดา ถามเคอร์เนลว่าจะใช้เส้นทางใดสำหรับต้นทางและปลายทางเดียวกับเซสชันที่ล้มเหลว การค้นหานั้นรวมฟิลด์ที่การค้นหาปลายทางธรรมดามองข้าม เรียกใช้จากไคลเอนต์ที่ทำงานได้ด้วยแล้วเปรียบเทียบสองคำตอบ:

ip route get 10.20.5.7 from 10.20.0.14

iproute2 รุ่นใหม่กว่ายอมรับโปรโตคอลและพอร์ตปลายทางด้วย ซึ่งสำคัญเมื่อแฮชรวมสิ่งเหล่านั้น เปรียบเทียบผลลัพธ์นั้นกับการค้นหาเดียวกันจากไคลเอนต์ที่ทำงานได้ และความต่างคือหลักฐานที่คุณขาดไป

ObservationLikely causeFirst check
Ping works, application failsA different flow hash selects another tunnelPer-flow lookup from the client's address
Some users fail, others do notOne tunnel lacks a prefix or selectorCompare both tunnels' installed routes
Fails only at larger sizesTunnels have different effective MTUProbe the same size over each path
Fails after a reconnectStateful asymmetry between pathsSession state on both gateways

ตามโฟลว์ที่ล้มเหลว ไม่ใช่ตารางเส้นทาง

ตารางเส้นทางแสดงอุโมงค์ทั้งสองและดูถูกต้องตามนิยาม คำถามคือแต่ละอุโมงค์ทำอะไรกับแพ็กเก็ตเมื่อถูกเลือกแล้ว ตรวจสอบว่าทั้งคู่มีคำนำหน้าที่ป้องกันเหมือนกัน สิทธิ์ส่งต่อเหมือนกัน และเส้นทางย้อนกลับที่ไปถึงไคลเอนต์เดียวกัน

ใส่ใจอุปกรณ์ที่มีสถานะตรงกลาง หากคำขอออกทางอุโมงค์หนึ่งและคำตอบกลับมาทางอีกอุโมงค์หนึ่ง ไฟร์วอลล์หรือ NAT ที่ไม่เคยเห็นโฟลว์ต้นฉบับจะทิ้งมันไป อุโมงค์ทั้งสองส่งต่อทราฟฟิกได้ถูกต้อง แต่การเชื่อมต่อก็ยังล้มเหลว

ตรวจสอบ MTU ของแต่ละเส้นทางด้วย เส้นทางที่มีการห่อหุ้มเพิ่มเติมจะลดขนาดที่ใช้ได้ และการถ่ายโอนที่สำเร็จบนอุโมงค์หนึ่งจะหยุดบนอีกอุโมงค์ที่ขนาดเดียวกับที่อุโมงค์เล็กกว่าพัง

เปรียบเทียบทีละเส้นทาง

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

เปรียบเทียบแอปพลิเคชันจริง ไม่ใช่ ping ซ้ำ ๆ บันทึกว่าข้อขัดข้องตามฮอปถัดไปที่เฉพาะเจาะจง ขนาดแพ็กเก็ต หรือการเปลี่ยนผ่านหลังเชื่อมต่อใหม่ เพราะรูปแบบทั้งสามชี้ไปยังการซ่อมที่ต่างกัน

สุดท้าย จดบันทึกว่าเหตุใดเส้นทางจึงถือว่าเทียบเท่ากัน และข้อขัดข้องควรถอดหนึ่งในนั้นออกจากบริการอย่างไร หลายเส้นทางจะปลอดภัยก็ต่อเมื่อเส้นทางแลกเปลี่ยนกันได้จริง และนั่นเป็นข้อความเชิงออกแบบที่ควรตรวจสอบไม่ใช่สันนิษฐาน

บทความที่เกี่ยวข้อง