ทำไมเกตไฟร์วอลล์ที่ผูกกับสถานะ VPN ไม่ใช่กฎ ping เฉพาะผ่านอุโมงค์
กฎที่ตอบ ping เฉพาะขณะที่ VPN ที่ระบุชื่อเชื่อมต่ออยู่คือแนวนโยบายของที่อยู่สาธารณะที่ผูกกับสถานะที่ไม่เกี่ยวข้อง ไม่ใช่การอนุญาตเฉพาะอุโมงค์
ลองนึกถึงกฎไฟร์วอลล์ที่เปิด ICMP echo สำหรับที่อยู่สาธารณะของเซิร์ฟเวอร์ทุกครั้งที่มีโปรไฟล์ VPN ที่ระบุชื่อเชื่อมต่ออยู่ มันอ่านดูเหมือน «ping เฉพาะผ่านอุโมงค์» และการอ่านแบบนั้นผิดในแบบที่สำคัญ กฎนี้ไม่ได้จำกัดว่าใครเข้าถึงโฮสต์ได้ แต่เปลี่ยนสิ่งที่อินเทอร์เฟซสาธารณะตอบกลับขณะที่มีการเชื่อมต่ออื่นทำงานอยู่โดยบังเอิญ สองสิ่งนี้เป็นนโยบายที่ต่างกัน และหนึ่งในนั้นขยายการเปิดเผยอย่างเงียบ ๆ
กฎที่คุณคิดว่าคุณเขียน
ข้อกำหนดที่ตั้งใจไว้มักแคบ คือระบบตรวจสอบหรือผู้ดูแลเพียงคนเดียวบน VPN ควรยืนยันได้ว่าเซิร์ฟเวอร์ยังมีชีวิต เมื่อเขียนเป็นประโยค มันฟังดูเหมือนการควบคุมการเข้าถึงบนอุโมงค์ เมื่อเขียนเป็นออบเจ็กต์ไฟร์วอลล์ มันกลายเป็นเงื่อนไขบนโปรไฟล์สาธารณะ เพราะคำขอ echo มาถึงที่นั่น
เมื่อเงื่อนไขเป็นสถานะการเชื่อมต่อแทนที่จะเป็นที่อยู่ต้นทาง ชุดผู้ส่งที่อนุญาตก็ไม่ใช่ชุดเพียร์ของ VPN อีกต่อไป ใครก็ตามที่เข้าถึงที่อยู่สาธารณะได้สามารถส่งคำขอ echo ขณะที่เกตเปิดอยู่ อุโมงค์ไม่ได้กลายเป็นเส้นทาง แต่อุโมงค์กลายเป็นสวิตช์
คนที่ผลักดันแนวคิดนี้มักไม่ได้โกหกเกี่ยวกับผลที่ต้องการ พวกเขาต้องการการตรวจสอบที่ตอบเฉพาะเมื่อลิงก์แข็งแรง และสุขภาพของลิงก์นั้นสังเกตได้ง่ายที่สุดผ่าน VPN ข้อผิดพลาดคือการมองสัญญาณความพร้อมใช้งานเป็นการตัดสินใจเรื่องการเข้าถึง แล้วทำให้เป็นอัตโนมัติ
เกตควบคุมอะไรจริง ๆ
การออกแบบนี้รวมสองสิ่งที่เป็นอิสระต่อกัน และการแยกมันออกจากกันคือส่วนใหญ่ของการแก้ไข อย่างแรกคือขอบเขต คือที่อยู่ภายในใด ที่อยู่ระยะไกลใด โปรโตคอลใด และชนิด ICMP ใด อย่างที่สองคือเงื่อนไข คือออบเจ็กต์ของกฎถูกเปิดใช้อยู่ในขณะนี้หรือไม่ ขอบเขตคือสิ่งที่ไฟร์วอลล์ประเมินต่อแพ็กเก็ต ส่วนเงื่อนไขคือสิ่งที่สคริปต์เขียนลงที่เก็บนโยบาย และทั้งสองถูกกระทบยอดด้วยนาฬิกาที่ต่างกันโดยสิ้นเชิง
ถ้าข้อกำหนดเป็นเพียร์ของ VPN จริง ๆ ขอบเขตก็ตอบได้โดยไม่ต้องมีตรรกะสถานะการเชื่อมต่อใด ๆ คือผูกกฎกับอินเทอร์เฟซอุโมงค์หรือช่วงที่อยู่ของอุโมงค์ จำกัดที่อยู่ระยะไกลให้อยู่ในพูลไคลเอนต์ และระบุชนิด echo แทน «ICMP» กฎนั้นยังถูกต้องเมื่อไม่มี VPN ทำงานอยู่ และโปรไฟล์ที่ไม่เกี่ยวข้องก็เปิดมันไม่ได้
ถ้าข้อกำหนดเป็นเกตสาธารณะจริง ๆ ก็จงระบุในข้อความนโยบาย เพราะเกณฑ์การยอมรับเปลี่ยนไป เกตสาธารณะต้องระบุชื่อโปรไฟล์ที่แน่นอน นิยามว่าอะไรคือ «เชื่อมต่อแล้ว» และประกาศว่าผู้ส่งสาธารณะอยู่ในขอบเขตโดยการออกแบบ ความสับสนส่วนใหญ่หายไปในขณะที่มีคนถูกบังคับให้เขียนประโยคนั้น
สร้างออบเจ็กต์ครั้งเดียว แล้วสลับมัน
จัดเตรียมกฎเดียวที่มีอัตลักษณ์คงที่ไว้ล่วงหน้า ในสถานะปิดใช้งาน และปล่อยให้คอนโทรลเลอร์เปลี่ยนเฉพาะสถานะการเปิดใช้งาน การสร้างกฎตามชื่อที่แสดงในทุกรอบคือทางที่ทำให้ที่เก็บนโยบายจบลงด้วยออบเจ็กต์ที่เกือบเหมือนกันห้าชิ้นและไม่มีวิธีที่เชื่อถือได้ในการลบมัน
New-NetFirewallRule -Name "VpnGateEchoV4" -DisplayName "Public echo gated on VPN state" -Direction Inbound -Action Allow -Protocol ICMPv4 -IcmpType 8 -LocalAddress 203.0.113.10 -RemoteAddress Any -Enabled False
Set-NetFirewallRule -Name "VpnGateEchoV4" -Enabled True
ชื่อคือตัวระบุที่คงทน ชื่อที่แสดงคือเอกสารที่มนุษย์แก้ไขได้ ปรับให้ตรงกับ -Name แล้วสคริปต์จะหยุดสร้างสำเนา รูปแบบคำสั่งเดียวกันครอบคลุมกรณี IPv6 ด้วย -Protocol ICMPv6 -IcmpType 128 แต่นั่นเป็นกฎแยก เพราะหมายเลขชนิด echo ต่างกันระหว่างสองตระกูล
คงตระกูลที่อยู่และชนิด ICMP ให้ชัดเจนด้วยเหตุผลที่สอง: -Protocol ICMPv4 ที่ไม่มีชนิดจะอนุญาตทุกข้อความ ICMPv4 ที่โปรไฟล์อนุญาต รวมถึงข้อความที่คุณไม่เคยตั้งใจจะรับ การระบุชนิด 8 ทำให้กฎแคบลงเหลือคำขอ echo และนั่นคือสิ่งเดียวที่การตรวจสอบการเข้าถึงส่งออกไป
ที่ซึ่งระบบอัตโนมัติขัดกับเจตนา
การสำรวจโปรไฟล์ไคลเอนต์ทุกสองสามนาทีไม่สามารถสร้างขอบเขตทันทีได้ ระหว่างที่การเชื่อมต่อขาดกับรอบสำรวจถัดไป กฎยังคงตอบบนที่อยู่สาธารณะ และระหว่างที่การเชื่อมต่อกลับมากับรอบสำรวจถัดไป มันไม่ตอบ การยอมรับความล่าช้านั้นซื่อตรง แต่การอ้างว่าการออกแบบบังคับค่าคงที่ไม่แปรเปลี่ยนอย่างเข้มงวดนั้นไม่ซื่อตรง
มีกับดักด้านขอบเขตอยู่ในตัวการตรวจสอบสถานะเอง Get-VpnConnection รายงานโปรไฟล์ไคลเอนต์ที่กำหนดค่าไว้บนเครื่อง โดยค่าเริ่มต้นสำหรับผู้ใช้ปัจจุบัน และสำหรับผู้ใช้ทั้งหมดเมื่อใส่ -AllUserConnection มันไม่รายงานผู้ใช้ระยะไกลที่กำลังเชื่อมต่อเข้าเซิร์ฟเวอร์ RRAS อยู่ นั่นคือการสังเกตอีกแบบด้วยคำสั่งอีกตัว เกตที่สร้างบนสิ่งที่ผิดก็ไม่ได้เชื่อมกับอะไรเลย
จากนั้นครอบคลุมสถานะที่ไม่มีใครเขียนสคริปต์ คือการเริ่มต้นขณะที่กฎเปิดอยู่แล้วจากรอบก่อน การที่คอนโทรลเลอร์ล่มขณะเกตเปิด และโปรไฟล์ถูกลบในขณะที่กฎของมันยังมีชีวิตอยู่ แต่ละอย่างต้องมีค่าเริ่มต้นที่กำหนดไว้ และค่าเริ่มต้นที่ปลอดภัยสำหรับการอนุญาตสาธารณะคือปิดใช้งาน ถ้าข้อกำหนดทนหน้าต่างการสำรวจไม่ได้จริง ๆ กฎที่ผูกกับสถานะคือเครื่องมือที่ผิด และการบังคับใช้เป็นเรื่องของอุโมงค์ ไม่ใช่อินเทอร์เฟซสาธารณะ
สุดท้าย ทดสอบคำขอสาธารณะสองครั้ง ครั้งหนึ่งเมื่อการเชื่อมต่อที่เลือกทำงานอยู่ และอีกครั้งเมื่อมันดับ จากโฮสต์ที่ไม่ได้อยู่ใน VPN ping ที่สำเร็จจากภายในอุโมงค์ไม่ได้พิสูจน์อะไรเกี่ยวกับนโยบายนี้ และนั่นคือการวัดที่การติดตั้งส่วนใหญ่ข้ามไป