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

สำหรับ VPN ที่จัดการโดย NetworkManager ดิสแพตเชอร์คือตำแหน่งที่ถูกต้อง และ vpn-up คือการกระทำที่ถูกต้อง

ใช้ vpn-up ไม่ใช่เหตุการณ์ของอินเทอร์เฟซ

ดิสแพตเชอร์แยก up ออกจาก vpn-up ตัวแรกแสดงอินเทอร์เฟซที่เปิดใช้งาน ตัวที่สองแสดงการเชื่อมต่อ VPN ที่เปิดใช้งาน การที่ Wi-Fi ขึ้นหมายถึงเพียงว่าลิงก์พื้นฐานมีอยู่ อุโมงค์อาจยังเจรจาอยู่ หรืออาจไม่ผ่านการพิสูจน์ตัวตนเลย

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

จำกัดการจับคู่ให้เหลือการเชื่อมต่อเดียว

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

ทำให้งานเป็น idempotent callback ที่เพิ่มเส้นทางทุกครั้งที่เรียกจะทำให้ตารางเต็มไปด้วยรายการซ้ำ และสำเนาที่สองคือสิ่งที่ทำให้การกำหนดเส้นทางพัง

รู้ว่าการเปิดใช้งานไม่ได้พิสูจน์อะไร

vpn-pre-up ทำงานก่อนที่ NetworkManager จะรายงานว่า VPN เปิดใช้งานเต็มที่ และตัวจัดการรอสคริปต์เหล่านั้น ใช้ขั้นตอนที่บล็อกเฉพาะเมื่องานนั้นอยู่ที่นั่นจริง ๆ เพราะการตรวจสอบที่ช้าจะทำให้การเปิดใช้งานที่ทุกคอมโพเนนต์อื่นรอดูนั้นล่าช้า

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

เคารพบริบทที่สคริปต์ทำงานอยู่

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

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

วางแผนสำหรับการตัดการเชื่อมต่อที่ไม่เคยเกิดขึ้น

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

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

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