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

สามคุณสมบัติ สามสัญญาณ

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

PropertySignal that answers itWhat it still leaves open
ExistenceThe platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOSTunnels of a type the platform does not manage, which includes most third-party clients
PathA route lookup for the one destination, or a scoped proxy or interface key that names the tunnelWhether the far end is the peer you trust
IdentityAn authenticated response from the far end, or a source-address policy applied on the serverWhich local interface carried the packets

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

การมีอยู่: สถานะของแพลตฟอร์มเอง

Windows ตอบเรื่องนี้สำหรับโปรไฟล์พื้นเมืองผ่าน Remote Access Service API RasEnumConnections แสดงรายการสิ่งที่เชื่อมต่ออยู่ RasGetConnectStatus รายงานสถานะของรายการหนึ่ง และ RasGetLinkStatistics เพิ่มความเร็ว ตัวนับไบต์ และอายุของการเชื่อมต่อ ข้อจำกัดคือประเด็นสำคัญ: OpenVPN, WireGuard และไคลเอนต์ของผู้จำหน่ายไม่เคยลงทะเบียนการเชื่อมต่อ RAS ดังนั้นอุโมงค์ที่แข็งแรงแบบนั้นจะแสดงรายการว่าง และโค้ดที่ไร้เดียงสาจะรายงานว่าปิดอยู่

เดสก์ท็อป Linux เปิดเผยคุณสมบัติเดียวกันผ่าน NetworkManager บน D-Bus โดย PropertiesChanged บนออบเจ็กต์การเชื่อมต่อ VPN เปลี่ยนการตรวจให้เป็นเหตุการณ์ และคุณสมบัติ State รายงานเมื่อลิงก์ถึงสถานะเชื่อมต่อแล้ว จากเชลล์ nmcli connection show --active อ่านข้อมูลเดียวกัน และนั่นคือสิ่งที่คุณต้องการขณะดีบัก macOS เก็บรายการนั้นไว้ในเฟรมเวิร์ก System Configuration โดยมี scutil เป็นมุมมองบรรทัดคำสั่ง ทั้งสามอธิบายการเชื่อมต่อที่แพลตฟอร์มจัดการ และทั้งสามเงียบเกี่ยวกับอุโมงค์ที่แพลตฟอร์มไม่ได้จัดการ

เส้นทาง: แพ็กเก็ตไปที่ใดจริง ๆ

การจับคู่ชื่อคือทางลัดที่ทุกคนคว้าก่อน: แจกแจงอินเทอร์เฟซ ทดสอบสตริงกับ tun, tap, ppp หรือ ipsec และถือว่าการตรงกันเป็นหลักฐาน นี่คือฮิวริสติก และชุดอินเทอร์เฟซอาจดูเหมือนเดิมไม่ว่าจะมีสิ่งใดวิ่งผ่านหรือไม่ก็ตาม iOS รุ่นเก่าตอบแบบนี้และรุ่นหลังหยุดไป เพราะอินเทอร์เฟซที่มองเห็นไม่สามารถแยกสองสถานะได้อีกต่อไป

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

Android มีกับดักเวอร์ชันของตัวเอง: การออกอากาศ vpn.connectivity ไปถึงตัวรับที่ประกาศในแมนิเฟสต์ในบางบิลด์ และไปถึงตัวรับที่ลงทะเบียนขณะรันในบางบิลด์ มองมันเป็นความพยายามที่ดีที่สุด และเก็บการตรวจโดยตรงไว้ข้างหลัง

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

ตัวตน: ตรวจสอบปลายทางไกล

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

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

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

บันทึกหมวดหมู่ ไม่ใช่คำตัดสิน

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

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

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