Score:0

วิธีบล็อกการสื่อสารคอนเทนเนอร์ (172.17.0.0/16) ยกเว้นเกตเวย์เริ่มต้นด้วย iptables

ธง cn

ฉันใช้นักเทียบท่าเพื่อเรียกใช้คอนเทนเนอร์
ฉันไม่ต้องการให้คอนเทนเนอร์เข้าถึงคอนเทนเนอร์อื่น แต่ฉันต้องการให้คอนเทนเนอร์ยังคงเข้าถึงการสื่อสารภายนอกเช่นการใช้ การปรับปรุงที่เหมาะสม.

เครือข่ายคอนเทนเนอร์คือ 172.17.0.0/16ถ้าฉันบล็อกแบบนั้น:

iptables -I FORWARD -i docker0 -d 172.17.0.0/16 -j DROP

มันใช้งานได้ แต่ใช้ไม่ได้ การปรับปรุงที่เหมาะสมไม่พบแหล่งดาวน์โหลดเนื่องจากอาจออกจากเกตเวย์
ดังนั้นฉันต้องการอนุญาตการเชื่อมต่อกับเกตเวย์ (172.17.0.1) ดังนั้นฉันจึงพยายามอนุญาตเช่นนั้น:

iptables -A INPUT -i นักเทียบท่า 0 -d 172.17.0.1/32 -j ยอมรับ
iptables -A OUTPUT -o นักเทียบท่า 0 -d 172.17.0.1/32 -j ยอมรับ

แต่ปัญหาก็ยังมีอยู่คือใช้งานไม่ได้ การปรับปรุงที่เหมาะสม:

ข้อผิดพลาด: 1 http://archive.ubuntu.com/ubuntu โฟกัส InRelease
  การแก้ไข 'archive.ubuntu.com' ล้มเหลวชั่วคราว

เมื่อฉันลบกฎการบล็อกเท่านั้น การทำงานอีกครั้ง:

iptables -I FORWARD -i docker0 -d 172.17.0.0/16 -j DROP
A.B avatar
cl flag
A.B
ฉันไม่สามารถจำลองปัญหาของคุณ เรียกใช้คอนเทนเนอร์เดเบียนสองคอนเทนเนอร์ที่มี 172.17.0.2 และ 172.17.0.3 บน docker0 พวกเขาไม่สามารถสื่อสารกับกฎ FORWARD DROP ของคุณ (นั่นเป็นเพราะ Docker เปิดใช้งาน `net.bridge.bridge-nf-call-iptables` โดยวิธีการ) แต่พวกเขา ไม่มีปัญหาในการเข้าถึงโฮสต์ผ่าน 172.17.0.1 รวมถึงคำขอ DNS หรือรัน `apt update` และ `apt install hello` ได้สำเร็จ
A.B avatar
cl flag
A.B
บางทีคุณอาจมีกฎการปิดกั้นอื่น ๆ และคุณต้องการเช่นเดียวกับที่คุณทำกับ FORWARD เพื่อแทนที่ "-A" เหล่านี้ด้วย "-I"
A.B avatar
cl flag
A.B
หรือ DNS ของคุณถูกจัดการโดยคอนเทนเนอร์... หรือพร็อกซี... คุณจะต้องทำการทดสอบแยกกันกับ IP และ DNS เพื่อดูว่ามีอะไรผิดปกติ
A.B avatar
cl flag
A.B
และความคิดเห็นสุดท้าย แต่ไม่ท้ายสุด: คุณควรสร้างเครือข่ายเพิ่มเติมและเรียกใช้คอนเทนเนอร์ในเครือข่ายเพื่อแยกออกจากกันแทนที่จะต้องเล่นซอ (แทนที่จะเป็น Docker) ด้วยกฎ https://docs.docker.com/network/network-tutorial-standalone/#use-user-defined-bridge-networks
Score:0
ธง sb

สิ่งนี้จะช่วยให้คุณสามารถหยุดการสื่อสารระหว่างคอนเทนเนอร์:

สร้างเครือข่ายโดยปิดใช้งาน ICC:

เครือข่ายนักเทียบท่าสร้าง -o com.docker.network.bridge.enable_icc=false my_secure_bridge

ทดสอบด้วยการสร้างสองคอนเทนเนอร์:

นักเทียบท่าเรียกใช้ --name cnt1 --network=my_secure_bridge -it --rm -d alpine
นักเทียบท่าเรียกใช้ --name cnt2 --network=my_secure_bridge -it --rm -d alpine
นักเทียบท่าตรวจสอบ cnt1 | grep -i 172
    "เกตเวย์": "172.19.0.1",
    "ที่อยู่ IP": "172.19.0.2",
นักเทียบท่าตรวจสอบ cnt2 | grep -i 172
    "เกตเวย์": "172.19.0.1",
    "ที่อยู่ IP": "172.19.0.3",

exec เป็นหนึ่งเดียวและตรวจสอบ:

นักเทียบท่า exec -it cnt1 sh

ตรวจสอบการเชื่อมต่อกับโลกภายนอก:

/ # ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 ไบต์ข้อมูล
64 ไบต์จาก 8.8.8.8: seq=0 ttl=114 เวลา=0.852 ms
64 ไบต์จาก 8.8.8.8: seq=1 ttl=114 เวลา=0.990 ms
64 ไบต์จาก 8.8.8.8: seq=2 ttl=114 เวลา=0.808 ms
--- สถิติ ping 8.8.8.8 ---
ส่ง 3 แพ็กเก็ต ได้รับ 3 แพ็กเก็ต สูญเสียแพ็กเก็ต 0%
ไป-กลับ นาที/เฉลี่ย/สูงสุด = 0.808/0.883/0.990 ms

ตรวจสอบการเชื่อมต่อกับคอนเทนเนอร์อื่น:

/ # ping -w 5 172.19.0.3
PING 172.19.0.3 (172.19.0.3): 56 ไบต์ข้อมูล
--- สถิติ ping 172.19.0.3 ---
ส่ง 5 แพ็กเก็ต ได้รับ 0 แพ็กเก็ต สูญเสียแพ็กเก็ต 100%
djdomi avatar
za flag
แต่ความปลอดภัยจะมีประโยชน์อะไรในกรณีที่คอนเทนเนอร์เชื่อมต่อกันไม่ได้?
jabbson avatar
sb flag
@djdomi ข้อดีคือสิ่งนี้จะช่วยแก้ปัญหาในคำอธิบายซึ่งผู้เริ่มต้นหัวข้อระบุว่า "ต้องการให้คอนเทนเนอร์เข้าถึงคอนเทนเนอร์อื่นได้ แต่ฉันต้องการให้พวกเขายังคงสามารถเข้าถึงการสื่อสารภายนอกได้"
djdomi avatar
za flag
บังเอิญพิมพ์ผิด? คุณบอกว่าทุกคนต้องเข้าถึงได้ทุกที่ นั่นคือพฤติกรรมเริ่มต้นหากกำหนดค่าถูกต้องหรือไม่

โพสต์คำตอบ

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