7

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

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

容器 ID 图像命令创建状态端口名称
14417c4f71fb dockerui/dockerui "/dockerui" 2 秒前 上升 2 秒 0.0.0.0:9000->9000/tcp docker_ui

root@docker:~# ufw 状态
状态:活跃

采取行动
-- ------ ----
22 允许任何地方
80 允许任何地方
第443章
22 (v6) 允许在任何地方 (v6)
80 (v6) 允许在任何地方 (v6)
443 (v6) 允许在任何地方 (v6)

启用ufw时,默认情况下不是所有端口都被阻止吗?

4

4 回答 4

2

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

于 2016-02-20T03:05:00.890 回答
1

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

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

请遵循它。

于 2018-01-17T07:38:15.190 回答
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
于 2019-02-01T22:53:42.077 回答
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直接使用。

于 2020-05-24T07:54:41.767 回答