为什么这个docker镜像可以通过防火墙?

kx1ctssn  于 2023-03-29  发布在  Docker
关注(0)|答案(5)|浏览(209)

我正在运行一个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的时候,所有的端口不是都被默认阻塞了吗?

kpbpu008

kpbpu0081#

Docker静默地修改iptables。您可以通过在/etc/default/docker中编辑DOCKER_OPTS,使用--iptables=false选项启动Docker守护进程

z4iuyo4d

z4iuyo4d2#

Docker修改了iptables,UFW并不知道这一点。
此答案描述了发生了什么以及如何修复:https://stackoverflow.com/a/46266757
请遵照执行。

mcdcgff0

mcdcgff03#

添加“--iptables=false”不是一个好的解决方案,正如我在这里所说的https://stackoverflow.com/a/54486957/1712906
一个更好的解决方案是将这些行添加到/etc/ufw/后.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
uidvcgyl

uidvcgyl4#

正如@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来完成此操作。

gk7wooem

gk7wooem5#

对我来说,“--iptables=false”不起作用,我的系统不使用ufw,所以我创建了另一个方法。OS Ubuntu/Debian。
已在/etc/中创建名为iptables的目录。

mkdir /etc/iptables
cd /etc/iptables

在这里,我保存了当前工作的iptables中的规则。

iptables-save > rules.v4 # IPv4 iptables rules
ip6tables-save > rules.v6 # IPv6 iptables rules

在/etc/rc.local中添加了以下行

#  Flush iptables rules
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F
#  Restore iptables rules from files
iptables-restore < /etc/iptables/rules.v4     # Restore ipv4 rules
ip5tables-restore < /etc/iptables/rules.v6    # Restore ipv6 rules

现在,每次重新启动时,iptables规则都将从/etc/iptables/rules.v4和/etc/iptables/rules.v6刷新和恢复。
如果你想修改ipv4规则或添加更多的规则,你可以在/etc/iptables/rules.v4中进行,然后执行iptables-restore〈/etc/iptables/rules.v4。如果你想修改ipv6规则或添加更多的规则,你可以在/etc/iptables/rules.v6中进行,然后执行ip 6 tables-restore〈/etc/iptables/rules.v6。

相关问题