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

อ่านบรรทัดเส้นทางทีละคอลัมน์

แต่ละรายการเริ่มด้วยปลายทางและความยาวพรีฟิกซ์ จากนั้นเพิ่มตัวปรับในคำศัพท์คงที่ ได้แก่ via, dev, proto, scope, src และ metric บรรทัดอย่าง 198.51.100.0/24 dev tun0 proto kernel scope link src 198.51.100.2 หนาแน่นแต่ระบุครบถ้วน ไม่มีอะไรขาดหายและไม่มีการสื่อถึงที่อยู่เราเตอร์ใด ๆ

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

ตอนนี้อ่านเส้นทางเริ่มต้นด้วยวิธีเดียวกัน: default via 192.0.2.254 dev eth0 proto static metric 100 ที่นี่ via ปรากฏอยู่เพราะแพ็กเก็ตต้องการฮ็อปถัดไปจริง และฮ็อปนั้นเองก็ต้องเข้าถึงได้บน eth0 ทั้งสองบรรทัดไม่ใช่รูปแบบย่อยของกันและกัน แต่ตอบคำถามต่างกันเกี่ยวกับทราฟฟิกที่จะไปที่ใด

เส้นทางสองรูปแบบที่มักถูกสับสน

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

Piece of the lineWhat it settlesWhat it says nothing about
The destination and maskWhich packets are eligible to matchWhere those packets leave the host
via plus its addressWhich next hop receives them, and therefore that a router is involvedWhether that router is reachable or sane
devWhich interface carries the encapsulated or raw packetWhether the interface is up or has a carrier
proto and scopeWho installed the entry and how far the destination is considered to beWhether a firewall later drops the traffic

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

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

ถามเคอร์เนลว่าจะใช้บรรทัดใดจริง ๆ

การอ่านตารางไม่เหมือนกับการค้นหาจริง เพราะเคอร์เนลตรวจสอบกฎนโยบาย ตารางหลายตาราง และรายการที่แคชไว้ก่อนจะตอบ คำกริยาที่ทำการค้นหาจริงคือ ip route get และมันพิมพ์เส้นทางที่แพ็กเก็ตที่มีคุณสมบัติเหล่านั้นจะใช้

ip route get 203.0.113.37 from 198.51.100.2 iif tun0

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

ถ้าคำตอบทำให้คุณประหลาดใจ ให้พิมพ์กฎก่อนเปลี่ยนแปลงสิ่งใด: ip -4 rule show แสดงรายการตามลำดับความสำคัญ และไคลเอนต์ VPN ที่ติดตั้งตารางของตัวเองหรือกฎสำหรับแพ็กเก็ตที่ทำเครื่องหมายจะไม่ปรากฏในตารางหลักเลย การแสดงรายการทุกตารางจะปิดช่องว่างนั้น

ip -4 route show table all | grep -E 'tun|default'

ตรวจสอบชั้นล่างก่อนแทนที่เส้นทางเริ่มต้น

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

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

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

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