Docker是否在iptables中为桥接networking自动化IP伪装规则?

我有一台QNAP RAID机器上运行docker-1.9.1 。 它具有使用子网10.0.3.0/24的默认bridgenetworking。 在iptables中,我在nat表中看到一条规则:

-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE

我假设Docker自己创build了这个规则。

我创build了一个新的桥梁networking:

 docker network create \ --gateway=10.0.5.1 \ --subnet=10.0.5.0/24 \ -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ -o "com.docker.network.bridge.enable_icc"="true" \ -o "com.docker.network.driver.mtu"="1500" \ -o "com.docker.network.bridge.name"="lxcbr1" \ -o "com.docker.network.bridge.enable_ip_masquerade"="true" \ isolated_nw 

这不会在iptables中创build一个规则。 我错过了一个步骤?

下面是完整的设置命令和结果,复制@larsks的例子:

 [/share/Containers] # docker --version Docker version 1.9.1, build 147ce3e [/share/Containers] # iptables -t nat -S | grep 10.0.5.0 [/share/Containers] # docker network create \ > --gateway=10.0.5.1 \ > --subnet=10.0.5.0/24 \ > -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ > -o "com.docker.network.bridge.enable_icc"="true" \ > -o "com.docker.network.driver.mtu"="1500" \ > -o "com.docker.network.bridge.name"="lxcbr1" \ > -o "com.docker.network.bridge.enable_ip_masquerade"="true" \ > isolated_nw a7b5c938008169f32fcdfc1d9409716b725cc916b30f472ac6ec2a1d71fb77f0 [/share/Containers] # iptables -t nat -S | grep 10.0.5.0 [/share/Containers] # iptables -t nat -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE [/share/Containers] # 

我使用的是Docker 1.9.1(在Fedora 23 Atomic上),你的命令似乎很好。

在创buildnetworking之前:

 # docker --version Docker version 1.9.1, build 7206621 # iptables -t nat -S | grep 10.0.5.0 <no result> 

创buildnetworking:

 docker network create \ --gateway=10.0.5.1 \ --subnet=10.0.5.0/24 \ -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ -o "com.docker.network.bridge.enable_icc"="true" \ -o "com.docker.network.driver.mtu"="1500" \ -o "com.docker.network.bridge.name"="lxcbr1" \ -o "com.docker.network.bridge.enable_ip_masquerade"="true" \ isolated_nw 

检查iptables:

 # iptables -t nat -S | grep 10.0.5.0 -A POSTROUTING -s 10.0.5.0/24 ! -o lxcbr1 -j MASQUERADE 

…我注意到,运行docker network rm isolated_nw ,虽然它正确地删除桥接设备,似乎并没有删除iptables规则。 这似乎是在更新版本的Docker中修复的(例如,我在本地运行1.11.0,该版本似乎正确地删除了networking删除的规则)。

更新

如果你的问题的更新有iptables -t nat -S的全部输出,那么其他的事情就会发生,因为你在nat表中缺lessDOCKER链。

 # iptables -t nat -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -N DOCKER -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 10.0.5.0/24 ! -o lxcbr1 -j MASQUERADE -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE 

事实上,我很惊讶你的create network命令甚至完成,因为如果我手动删除DOCKER链和引用,尝试在我的系统上创build一个新的networking导致:

 Error response from daemon: Failed to program NAT chain: Failed to inject docker in PREROUTING chain: iptables failed: iptables --wait -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER: iptables v1.4.21: Couldn't load target `DOCKER':No such file or directory