ต่อสู้กับกฎไฟร์วอลล์ด้วยคอนเทนเนอร์ Docker
การตั้งค่ามีดังนี้
การติดตั้งแบบบางของ Debian 11 ที่ใช้ Docker (แบบสแตนด์อโลน)
ติดตั้งบน Docker คือ Portainer และเว็บคอนเทนเนอร์อีก 4 รายการ
ทั้งหมดเชื่อมต่อกับเครือข่าย Bridged เดียวที่เรียกว่า dkr-lan
ละเว้นคอนเทนเนอร์ porttainer คอนเทนเนอร์อื่นมีการแมปพอร์ตต่อไปนี้
- เว็บ01 8081:80
- เว็บ02 8082:80
- เว็บ03 8083:80
- เว็บ04 8084:80
web01 และ web03 สามารถเข้าถึงได้จากทุกที่บนพอร์ต 8081 และ 8083
อย่างไรก็ตาม web02 สามารถเข้าถึงได้โดย IP สาธารณะ 2 รายการเท่านั้น 1.2.3.4 และ 1.2.3.5
ในทำนองเดียวกัน web04 สามารถเข้าถึงได้โดย IP สาธารณะ 1.2.3.4 เดียวเท่านั้น
ฉันใช้ iptables และเริ่มพยายามตั้งค่ากฎในห่วงโซ่ DOCKER-USER แต่ดูเหมือนว่าจะกรองแพ็กเก็ตหลังจาก NAT เกิดขึ้นเท่านั้น และดูเหมือนว่าคอนเทนเนอร์ทั้งหมดหลังจาก NAT ใช้พอร์ต 80 ฉันไม่สามารถหาวิธียอมรับ web02 และ web04 สำหรับ IP เหล่านั้นและทิ้งส่วนที่เหลือ
หลังจากการค้นหาเล็กน้อย ฉันเริ่มคิดว่าตัวเลือกที่ดีที่สุดคือการกรองในห่วงโซ่ PREROUTING
โดยมีกติกาดังนี้
#สำหรับweb01
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8081 -j MARK --set-mark 1
#สำหรับweb02
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8082 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.5 --dport 8082 -j MARK --set-mark 1
#สำหรับweb03
iptables -t mangle -A PREROUTING -p TCP -s 0/0 --dport 8083 -j MARK --set-mark 1
#สำหรับweb04
iptables -t mangle -A PREROUTING -p TCP -s 1.2.3.4 --dport 8084 -j MARK --set-mark 1
# อนุญาตการรับส่งข้อมูลทั้งหมดที่ทำเครื่องหมายไว้ใน PREROUTING
# ปิดกั้นการรับส่งข้อมูลอื่น ๆ ทั้งหมด
iptables -A DOCKER-USER -m เครื่องหมาย --mark 1 -j ยอมรับ
iptables -A DOCKER-USER -p TCP --dport 8082 -j DROP
iptables -A DOCKER-USER -p TCP --dport 8084 -j DROP
ฉันเห็นว่าทราฟฟิกขาเข้ากำลังเข้าสู่กฎ PREROUTING เนื่องจากตัวนับเพิ่มขึ้นและนั่นก็ดูโอเค
อย่างไรก็ตามบล็อกไม่ทำงาน นี่เป็นเพราะมีการทำในห่วงโซ่ DOCKER-USER และในขั้นตอนนั้นพวกเขาอยู่หลัง NAT
แล้วฉันจะตั้งค่ากฎที่อนุญาต IP ตาม DPORT แล้วบล็อกการรีเซ็ตตาม DPORT ได้อย่างไร
คาดเดาสิ่งนี้ต้องทำในห่วงโซ่ PREROUTING หรือไม่
และต้องมีความเพียรด้วย ในขณะนี้ ทุกครั้งที่ฉันหยุดและเริ่มคอนเทนเนอร์ ดูเหมือนว่าจะละเมิดกฎไฟร์วอลล์และทุกอย่างจะเปิดขึ้นอีกครั้งสำหรับ ALL สิ่งนี้กำลังดำเนินการในห่วงโซ่ DOCKER ดังนั้นเดาว่าฉันต้องใส่กฎของฉันใน PREROUTING หรือ DOCKER-USER
ฉันพลาดอะไรไป