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

เริ่มที่เราเตอร์ ไม่ใช่ที่แล็ปท็อป

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

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

ไล่สามเส้นทางที่แพ็กเก็ตไปได้

ทราฟฟิกจากแล็ปท็อปไปยังอินเทอร์เน็ตถูกส่งต่อ จึงผ่านเชน FORWARD ทราฟฟิกที่เราเตอร์สร้างเอง เช่น การส่งต่อ DNS คำค้น NTP การอัปเดต DDNS และช่องควบคุม VPN จะผ่าน OUTPUT ทราฟฟิกการจัดการที่ส่งถึงเราเตอร์มาถึงผ่าน INPUT

ดังนั้นสวิตช์ตัดการเชื่อมต่อที่สร้างไว้เฉพาะใน FORWARD จึงปกป้องไคลเอนต์และไม่มีอะไรอื่น ตารางแสดงให้เห็นว่าทำไมการรั่วไหลในฉากเปิดจึงคาดเดาได้ไม่ใช่เรื่องลึกลับ

Packet pathExampleChain that sees it
LAN client to WAN or tunnelBrowser requestFORWARD
Router-originatedDDNS update, NTPOUTPUT
Addressed to the routerSSH from the LANINPUT

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

จัดลำดับกฎเพื่อให้อุโมงค์ยังคงขึ้นได้

สวิตช์ตัดการเชื่อมต่อที่ใช้งานได้คือรายการอนุญาตที่ลงท้ายด้วยการปฏิเสธ และลำดับคือสิ่งที่ทำให้มันเป็นสวิตช์ตัดการเชื่อมต่อไม่ใช่อิฐ อนุญาตลูปแบ็ก ปลายทาง VPN การตอบกลับของโฟลว์ที่สร้างแล้ว และอินเทอร์เฟซอุโมงค์ก่อน แล้วปฏิเสธส่วนที่เหลือเป็นลำดับสุดท้าย

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 198.51.100.7 -p udp --dport 51820 -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o wg0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j REJECT

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

สะท้อนรูปแบบเดียวกันใน FORWARD สำหรับทราฟฟิกไคลเอนต์ และวางกฎการจัดการที่ชัดเจนไว้เหนือการปฏิเสธ รักษากฎการจัดการนั้นให้แคบแต่เข้าถึงได้ และยืนยันด้วยการเปิดเซสชัน SSH ที่สองก่อนปิดเซสชันแรก การล็อกตัวเองออกระหว่างเปลี่ยนสวิตช์ตัดการเชื่อมต่อเป็นเรื่องปกติพอที่จะต้องวางแผน บนเราเตอร์ที่รัน WireGuard ค่า allowed-ips ของเพียร์เป็นตัวกำหนดว่าอะไรเข้าอุโมงค์ ขณะที่กฎเหล่านี้กำหนดว่าอะไรได้รับอนุญาตให้ออกโดยไม่มีอุโมงค์

IPv6 ต้องการประตูหน้าของตัวเอง

ทั้งหมดข้างต้นเป็น IPv4 หาก LAN ของคุณมี IPv6 ที่ใช้งานได้และอุโมงค์พาเฉพาะ IPv4 ทุกอุปกรณ์ที่ถูกครอบคลุมยังมีเส้นทางตรงสู่อินเทอร์เน็ตที่กฎใหม่ของคุณมองไม่เห็น แล็ปท็อปแบบ dual-stack จะเลือกเส้นทางนั้นอย่างยินดี และสวิตช์ตัดการเชื่อมต่อจะดูเสียเฉพาะกับคนที่ทดสอบด้วย IPv4

ip6tables -A FORWARD -i br-lan -j REJECT
ip6tables -A OUTPUT -o eth0 -j REJECT
ip6tables -A OUTPUT -o lo -j ACCEPT

ลำดับก็สำคัญที่นี่เช่นกัน การอนุญาตลูปแบ็กต้องมาก่อนการปฏิเสธ WAN ไม่เช่นนั้นบริการภายในบนเราเตอร์จะเริ่มล้มเหลวอย่างแปลกประหลาด หากเครือข่ายไม่ใช้ IPv6 เลย การปิดใช้งานบน WAN และ LAN ง่ายกว่าและไม่เหลืออะไรให้ลืม

ไคลเอนต์ VPN บางตัวติดตั้งเส้นทางเริ่มต้นเฉพาะ IPv4 และปล่อยค่าเริ่มต้น IPv6 ที่มีอยู่ไว้ไม่แตะต้อง ตรวจสอบตารางเส้นทางหลังอุโมงค์เชื่อมต่อ แทนที่จะสมมติว่าไคลเอนต์จัดการแล้ว

พิสูจน์ด้วยการปิดอุโมงค์

หยุดอุโมงค์จากเราเตอร์และทดสอบจากสามที่ตามลำดับนี้

# systemctl stop wg-quick@wg0
# ip route get 203.0.113.1
# curl -m 5 -sS http://example.com || echo blocked
# iptables -vnL OUTPUT | head
# ip6tables -vnL OUTPUT | head

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

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

ยอมรับการตั้งค่าก็ต่อเมื่อไคลเอนต์ LAN คำขอที่เราเตอร์สร้าง และคำขอ IPv6 ล้มเหลวทั้งหมดขณะอุโมงค์ปิด และทั้งสามทำงานได้อีกครั้งเมื่ออุโมงค์ขึ้น

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