เมื่อ VPN หลุด ทำอย่างไรไม่ให้มีอะไรรั่วไหล: ล็อกทางออกของ Linux
การกำหนดเส้นทางและการกรองเป็นการตัดสินใจคนละเรื่อง ล็อกฮุกขาออก แล้วจำกัดข้อยกเว้นของปลายทาง DNS และการจัดการที่อุโมงค์ต้องใช้เพื่อเชื่อมต่อใหม่
ลองนึกถึงกล่องมีเดียบนสายอินเทอร์เน็ตที่บ้านซึ่งควรออกสู่อินเทอร์เน็ตผ่านอุโมงค์เท่านั้น เมื่ออุโมงค์หลุด แอปพลิเคชันควรหยุดชะงักแทนที่จะไหลต่อผ่านอินเทอร์เฟซกายภาพอย่างเงียบ ๆ การทำให้ได้พฤติกรรมนี้เป็นปัญหาของไฟร์วอลล์ไม่ใช่การกำหนดเส้นทาง และความแตกต่างนี้สำคัญเพราะเส้นทางถูกแทนที่ได้ด้วยการรีสตาร์ตเดมอน ขณะที่ตัวกรองยังอยู่ที่ที่คุณวางไว้ ต่อไปนี้จะดูว่าเส้นทางของแพ็กเก็ตตัดสินใจจริงอย่างไร แล้วจึงดูว่าจะจำกัดข้อยกเว้นที่ทำให้อุโมงค์เชื่อมต่อใหม่ได้อย่างไร
ทางออกในเครื่องเป็นฮุกคนละตัวกับการส่งต่อ
แพ็กเก็ตที่ออกจากแอปพลิเคชันบนเครื่อง จะผ่านฮุกขาออก ส่วนแพ็กเก็ตที่เครื่องกำหนดเส้นทางให้โฮสต์อื่นจะผ่านการส่งต่อ นโยบายที่กล่าวถึงเพียง forward จำกัดอย่างหลังและเปิดอย่างแรกกว้างไว้ นี่คือเหตุผลที่การล็อกทางออกจำนวนมากดูถูกต้องแต่ไม่ได้ทำอะไรเลย การจับคู่อินเทอร์เฟซก็อยู่ในกฎเดียวกัน: oifname "tun0" accept ปล่อยทราฟฟิกที่กำหนดเส้นทางออกผ่านอุโมงค์แล้วให้ผ่านไป การกำหนดเส้นทางและการกรองยังเป็นการตัดสินใจคนละเรื่อง ดังนั้นเส้นทางขึ้นสู่อินเทอร์เน็ตอาจมีอยู่ขณะที่ตัวกรองปฏิเสธแพ็กเก็ต คุณพึ่งพาการแยกนี้อยู่
เกตเวย์ที่ส่งต่อให้อุปกรณ์อื่นต้องใช้ทั้งสองฮุก การล็อกเฉพาะทางออกปกป้องเครื่องเองและปล่อยให้ไคลเอนต์ที่อยู่ข้างล่างทุกตัวรั่วไหลได้อย่างเสรี
เขียนรายการข้อยกเว้นจากปลายทางออกมาข้างนอก
เริ่มจากปลายทางของอุโมงค์: ที่อยู่ปลายทางหนึ่งแห่งหรือชุดเล็กที่อนุมัติแล้ว โปรโตคอลขนส่ง และพอร์ตปลายทาง เช่น udp dport 1194 ip daddr 203.0.113.7 accept หากไคลเอนต์แปลงชื่อโฮสต์ การแลกเปลี่ยน DNS ช่วงเริ่มต้นต้องมีกฎของตัวเองที่จำกัดเฉพาะรีโซลเวอร์และพอร์ต 53 ไม่ใช่การอนุญาตแบบเหมารวมไปยังที่อยู่ของรีโซลเวอร์นั้น ทุกข้อยกเว้นควรระบุเหตุผลที่มันมีอยู่ การอนุญาตให้ UDP ทั้งหมดไปยังพอร์ต VPN ครอบคลุมมากกว่าบริการที่ผ่านการยืนยันตัวตนเพียงตัวเดียวที่คุณคิดไว้มาก
การแปลงชื่อช่วงเริ่มต้นคือจุดที่ล็อกมักเน่าเสีย ชุดที่อยู่ที่รีเฟรชตามตัวจับเวลาต้องมีพฤติกรรมที่กำหนดไว้เมื่อการรีเฟรชล้มเหลว และพฤติกรรมนั้นจะเป็นการเปิดสายจนกว่าจะสำเร็จไม่ได้ รีเฟรชผ่านอุโมงค์ขณะที่อุโมงค์ยังขึ้นอยู่ และมิฉะนั้นให้กลับไปใช้ปลายทางที่ดีที่สุดเท่าที่รู้จักล่าสุด
การบริหารจัดการในเครื่องก็ต้องการการปฏิบัติแบบเดียวกัน ซับเน็ตสำหรับการจัดการไม่น่าเชื่อถือเพียงเพราะที่อยู่เป็นแบบส่วนตัว และกฎที่ไว้วางใจซับเน็ตนั้นก็เชิญทางที่สองให้อ้อมล็อกไป
การจับคู่อินเทอร์เฟซไม่ใช่หลักฐานของอุโมงค์ที่แข็งแรง
กฎที่ยอมรับทุกอย่างที่ออกจาก tun0 สันนิษฐานว่าแพ็กเก็ตบนอินเทอร์เฟซนั้นมาจากอุโมงค์ ชื่ออินเทอร์เฟซถูกสร้างใหม่ได้ และชื่อไม่ใช่ตัวตนเชิงรหัสลับ คู่สัญญาอาจหายไปแล้วในขณะที่อินเทอร์เฟซยังขึ้นอยู่ ซึ่งทำให้กฎกลายเป็นการไม่ทำอะไรที่ชวนเชื่ออย่างมาก
การติดตามการเชื่อมต่อเพิ่มกับดักที่เกี่ยวข้อง กฎกว้างสำหรับการเชื่อมต่อที่สร้างไว้แล้วจะเล่นซ้ำสิทธิ์ที่โฟลว์เคยได้รับมาก่อน ฉะนั้นเซสชันที่เริ่มก่อนอุโมงค์หลุดจึงทำงานต่อได้หลังหลุด จำกัดการยอมรับตามสถานะให้เหลือเฉพาะอินเทอร์เฟซและที่อยู่ที่คุณหมายถึงจริง ๆ มิฉะนั้นคุณสร้างล็อกที่เปิดตัวเอง อีกทั้งกฎขาเข้าและขาออกตอบคำถามคนละข้อ และการเสริมความแข็งแรงของอันหนึ่งโดยเพิกเฉยอีกอันจะทำให้เครื่องยังเข้าถึงได้ในทิศทางที่คุณไม่ได้คิดถึง
อะไรที่อยู่รอดเมื่อเดมอนพัง
ตัวกรองที่ติดตั้งโดยสคริปต์ซึ่งรันหลังอุโมงค์ขึ้นจะหายไปพร้อมกับอุโมงค์ ในช่วงเวลาที่ต้องการมันที่สุดพอดี โหลดล็อกตอนบูตและปล่อยให้เดมอนดูแลเฉพาะข้อยกเว้นของมันเอง
การลบเส้นทางเริ่มต้นก็ไม่ใช่ตัวแทนเช่นกัน เส้นทางคือสถานะที่เดมอนเป็นเจ้าของและเขียนใหม่ และการลบมันอาจเอาทางที่จำเป็นสำหรับการเชื่อมต่อใหม่ไปด้วย IPv6 ต้องมีแผนของตัวเอง เพราะการค้นหาเพื่อนบ้านและการประกาศของเราเตอร์เป็นบริการระดับลิงก์ที่ต้องทำงานต่อขณะที่ทราฟฟิกปกติถูกบล็อก DHCP ก็อยู่ในหมวดเดียวกัน เขียนสิ่งเหล่านี้เป็นข้อยกเว้นที่มีจุดมุ่งหมาย แทนที่จะค้นพบทีหลังในรูปของเหตุขัดข้อง
เส้นทางกู้คืนก่อนนำไปใช้
ทดสอบล็อกในแบบที่มันจะล้มเหลว: บูตโดยไม่มีอุโมงค์ ฆ่าเดมอน เปลี่ยนปลายทาง และเชื่อมต่อใหม่ ทุกกรณีควรทำให้แอปพลิเคชันหยุดชะงักและช่องทางกู้คืนยังใช้งานได้ ทำจากคอนโซล เพราะเชลล์ระยะไกลคือเซสชันที่มีโอกาสถูกล็อกออกด้วยกฎของคุณเองมากที่สุด
จากนั้นตรวจสอบว่าแอปพลิเคชันธรรมดายังเข้าถึงอะไรได้บ้าง ด้วยปลายทางที่ไม่เป็นอันตรายและคำขอที่ตรวจสอบได้ ผลลัพธ์ที่คุณต้องการคือการถูกปฏิเสธบนสายและการสำเร็จผ่านอุโมงค์ ไม่ใช่การหมดเวลาที่กำกวมซึ่งอาจหมายถึงทั้งสองอย่าง รักษาชุดกฎไว้ภายใต้เจ้าของเดียวกันกับไฟร์วอลล์ส่วนที่เหลือ แทนที่จะแทนที่ทั้งตารางจากสคริปต์เชลล์ นโยบายที่ทุกการอนุญาตสามารถให้เหตุผลแก่ตัวเองได้มีค่ามากกว่าชุดกฎยาว ๆ ที่ไม่มีใครอธิบายได้