我正在运行一个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的时候,所有的端口不是都被默认阻塞了吗?
5条答案
按热度按时间kpbpu0081#
Docker静默地修改iptables。您可以通过在/etc/default/docker中编辑
DOCKER_OPTS
,使用--iptables=false
选项启动Docker守护进程z4iuyo4d2#
Docker修改了
iptables
,UFW并不知道这一点。此答案描述了发生了什么以及如何修复:https://stackoverflow.com/a/46266757
请遵照执行。
mcdcgff03#
添加“--iptables=false”不是一个好的解决方案,正如我在这里所说的https://stackoverflow.com/a/54486957/1712906
一个更好的解决方案是将这些行添加到/etc/ufw/后.rules
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
来完成此操作。gk7wooem5#
对我来说,“--iptables=false”不起作用,我的系统不使用ufw,所以我创建了另一个方法。OS Ubuntu/Debian。
已在/etc/中创建名为iptables的目录。
在这里,我保存了当前工作的iptables中的规则。
在/etc/rc.local中添加了以下行
现在,每次重新启动时,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。