我的防火墙正在阻止来自Docker容器到外部的网络连接。

15

对于我来说,这是一个非常标准的设置。我有一台运行 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.

这里是 ufw 日志,显示来自 Docker 容器的被阻止的连接。
$ 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规则轻松允许容器内所有连接到外部?

4个回答

26

这个方法解决了我的问题:

 ufw allow in on docker0

1
这对我也起作用了,虽然我认为第一步也是必需的,正如rchampourlier在他的答案中指出的那样:将ufw DEFAULT_FORWARD_POLICY的值设置为“ACCEPT”。 - Heri
更新:抱歉,我之前的评论是错误的。最终只有Franchus的解决方案起作用,当然还要结合rchampourliers的解决方案(我最初在错误的环境中进行了测试)。 - Heri
我在 docker_gwbridge 上进行了允许操作,这是 syslog 中 ufw 阻止行所报告的内容。由于我只想要 postgres,所以命令如下: $ sudo ufw allow in on docker_gwbridge to any port 5432规则已添加 规则已添加 (v6) - Blaskovicz

25

请按照以下方式编辑/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。


4
谢谢,Franchu,这样做可以了。如果您能解释一下所有这些设置最终的含义就太好了(对我来说并不是很明显)。 - Heri
3
谢谢,这很有帮助。但请记住,这对于在docker-compose中添加了子网的docker容器将不适用。如果你定义了IP范围,例如172.20.0.0/16,请运行ifconfig并在*filter部分中添加新的网络接口(例如br-c0754ca0b709)。 - Marcel

14

也许这是由于当前版本,但当前答案在我的系统上不起作用(具有基本Ubuntu镜像的Docker 0.7.2)。

解决方案在官方Docker文档中已经说明

对于懒人:

  • 编辑/etc/default/ufw以更改DEFAULT_FORWARD_POLICY的值为"ACCEPT",
  • 使用[sudo] ufw reload重新加载。

这可以确保ufw将您的流量转发到Docker的桥接网络(根据我目前对这些内容的理解...)。


5
这种解决方案已经不能满足在ufw上使用更新版本Docker的需求。 - ctbrown

-1

我使用下面的过滤器来筛选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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接