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

ปักหมุดไคลเอนต์ก่อนเขียนกฎ

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

หากต้องการผูกที่อยู่กับใบรับรอง ให้สร้างไฟล์ในไดเรกทอรีที่ client-config-dir ระบุ และตั้งชื่อไฟล์ให้ตรงกับ common name ของใบรับรอง ใส่คำสั่งหนึ่งบรรทัด ifconfig-push 10.8.0.6 255.255.255.0 แล้วไคลเอนต์นั้นจะคงที่อยู่ทันเนลเดิมเมื่อเชื่อมต่อใหม่ การตั้งค่าสองอย่างต้องมีเพื่อให้ได้ผล: ต้องประกาศ client-config-dir ในการกำหนดค่าเซิร์ฟเวอร์ และที่อยู่ที่ส่งไปต้องอยู่ในซับเน็ตที่เซิร์ฟเวอร์กำหนดเส้นทางได้ หากขาดอย่างใดอย่างหนึ่ง ไฟล์จะถูกเพิกเฉยโดยไม่แจ้งข้อผิดพลาด ซึ่งทำให้การทดสอบไฟร์วอลล์ครั้งถัดไปเข้าใจผิด

การบล็อกชั่วคราวใช้ที่อยู่จากพูลได้ ตราบใดที่ตั๋วบันทึกว่าเซสชันใดถืออยู่ตอนนั้น

ลำดับเป็นตัวกำหนดว่าการทิ้งจะทำงานหรือไม่

บนเกตเวย์ Linux ที่ส่งต่อระหว่างทันเนลและ LAN แพ็กเก็ตจะผ่านเชน FORWARD อ่านคำสั่งด้านล่างเป็นประโยค: แทรกที่หัวของ FORWARD จับคู่ทราฟฟิกที่เข้าจาก tun0 จากโฮสต์เดียวนั้น ที่ส่งไปยังซับเน็ต LAN แล้วทิ้ง

iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP

-I คือสิ่งที่ทำให้กฎทำงาน เมื่อเพิ่มด้วย -A มันจะไปอยู่ใต้การอนุญาตแบบกว้างใด ๆ สำหรับซับเน็ตทันเนลและไม่เคยเห็นแพ็กเก็ต ตรวจสอบตำแหน่งด้วย iptables -vnL FORWARD --line-numbers และอ่านตัวนับด้วย: การทิ้งที่อยู่บนสุดซึ่งไม่นับอะไรเลยหมายความว่าทราฟฟิกมาทางอื่น

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

สิ่งที่ตัวกรองมองไม่เห็น

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

ทราฟฟิกระหว่างเพียร์ไม่เคยแตะไฟร์วอลล์ของโฮสต์ เมื่อเปิด client-to-client OpenVPN จะส่งแพ็กเก็ตเหล่านั้นภายในเดมอน ดังนั้นทั้ง FORWARD และ INPUT จึงไม่เห็น ทางแก้เดียวคือปิด client-to-client หรือยอมรับว่าเพียร์เข้าถึงกันได้ กฎ iptables จะไม่เห็นทราฟฟิกนั้น

IPv6 เฟิร์มแวร์ และการอยู่รอดหลังรีบูต

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

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

ตรวจสอบตามเส้นทาง แล้วย้อนกลับอย่างสะอาด

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

เส้นทางคาดหวังเมื่อมีกฎเมื่อล้มเหลว
ไคลเอนต์ที่ถูกบล็อกไปยังโฮสต์ LANไม่มีการตอบสนองกฎอยู่ใต้การอนุญาต หรือแหล่งไม่ตรงกัน
ไคลเอนต์ที่ถูกบล็อกไปยังอินเทอร์เน็ตทำงานผ่าน tun0กฎกว้างเกินไป ไม่มีการจับคู่ปลายทาง
ไคลเอนต์ที่สองไปยังโฮสต์ LAN เดียวกันทำงานกฎตรงกับมากกว่าโฮสต์ที่ตั้งใจ
ไคลเอนต์ที่ถูกบล็อกไปยังที่อยู่ LAN ของเกตเวย์บล็อกเฉพาะเมื่อมีกฎ INPUT ที่ตรงกันไม่มีกฎ INPUT
ไคลเอนต์ที่ถูกบล็อกไปยังที่อยู่ทันเนลของเพียร์ยังทำงานclient-to-client เปิดอยู่และอยู่นอกขอบเขตไฟร์วอลล์

การย้อนกลับคือการลบตามข้อกำหนด ไม่ใช่ flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP ลบรายการนั้นพอดีและปล่อยส่วนที่เหลือของเชนไว้เหมือนเดิม ลบบรรทัดเดียวกันออกจากไฟล์ใดก็ตามที่กู้คืนกฎตอนบูต โหลดใหม่ และยืนยันว่าไคลเอนต์เข้าถึงโฮสต์ LAN ได้อีกครั้ง flush ของ FORWARD จะย้อนกฎที่คุณไม่ได้เขียนด้วย ซึ่งทำให้การย้อนกลับกลายเป็นเหตุการณ์ที่สอง

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

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