IPtables เป็นเส้นตรงและอ่านกฎจากบนลงล่างจนกว่าจะถึงเป้าหมายที่ยอมรับ ปฏิเสธ หรือปล่อย จากนั้นจะหยุดอ่านกฎ ในกรณีของคุณ คุณอยากมี iptables -I DOCKER-USER -j DROP
เป็นกฎสุดท้ายในห่วงโซ่ของคุณ มิฉะนั้น ทุกแพ็กเก็ตจะถูกทิ้ง นอกจากนี้ ไม่จำเป็นต้องมีกฎ RETURN ในตอนท้าย เนื่องจาก IPtables จะหยุดอ่านกฎเมื่อถึงกฎ DROP ที่อยู่เหนือกฎนั้น กฎ IPtables ที่มี tun0 ดูดี แต่ต้องแน่ใจว่าคุณมีกฎเหล่านี้ด้วย:
iptables -t filter -I INPUT 1 -i tun0 -j DOCKER-USER
iptables -t filter -I OUTPUT 2 -o tun0 -j DOCKER-USER
เพื่อแนวทางปฏิบัติที่ดี ตรวจสอบให้แน่ใจว่าคุณยอมรับการรับส่งข้อมูลย้อนกลับทั้งหมด ซึ่งจะไม่มีทางเข้าถึงอินเทอร์เน็ตและจะไม่ออกจากเครื่อง:
iptables -t filter -I INPUT 3 -i tun0 -j ยอมรับ
มาดูความต้องการของคุณกันทีละข้อ:
- บริการใด ๆ ที่กำหนดให้กับโหนดนี้ใช้การเชื่อมต่อ VPN เท่านั้น
คุณจะไม่ใช้ IPtables เพื่อทำสิ่งนี้ เรียกใช้คำสั่งเหล่านี้บนเซิร์ฟเวอร์:
เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน ${LOCAL_VPN_IP}
ฉันคิดว่าโดยทั่วไปแล้ว OpenVPN ใช้ 10.8.0.0/16 ดังนั้นเกตเวย์เริ่มต้นน่าจะเป็น 10.8.0.1 หรืออะไรทำนองนั้น IProute2 (คำสั่ง ip) ถูกสร้างขึ้นในเคอร์เนล เช่นเดียวกับ IPtables
- ไม่มีการรั่วไหล (เช่น DNS หรือการรับส่งข้อมูลอื่นๆ)
ก่อนอื่นคุณควรเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดผ่าน VPN โดยใส่สิ่งนี้ในการกำหนดค่าเซิร์ฟเวอร์ของ OpenVPN:
กด "redirect-gateway autolocal"
สิ่งนี้ทำให้ไคลเอนต์ใส่ทราฟฟิกทั้งหมดผ่าน VPN แม้แต่ DNS และอื่น ๆ หากเซิร์ฟเวอร์ OpenVPN หยุดทำงาน อินเทอร์เน็ตจะหยุดทำงานกับไคลเอ็นต์
- หากยกเลิกการเชื่อมต่อ VPN การรับส่งข้อมูลทั้งหมดจะลดลง
ดูขั้นตอนที่ 2
- อนุญาตให้ค้นหาบริการและการเชื่อมต่อกับคอนเทนเนอร์อื่นใน Swarm
ฉันเชื่อว่า OpenVPN ทำสิ่งนี้ตามค่าเริ่มต้น ฉันสามารถ ping/arp จากไคลเอนต์หนึ่งไปยังไคลเอนต์อื่นที่อยู่บนเซิร์ฟเวอร์ OpenVPNคุณควรจะสามารถเข้าถึงบริการที่อยู่ในไคลเอ็นต์รายอื่นได้อย่างแน่นอน
ฉันหวังว่านี่จะตอบคำถามของคุณ!