我有一个在 docker 实例中运行的 web 服务,该实例使用以下命令运行:
sudo docker run -d -p 4040:4040 ....
我的 UFW 规则如下:
~ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
4040 DENY Anywhere
22 ALLOW Anywhere (v6)
4040 DENY Anywhere (v6)
当我直接通过其 IP 访问该盒子时,我可以访问端口 4040。为什么 ufw 规则没有阻止它?
注意:作为docker安装的一部分,我更改了
DEFAULT_FORWARD_POLICY="DROP" 更改为 DEFAULT_FORWARD_POLICY="ACCEPT"
按照此处的 docker 说明,在 /etc/default/ufw 中(http://docs.docker.io/en/latest/installation/ubuntulinux/#docker-and-ufw)
答案1
我遇到了同样的问题,并通过使用 IPTABLES 解决了它。
仅允许来自源 IP xxx.xxx.xxx.xxx 的 3306 的示例:
在 FORWARD 链的第 1 行添加与我们的 ip 匹配的源的接受
iptables -I FORWARD 1 -p tcp -i eth0 -s xxx.xxx.xxx.xxx --dport 3306 -j ACCEPT
删除该端口 FORWARD 链上的所有其他连接
iptables -I FORWARD 2 -p tcp -i eth0 --dport 3306 -j DROP
使用行号(1 和 2)强制将规则添加到 docker 创建的规则之上,例如:
-A 转发 -d 0.0.0.0/32 !-i docker0 -o docker0 -p tcp -m tcp --dport 3306 -j 接受
答案2
有一个与此相关的已知问题。基本上,docker 在 UFW 后面配置 Iptables。
更多信息:
- http://www.acervera.com/blog/2016/03/05/ufw_plus_docker
- https://github.com/docker/docker/issues/4737
简短的可能回应:
Set DEFAULT_FORWARD_POLICY="ACCEPT" in /etc/default/ufw
Set DOCKER_OPTS="--iptables=false" in /etc/default/docker
答案3
尝试使用特定 IP 运行容器。
docker run -d -p 127.0.0.1:4040:4040 ...