为什么这个docker镜像允许通过防火墙?

时间:2016-02-20 02:59:32

标签: docker ubuntu-14.04 ufw

我正在运行一个端口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?

时,默认阻止所有端口被阻止

4 个答案:

答案 0 :(得分:2)

Docker默默地修改iptables。您可以通过编辑/ etc / default / docker

中的--iptables=false来使用DOCKER_OPTS选项启动Docker守护程序

答案 1 :(得分:1)

Docker修改iptables,UFW不知道这一点。

这个答案描述了正在发生的事情以及如何解决: https://stackoverflow.com/a/46266757

请关注它。

答案 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进行此操作。