我正在运行一个端口9000:9000
绑定到主机的docker容器,但我也启用了 ufw 。我唯一允许的端口是22, 80, 443
。
那么为什么我能够使用主机的IP地址连接到这个容器呢?不应该9000
阻止ufw
端口{{1}}
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14417c4f71fb dockerui/dockerui "/dockerui" 2 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp docker_ui root@docker:~# ufw status Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
启用ufw?
时,默认阻止所有端口被阻止答案 0 :(得分:2)
Docker默默地修改iptables。您可以通过编辑/ etc / default / docker
中的--iptables=false
来使用DOCKER_OPTS
选项启动Docker守护程序
答案 1 :(得分:1)
答案 2 :(得分:1)
添加“ --iptables = false”不是一个好的解决方案 正如我在这里所说的https://stackoverflow.com/a/54486957/1712906
更好的解决方案是将这些行添加到/etc/ufw/after.rules
# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
COMMIT
# END UFW AND DOCKER
答案 3 :(得分:1)
如@kliew所述,Docker将添加其自己的iptables链,授予对所有公开端口的访问权限,并抢占您使用ufw定义的任何规则。
但是,如果您不愿意完全禁用Docker对iptables的控制,则可以使用另一种有据可查的方式来遵守自己的规则。来自同一文档:
如果您需要添加在Docker规则之前加载的规则,请将其添加到DOCKER-USER链中。在Docker自动创建任何规则之前,将应用这些规则。
来源:https://docs.docker.com/network/iptables/#add-iptables-policies-before-dockers-rules
但是,这将阻止使用ufw,因为ufw仅在其自己的iptables链中运行,而不能让您控制DOCKER-USER链。您必须直接使用iptables
进行此操作。