วิธีตรวจจับอุโมงค์ VPN ที่ทำงานอยู่จากโค้ดบนทุกแพลตฟอร์ม
อุโมงค์มีอยู่หรือไม่ ปลายทางนี้วิ่งผ่านอุโมงค์หรือปลายทางไกลเป็นผู้ตอบ สิ่งเหล่านี้คือการตรวจสามแบบและสัญญาณสามอย่างที่ต่างกัน
“VPN เปิดอยู่หรือไม่” จริง ๆ แล้วคือสามคำถามในประโยคเดียว คำถามใดที่โค้ดของคุณต้องการคือการตัดสินใจข้อแรก และนั่นคือสิ่งที่การใช้งานส่วนใหญ่ข้ามไป อุปกรณ์นี้มีอุโมงค์อยู่หรือไม่ ทราฟฟิกไปยังปลายทางนี้ออกผ่านอุโมงค์หรือไม่ หรือปลายทางไกลตอบกลับด้วยตัวตนที่คุณคาดหวัง เลือกคุณสมบัติ จากนั้นเลือกสัญญาณที่วัดคุณสมบัตินั้น และสุดท้ายเขียนในบันทึกว่าคุณวัดสิ่งใดจริง ๆ
สามคุณสมบัติ สามสัญญาณ
เมื่อบีบแต่ละข้อให้เหลือบรรทัดเดียว สามคำถามมีสามคำตอบที่ต่างกัน ตารางด้านล่างคือการตัดสินใจเอง ไม่ใช่บทสรุปของการตัดสินใจ
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which 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 ล่ม” เพียงอย่างเดียวจะส่งรายงานไปยังทีมที่ไม่สามารถแก้ไขได้ หมวดหมู่คือผลลัพธ์ที่มีประโยชน์ ส่วนคำตัดสินคือสิ่งที่ทำให้มันผิด