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

สามเงื่อนไข ตามลำดับนี้

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

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

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

การจัดประเภทคือประตูด่านแรก

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

Get-NetConnectionProfile | Select-Object Name,InterfaceAlias,NetworkCategory
Get-NetAdapter | Select-Object Name,InterfaceDescription,Status,ifIndex
Get-NetFirewallProfile | Select-Object Name,Enabled,DefaultOutboundAction

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

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

ข้อยกเว้นของปลายทางต้องมีทั้งเส้นทางและกฎ

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

New-NetFirewallRule -DisplayName "VPN endpoint allow" -Direction Outbound -Action Allow \
  -Protocol TCP -RemoteAddress 203.0.113.9 -RemotePort 443 -InterfaceType Wired,Wireless
New-NetRoute -DestinationPrefix 203.0.113.9/32 -InterfaceIndex 12 -NextHop 192.168.1.1
Get-NetRoute -DestinationPrefix 203.0.113.9/32

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

รักษาข้อยกเว้นให้แคบเท่าที่ไคลเอนต์ยอมให้ หนึ่งแอดเดรสกับหนึ่งพอร์ตตรวจสอบได้ แต่ช่วงที่ครอบเครือข่ายทั้งหมดของผู้ให้บริการตรวจสอบไม่ได้ กฎที่กว้างกว่านั้นยังอนุญาตทุกอย่างอื่นที่โฮสต์อยู่กับผู้ให้บริการรายเดียวกัน ซึ่งมักมากกว่าที่ตั้งใจ

DNS และ IPv6 คือจุดที่มันล้มเหลวแบบเปิด

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

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

GapWhat leaksControl
Resolver permitted for endpoint lookupEvery name queried while downPin the endpoint as an address, or block non-tunnel DNS
Rules only for IPv4Full IPv6 connectivityAdd the same rules for the other family
Application bound to physical interfaceIts own trafficFirewall cannot fix this; change the binding

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

ทดสอบด้วยการหยุดไคลเอนต์ ไม่ใช่การดึงสาย

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

Stop-Service -Name "YourVpnService" -Force
Test-NetConnection -ComputerName 1.1.1.1 -Port 443
Resolve-DnsName example.com
Test-NetConnection -ComputerName 2606:4700:4700::1111 -Port 443

ทั้งสามควรล้มเหลว ถ้าอันแรกสำเร็จ การบล็อกไม่ได้ผล ถ้าอันที่สองสำเร็จในที่ที่อันแรก ล้มเหลว คุณมีการรั่วไหลของ DNS ถ้าอันที่สามสำเร็จ IPv6 ไม่ถูกครอบคลุม แต่ละผลชี้ไปที่ช่องว่างข้างต้นอย่างใดอย่างหนึ่งพอดี

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

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

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