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

งานเดียวกันด้วยสองกลไก

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

PropertyTeardown scriptFirewall unit
Runs when the client is killedNoYes
Needs privilege at teardown timeUsually yesConfigured once, at boot
Acts on the whole machineOften, including recovery pathsOnly on the flows it matches

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

ฮุกตอนรื้อถอนทำอะไรได้และทำอะไรไม่ได้

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

#!/bin/sh
for dev in /sys/class/net/*; do
  name=$(basename "$dev")
  [ "$name" = lo ] || ip link set dev "$name" down
done

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

ตรวจสอบว่าไคลเอนต์เริ่มทำงานอย่างไรก่อนจะเชื่อฮุก สคริปต์ที่ใช้ได้เมื่อรันด้วยมือในฐานะ root ไม่ได้พิสูจน์อะไรเกี่ยวกับบริการที่เริ่มตอนบูต

กฎไฟร์วอลล์ทำอะไรต่างออกไป

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

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

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

persist-tun เป็นตัวตัดสินว่ามีช่องว่างหรือไม่

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

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

รักษาเส้นทางเชื่อมต่อใหม่ให้ยังมีชีวิต แล้วทดสอบสี่สถานะ

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

ip route add 198.51.100.20/32 via 192.168.0.1 dev wlan0

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

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