Docker与iptables的网络连接性=false

8

我放弃了。我正在使用在Ubuntu 16.04上增强了UFW的Docker 1.12.0。

这台机器有两个接口 - 一个公共的(eth0)和一个私有网络(eth1)的。

Server Version: 1.12.3
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 15
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null bridge host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-47-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 488.5 MiB
Name: image-base
ID: 2473:FGJQ:MEEC:CEWY:BSLR:SYB5:EXMO:WJBE:7MMM:DIZH:NJQF:L5NA
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8

就像我之前对待旧版本一样,我将"iptables"设置为false,这样docker就不会更改我的防火墙。

但是在最新版本的docker(11+)中,这个命令有一个副作用——重启后,docker容器停止获得网络访问(ping www.google.com)。

我一遍又一遍地确认了它。 如何复现: - 停止docker守护进程

sudo systemctl stop docker

我通过添加文件/etc/docker/daemon.json来配置iptables=false:

{
  "iptables" : false
}

这是唯一的配置内容。

启动服务:

sudo systemctl start docker

docker run --rm python ping www.google.com

即使它对你有用 - 如果你重新启动系统 - 它将停止工作...... 你有什么解决方案吗?
我检查了我的iptables规则,在重启系统后,我丢失了这些规则:
:PREROUTING ACCEPT [8:496]      
:INPUT ACCEPT [0:0]     
:OUTPUT ACCEPT [0:0]        
:POSTROUTING ACCEPT [0:0]       
:DOCKER - [0:0]     
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER        
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER       
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE      
-A POSTROUTING -s 172.18.0.0/16 ! -o br-a0b355ce53ac -j MASQUERADE      
-A DOCKER -i docker0 -j RETURN      
-A DOCKER -i br-a0b355ce53ac -j RETURN
 # same
:DOCKER - [0:0]     
:DOCKER-ISOLATION - [0:0]
# same
    -A FORWARD -j DOCKER-ISOLATION      
-A FORWARD -o docker0 -j DOCKER     
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT      
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT        
-A FORWARD -i docker0 -o docker0 -j ACCEPT      
-A FORWARD -o br-a0b355ce53ac -j DOCKER     
-A FORWARD -o br-a0b355ce53ac -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT      
-A FORWARD -i br-a0b355ce53ac ! -o br-a0b355ce53ac -j ACCEPT        
-A FORWARD -i br-a0b355ce53ac -o br-a0b355ce53ac -j ACCEPT
# same
    -A DOCKER-ISOLATION -i br-a0b355ce53ac -o docker0 -j DROP       
-A DOCKER-ISOLATION -i docker0 -o br-a0b355ce53ac -j DROP       
-A DOCKER-ISOLATION -j RETURN

谢谢!


Docker通常在系统中与ufw很搭配。你的系统在使用docker+ufw时遇到了哪些问题? - programmerq
1个回答

4
Docker网络模型使用iptables为您的容器设置互联网连接。如果您明确不希望使用桥接或覆盖网络驱动程序的容器完全没有网络连接,那么才应将iptables=false。
当您使用iptables=true启动守护程序时,它将在防火墙中设置所需的规则。当docker关闭时,我认为它不会拆除这些规则,因此它们会留下来。这就是为什么在使用iptables=false重新启动docker后会获得互联网连接的原因。如果您想在重新启动后保留那些规则,则最好的方法是保持iptables=true。

我明白了。我希望他们能将这个“iptables”配置分开为“出站”和“入站”。因为我确实希望Docker允许我的容器进行出站通信。 - orshachar
只有在发布端口时才会有“传入”规则。如果没有发布端口,则真正存在的只是用于启用该容器的出站连接的iptables规则。 - programmerq
1
我认为我的问题在于我的云服务提供商没有提供网络安全配置,因此我必须使用UFW / iptables来定义我向外界公开哪些端口。我想要一种简单的方法告诉我的机器将端口8080暴露给内部网络,但不向外界公开,并且我不想在docker绑定规则中硬编码机器私有IP... - orshachar
4
很好的解释!但是,iptables=false是设置防火墙所必需的。Docker不应该覆盖防火墙配置。 - Eduardo Casas

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