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

กลไกสองอย่างป้องกันการวนซ้ำนั้น อย่างหนึ่งมองเห็นได้ในตารางเส้นทาง อีกอย่างหนึ่งอาศัยอยู่ภายในแอปพลิเคชัน

ทราฟฟิกภายในและภายนอกเป็นการตัดสินใจที่แตกต่างกัน

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

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

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

ตัวเลือกที่หนึ่ง: เส้นทางโฮสต์สำหรับปลายทาง

วิธีตรงเพิ่มเส้นทางสำหรับที่อยู่ของเซิร์ฟเวอร์ผ่านเกตเวย์เดิม ใช้เวลาเพียงบรรทัดเดียว มองเห็นได้สำหรับใครก็ตามที่อ่านตาราง อธิบายในบันทึกการเปลี่ยนแปลงก็ง่าย

จุดอ่อนของมันปรากฏเมื่อเส้นทางพื้นฐานเปลี่ยน เส้นทางที่บันทึกไว้ระบุเกตเวย์และอินเทอร์เฟซจากเครือข่ายเดิม หลังจากการสลับ Wi-Fi เกตเวย์นั้นอาจไม่มีอยู่ และเส้นทางก็ยังคงอยู่ ดูเหมือนถูกต้องและไม่ได้ทำอะไรเลย

# before the tunnel: which path reaches the endpoint?
ip route get 198.51.100.7

# pin it through the current gateway
ip route add 198.51.100.7/32 via 192.168.1.1 dev wlan0

# after the tunnel is up, confirm the pin survived
ip route get 198.51.100.7

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

ตัวเลือกที่สอง: ปกป้องซ็อกเก็ต

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

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

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

การเลือกระหว่างสองวิธี

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

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

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

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