为什么允许此 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
来执行此操作。
我是 运行 一个 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
来执行此操作。