首页 文章

我的防火墙阻止了从docker容器到外部的网络连接

提问于
浏览
9

对我来说,这是一个非常标准的设置,我有一台ubuntu机器运行docker和ufw作为我的防火墙 .

如果我的防火墙启用,则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 回答

  • 7

    也许这是由于当前版本,但目前的答案不适用于我的系统(Docker 0.7.2与基础Ubuntu映像) .

    The solution is explained here in the official Docker documentation.

    对于懒惰的人:

    • 编辑 /etc/default/ufwDEFAULT_FORWARD_POLICY 的值更改为 "ACCEPT"

    • 使用 [sudo] ufw reload 重新加载 .

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

  • 16

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

    在文件的末尾, after 表示 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

  • -2

    这为我修好了:

    ufw allow in on docker0
    
  • 15

    你确定ufw允许有关端口的连接吗?

相关问题