Score:1

ตรวจสอบให้แน่ใจว่าการรับส่งข้อมูล Docker สำหรับโหนดใน Swarm ผ่านการเชื่อมต่อ VPN เท่านั้น

ธง in

ฉันมีสองโหนดในคลัสเตอร์ Docker Swarm หนึ่งในโหนดเหล่านั้นมีการเชื่อมต่อไคลเอนต์ OpenVPN กับผู้ให้บริการ VPN บนอินเทอร์เฟซ จูน0. เป้าหมายของฉันคือ

  • บริการใด ๆ ที่กำหนดให้กับโหนดนี้ใช้การเชื่อมต่อ VPN เท่านั้น
  • ไม่มีการรั่วไหล (เช่น DNS หรือการรับส่งข้อมูลอื่นๆ)
  • หากยกเลิกการเชื่อมต่อ VPN การรับส่งข้อมูลทั้งหมดจะลดลง
  • อนุญาตให้ค้นหาบริการและการเชื่อมต่อกับคอนเทนเนอร์อื่นใน Swarm

สำหรับ DNS ฉันได้เพิ่มไฟล์ dns เข้าสู่ /etc/docker/daemon.json ที่ใช้เซิร์ฟเวอร์ DNS ของผู้ให้บริการ VPN ที่เข้าถึงได้ผ่าน VPN เท่านั้น

นี่คือกฎ iptable ที่ฉันคิดขึ้นมา:

iptables -I DOCKER-USER 1 -o tun0 -j ยอมรับ
iptables -I DOCKER-USER 2 -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ยอมรับ
iptables -I นักเทียบท่า-ผู้ใช้ 3 -j DROP

ผลลัพท์ที่ได้ นักเทียบท่า-ผู้ใช้ ห่วงโซ่มีลักษณะดังนี้:

Chain DOCKER-USER (อ้างอิง 1 รายการ)
 pkts bytes target prot เลือกใช้ปลายทางต้นทาง
    0 0 ยอมรับทั้งหมด -- * tun0 0.0.0.0/0 0.0.0.0/0
    0 0 ยอมรับทั้งหมด -- tun0 * 0.0.0.0/0 0.0.0.0/0 ctstate ที่เกี่ยวข้อง ก่อตั้ง
    0 0 ลดทั้งหมด -- * * 0.0.0.0/0 0.0.0.0/0

จากการทดสอบพื้นฐานอย่างการวิ่ง nslookup และ ขด ด้วยการเปิดและปิดการเชื่อมต่อ VPN กฎเหล่านี้ดูเหมือนจะใช้งานได้ แต่ฉันมีประสบการณ์น้อยมากกับ iptables นี่เป็นวิธีที่ถูกต้องในการทำเช่นนี้หรือไม่?

Score:1
ธง fr

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 ยอมรับ

มาดูความต้องการของคุณกันทีละข้อ:

  1. บริการใด ๆ ที่กำหนดให้กับโหนดนี้ใช้การเชื่อมต่อ VPN เท่านั้น

คุณจะไม่ใช้ IPtables เพื่อทำสิ่งนี้ เรียกใช้คำสั่งเหล่านี้บนเซิร์ฟเวอร์:

เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน ${LOCAL_VPN_IP} 

ฉันคิดว่าโดยทั่วไปแล้ว OpenVPN ใช้ 10.8.0.0/16 ดังนั้นเกตเวย์เริ่มต้นน่าจะเป็น 10.8.0.1 หรืออะไรทำนองนั้น IProute2 (คำสั่ง ip) ถูกสร้างขึ้นในเคอร์เนล เช่นเดียวกับ IPtables

  1. ไม่มีการรั่วไหล (เช่น DNS หรือการรับส่งข้อมูลอื่นๆ)

ก่อนอื่นคุณควรเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดผ่าน VPN โดยใส่สิ่งนี้ในการกำหนดค่าเซิร์ฟเวอร์ของ OpenVPN:

