นักเทียบท่า - พอร์ตที่เปิดเผยซึ่งเข้าถึงได้จากภายนอก - กฎ iptables ถูกละเว้น


15

ฉันมีที่จอดนักเทียบท่าทำงานเช่น:

 docker run --name some_container_1 -p 8080:80 -d some_image

ซึ่งใช้งานได้ดี คอนเทนเนอร์เปิดออกเป็นพอร์ต 80 ถึง 8080 และสามารถเข้าถึงได้จาก localhost

ด้วยเหตุผลบางอย่าง แต่ก็ไม่สนใจกฎ iptables INPUT อย่างสมบูรณ์และยังสามารถเข้าใช้จากภายนอกได้

ฉันจะ จำกัด การเข้าถึงคอนเทนเนอร์ Docker ของฉันให้อนุญาตเฉพาะเช่น IP 123.456.789.0 เพื่อเข้าถึงจากภายนอกได้อย่างไร

ขอบคุณ


sudo iptables -L -n -v - line-numbers

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2      365 23380 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        7   788 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
5        7   788 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       24  1524 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
3       15 13320 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 204 packets, 21792 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1       24  1524 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:80

sudo iptables- บันทึก

# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [100:16642]
:DOCKER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Apr  8 23:37:43 2015
# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015
*nat
:PREROUTING ACCEPT [13:2206]
:INPUT ACCEPT [1:64]
:OUTPUT ACCEPT [4:268]
:POSTROUTING ACCEPT [4:268]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
COMMIT
# Completed on Wed Apr  8 23:37:43 2015

ข้อมูลนักเทียบท่า

Containers: 1
Images: 25
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 27
Execution Driver: native-0.2
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
CPUs: 4
Total Memory: 7.746 GiB
Name: nuc-001
ID: WCMU:MN3T:VFKR:IU42:6423:OEI6:IB5Q:WBNV:K75H:JZDS:UWU5:57WD
WARNING: No memory limit support
WARNING: No swap limit support

ผู้ลงคะแนนอาจอธิบายได้ไหม?
binaryanomaly

1
ไม่ใช่ฉัน แต่ฉันคิดว่าใครก็ตามที่คิดว่านี่เป็นคำถามเซิร์ฟเวอร์ผิดมากกว่าคำถามโปรแกรม พวกเขาอาจจะถูก; คุณอาจต้องการย้ายข้อมูล

1
คุณสามารถแสดงผลลัพธ์ของiptables-save? ฉันสงสัยว่านักเทียบท่าจะทำการแปลพอร์ตด้วยกฎ iptables ผ่าน MASQUERADE / NAT ได้อย่างไร แต่ฉันไม่รู้จริงๆ
ComputerDruid

คำตอบ:


12

Internal Docker ใช้ iptables เพื่อส่งต่อการเชื่อมต่อไปยังโฮสต์นักเทียบท่าที่พอร์ต 8080 ไปยังบริการที่กำลังฟังอยู่ที่พอร์ต 80 บนคอนเทนเนอร์ กุญแจสำคัญในการกำหนดค่าของคุณคือสายนี้ -

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80

โดยการแทรก ( -I) สายไปข้างหน้าใหม่คุณสามารถป้องกันการเชื่อมต่อจากการถูกส่งต่อไปยังภาชนะ IP ในกรณีนี้ 172.17.0.2 ลองกฎนี้ -

/sbin/iptables -I FORWARD '!' -s 123.456.789.0 -d 172.17.0.2 -p tcp --dport 80 -j DROP


1
เป็นไปได้ไหมที่จะทำให้กฎนี้ถูกแทรกโดยอัตโนมัติเมื่อเริ่มคอนเทนเนอร์ใหม่?
Nicolas Massart

4

คุณสามารถผูกพอร์ตเข้ากับเครื่องท้องถิ่นของคุณ จากนั้นนักเทียบท่าจะไม่เปิดเผยพอร์ตไปด้านนอก (iptables)

docker run -p 127.0.0.1:8080:8080 some_image

ขอบคุณ! นี่คือวิธีที่แท้จริงในการเดินทางเอกสารยืนยันสิ่งนี้: docs.docker.com/engine/reference/commandline/run/…
เวอร์เนอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.