为什么允许此 docker 图片通过防火墙?

Why is this docker image allowed past the firewall?

我是 运行 一个 docker 容器,其端口 9000:9000 绑定到主机,但我也启用了 ufw .我允许的唯一端口是 22, 80, 443.

那么为什么我能够使用主机的 IP 地址连接到这个容器?端口 9000 不应该被 ufw 阻止吗?

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 时,默认情况下不是所有端口都被阻止吗?

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

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

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

此回答描述了发生的情况以及解决方法:

请关注

添加“--iptables=false”不是一个好的解决方案 正如我在这里所说

更好的解决方案是将这些行添加到 /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

如@kliew 所述,Docker 将添加自己的 iptables 链,授予对所有公开端口的访问权限并抢占您使用 ufw 定义的任何规则。

如果您对完全禁用 Docker 对 iptables 的控制感到不自在,但是,还有另一种记录在案的方法可以让您遵守自己的规则。来自相同的文档:

If you need to add rules which load before Docker’s rules, add them to the DOCKER-USER chain. These rules are applied before any rules Docker creates automatically.

来源:https://docs.docker.com/network/iptables/#add-iptables-policies-before-dockers-rules

不过,这将排除 ufw 的使用,因为 ufw 仅在其自己的 iptables 链中运行,并且不会让您控制 DOCKER-USER 链。您必须直接使用 iptables 来执行此操作。