docker与iptables = false的互联网连接

时间:2016-11-24 18:31:19

标签: docker iptables

我放弃了。我在使用UFW加强的ubuntu 16.04下使用Docker 1.12.0。

该机器有2个接口 - 一个公共(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"是假的,所以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

谢谢!

1 个答案:

答案 0 :(得分:2)

docker网络模型使用iptables为容器设置Internet连接。如果您明确不希望使用桥接或覆盖网络驱动程序的容器完全具有任何网络连接,我只会设置iptables = false。

当您使用iptables = true启动守护程序时,它将在防火墙中设置所需的规则。当码头工人关闭时,我不相信它会破坏这些规则,所以他们会坚持下去。这就是为什么在使用iptables = false启动docker备份后获得Internet连接的原因。如果要在重新启动后在下一个docker启动时保留这些规则,最好的方法是保持iptables = true。