我的防火墙阻止了从 docker 容器到外部的网络连接
Posted
技术标签:
【中文标题】我的防火墙阻止了从 docker 容器到外部的网络连接【英文标题】:My firewall is blocking network connections from the docker container to outside 【发布时间】:2013-06-27 23:17:17 【问题描述】:对我来说,这是一个非常标准的设置,我有一台运行 docker 和 ufw 作为我的防火墙的 ubuntu 机器。
如果我的防火墙已启用,docker 实例将无法连接到外部
$ docker run -i -t ubuntu /bin/bash
WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: [8.8.8.8 8.8.4.4]
root@d300c5f17207:/# apt-get update
Err http://archive.ubuntu.com precise InRelease
0% [Connecting to archive.ubuntu.com]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/precise/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/precise/Release.gpg Temporary failure resolving 'archive.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
这里是显示来自 docker 容器的被阻止连接的 ufw 日志。
$ sudo tail /var/log/ufw.log
Jun 30 15:41:56 localhost kernel: [61609.503199] [UFW BLOCK] IN=testbr0 OUT=eth0 PHYSIN=veth8Rj8Nh MAC=fe:ff:ed:42:b0:01:0a:7c:42:7c:a6:72:08:00 SRC=172.16.42.2 DST=8.8.8.8 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=14886 DF PROTO=UDP SPT=60192 DPT=53 LEN=44
Jun 30 15:42:01 localhost kernel: [61614.500867] [UFW BLOCK] IN=testbr0 OUT=eth0 PHYSIN=veth8Rj8Nh MAC=fe:ff:ed:42:b0:01:0a:7c:42:7c:a6:72:08:00 SRC=172.16.42.2 DST=8.8.4.4 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=16137 DF PROTO=UDP SPT=44812 DPT=53 LEN=44
Jun 30 15:42:06 localhost kernel: [61619.498516] [UFW BLOCK] IN=testbr0 OUT=eth0 PHYSIN=veth8Rj8Nh MAC=fe:ff:ed:42:b0:01:0a:7c:42:7c:a6:72:08:00 SRC=172.16.42.2 DST=8.8.8.8 LEN=64 TOS=0x00 PREC=0x00 TTL=63 ID=14887 DF PROTO=UDP SPT=60192 DPT=53 LEN=44
我曾尝试使用 ip 添加规则。
$ sudo ufw allow in from 172.16.42.2
$ sudo ufw allow out from 172.16.42.2
并且没有变化仍然被阻塞。
如何使用 ufw 规则轻松地允许从容器到外部的所有连接?
【问题讨论】:
【参考方案1】:这为我解决了问题:
ufw allow in on docker0
【讨论】:
这对我也有用,虽然我认为第一步也是必要的,正如 rchampourlier 在他的回答中指出的那样:将 ufw DEFAULT_FORWARD_POLICY 的值设置为 "ACCEPT" 。 更新:对不起,我上面的评论是错误的。只有 Franchus 解决方案最终起作用,当然还有 rchampourliers 解决方案(我首先测试了一个错误的环境) 我在docker_gwbridge
上做了一个允许,这是 syslog 中的 ufw 块行报告的内容。因为我只想要 postgres,所以它是:$ sudo ufw allow in on docker_gwbridge to any port 5432
``` 添加了规则 规则添加(v6) ``【参考方案2】:
编辑/etc/ufw/before.rules
如下:
在 *filter 部分中,在所需行的第一块之后,添加:
# docker rules to enable external network access from the container
# forward traffic accross the bridge
-A ufw-before-forward -i docker0 -j ACCEPT
-A ufw-before-forward -i testbr0 -j ACCEPT
-A ufw-before-forward -m state --state RELATED,ESTABLISHED -j ACCEPT
在文件末尾,COMMIT
行之后,添加以下部分:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.16.42.0/8 -o eth0 -j MASQUERADE
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
保存文件后,用sudo ufw disable && sudo ufw enable
重启ufw
【讨论】:
谢谢,Franchu,成功了。如果您能解释一下所有这些设置的最终含义,那就太好了(对我来说这并不是很明显)。 谢谢,这有帮助。但请记住,这不适用于在 docker-compose 中添加了子网的 docker 容器。如果您定义了 IP 范围,例如172.20.0.0/16,运行 ifconfig 并在 *filter 部分添加新的网络接口(例如 br-c0754ca0b709)。【参考方案3】:也许这是由于当前版本,但当前答案在我的系统上不起作用(带有基本 Ubuntu 映像的 Docker 0.7.2)。
解决方案说明here in the official Docker documentation。
对于懒惰的人:
编辑/etc/default/ufw
,将DEFAULT_FORWARD_POLICY
的值更改为"ACCEPT"
,
使用[sudo] ufw reload
重新加载。
这确保 ufw 将您的流量转发到 Docker 的桥接网络(根据我目前对这些事情的理解......)。
【讨论】:
对于 ufw 上更新的 docker 版本,这不再是足够的解决方案。【参考方案4】:我对 docker 网络使用下一个过滤器
#docker swarm
sudo ufw allow 2376/tcp
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp
【讨论】:
以上是关于我的防火墙阻止了从 docker 容器到外部的网络连接的主要内容,如果未能解决你的问题,请参考以下文章