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.

这是显示来自 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 规则轻松允许从容器到外部的所有连接?

4

4 回答 4

25

这为我修复了它:

 ufw allow in on docker0
于 2015-01-13T21:08:10.073 回答
24

编辑/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

保存文件后,重启ufwsudo ufw disable && sudo ufw enable

于 2013-07-05T23:45:46.190 回答
11

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

该解决方案在官方 Docker 文档中进行了说明

对于懒惰的人:

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

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

于 2013-12-28T15:39:46.510 回答
-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
于 2020-01-14T13:50:16.570 回答