กด "redirect-gateway autolocal"

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

  1. หากยกเลิกการเชื่อมต่อ VPN การรับส่งข้อมูลทั้งหมดจะลดลง

ดูขั้นตอนที่ 2

  1. อนุญาตให้ค้นหาบริการและการเชื่อมต่อกับคอนเทนเนอร์อื่นใน Swarm

ฉันเชื่อว่า OpenVPN ทำสิ่งนี้ตามค่าเริ่มต้น ฉันสามารถ ping/arp จากไคลเอนต์หนึ่งไปยังไคลเอนต์อื่นที่อยู่บนเซิร์ฟเวอร์ OpenVPNคุณควรจะสามารถเข้าถึงบริการที่อยู่ในไคลเอ็นต์รายอื่นได้อย่างแน่นอน

ฉันหวังว่านี่จะตอบคำถามของคุณ!

in flag
ขอขอบคุณ! ฉันได้แก้ไขคำถามของฉันให้ชัดเจนยิ่งขึ้น ต่อไปนี้คือคำถามติดตามผล... 1. กฎ `INPUT 1` และ `OUTPUT 2` กำหนดเส้นทางทราฟฟิกผ่านซับเชน DOCKER-USER จำเป็นหรือไม่เนื่องจาก Docker จัดการกฎภายใต้ห่วงโซ่ FORWARD โดยอัตโนมัติ 2. สำหรับกฎเดิมของฉัน ฉันควรใช้ RETURN เพื่ออนุญาตให้ผ่าน FORWARD subchain อื่นๆ หรือ ACCEPT 3. คำสั่ง `ip route` ซ้ำซ้อนหรือไม่? การรับส่งข้อมูลทั้งหมดจะไม่ถูกบังคับผ่านอินเทอร์เฟซ `tun0` โดยไม่คำนึงถึงกฎ iptables หรือไม่
fr flag
1. ได้ คุณยังสามารถเพิ่ม `iptables -t filter -A FORWARD -j DOCKER-USER` `INPUT` ใช้สำหรับทราฟฟิกที่ปลายทางสำหรับเซิร์ฟเวอร์ `OUTPUT ' สำหรับการทราฟฟิกที่มาจากเซิร์ฟเวอร์ และ 'FORWARD' สำหรับการทราฟฟิกที่ไม่ได้เริ่มต้นหรือสิ้นสุดที่เซิร์ฟเวอร์ กล่าวอีกนัยหนึ่ง `FORWARD' คือสิ่งที่เราเตอร์ทำเมื่อคอมพิวเตอร์เชื่อมต่อกับ google.com 2. `RETURN` ไม่มีประโยชน์เว้นแต่คุณจะอยู่ในซับเชนและต้องการกลับไปที่เชนในระดับที่สูงขึ้น 3. `ip route` ไม่ซ้ำซ้อน `iptables` อนุญาตหรือไม่อนุญาตให้แพ็กเก็ต แต่ไม่ได้บอกเซิร์ฟเวอร์ของคุณว่าจะส่งแพ็กเก็ตไปที่ใด `เส้นทาง ip` ไม่
in flag
1. คุณกำลังบอกว่าฉันสามารถใช้ `iptables -t filter -A FORWARD -j DOCKER-USER` แทนการเพิ่มกฎ `INPUT` และ `OUTPUT` ที่คุณพูดถึงได้หรือไม่ 2. `DOCKER-USER` เป็นซับเชนที่จัดการโดย Docker ของ `FORWARD` ดังนั้นควรใช้ `RETURN` เพื่อย้อนกลับไปยังเชน `FORWARD` หรือไม่ 3. สมเหตุสมผล ฉันจะต้องดูเพิ่มเติมเกี่ยวกับเรื่องนี้ เนื่องจากเส้นทางเริ่มต้นปัจจุบันของฉันต้องผ่าน IP ในเครื่องของฉัน
fr flag
1.`INPUT`, `OUTPUT` และ 'FORWARD' ล้วนทำหน้าที่ต่างกัน ดังนั้นคุณต้องรวม 3 ฟังก์ชันนี้ไว้ด้วยหากต้องการให้ VPN จัดการทราฟฟิกทั้งหมดของคุณ 2. หาก `INPUT`, 'OUTPUT` และ 'FORWARD' ถูกส่งไปยัง 'DOCKER-USER' ทั้งหมด เชน 'DOCKER-USER' จะจัดการทราฟฟิกทั้งหมดสำหรับเชนทั้ง 3 ซึ่งหมายความว่าคุณไม่จำเป็นต้อง `RETURN ` อะไรก็ได้ที่เชน 'FORWARD' เนื่องจากเชน 'FORWARD' จะถูกจัดการตามกฎใน 'DOCKER-USER'
in flag
ด้วยการโยงย่อย 'DOCKER-USER' เข้ากับ 'INPUT' และ 'OUTPUT' นั่นจะไม่ใช้กฎเหล่านั้นกับทราฟฟิกทั้งหมด รวมถึงโฮสต์ด้วยหรือไม่ ดูเหมือนว่าจะทิ้งทุกอย่างไว้ที่อินเทอร์เฟซทางกายภาพของฉัน `eth0` รวมถึงการเชื่อมต่อกับ VPN เนื่องจากไม่เป็นไปตามกฎของ ACCEPT
in flag
นี่คือเอกสารสำหรับ Docker iptables เป็นข้อมูลอ้างอิง https://docs.docker.com/network/iptables/ บรรทัดที่น่าสนใจคือ "Docker ติดตั้ง iptables chains แบบกำหนดเองสองอันชื่อ DOCKER-USER และ DOCKER และช่วยให้มั่นใจได้ว่าแพ็คเก็ตที่เข้ามาจะได้รับการตรวจสอบโดยสอง chains นี้ก่อนเสมอ"
fr flag
ขอโทษที่ตอบช้า ฉันไม่ว่าง ดังนั้นฉันไม่รู้ว่า Docker สร้างเครือข่ายเหล่านั้น ที่ถูกกล่าวว่าคุณพูดถูก ดูเหมือนว่า `DOCKER-USER` จะตรวจสอบ "แพ็กเก็ตขาเข้า" จากความเข้าใจของฉันเท่านั้น ดังนั้น หากคุณต้องการให้แพ็กเก็ตขาออกผ่าน VPN เท่านั้น คุณควรทำบางอย่างเช่น `iptables -t filter -A OUTPUT -o tun0 -j ACCEPT` ตามด้วย `iptables -t filtler -A OUTPUT ! -o tun0 -j DROP` หรือคุณสามารถมี `iptables -t filter -A OUTPUT -j DROP` หลังกฎ ACCEPT
in flag
ขอบคุณสำหรับการติดตาม! ตอนนี้โซ่สมเหตุสมผลแล้วฉันจะนำไปใช้ สำหรับเส้นทาง ip ดูเหมือนว่า OpenVPN จะทำโดยอัตโนมัติระหว่างการเริ่มต้น ด้วย `เส้นทางเพิ่ม 0.0.0.0/1 ผ่าน REMOVED' และ '128.0.0.0/1 ผ่าน REMOVED' ขออภัย ฉันไม่สามารถยืนยันได้ว่าเซิร์ฟเวอร์ OpenVPN มีการตั้งค่า 'redirect-gateway autolocal' หรือไม่ คุณรู้วิธียืนยันสิ่งนี้หรือไม่?
fr flag
คุณต้องใส่ `push "redirect-gateway autolocal" ลงในไฟล์กำหนดค่าเซิร์ฟเวอร์ OpenVPN ของคุณ ด้วยวิธีนี้ จะส่งการตั้งค่าดังกล่าวไปยังไคลเอนต์เพื่อเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดของพวกเขา แต่ดูเหมือนว่า OpenVPN จะต้องมีการตั้งค่าบางอย่างที่เปิดใช้งานตามค่าเริ่มต้น คำสั่งเส้นทางเหล่านั้นควรเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดผ่าน VPN

โพสต์คำตอบ

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