Docker是否在iptables中为桥接networking自动化IP伪装规则?
我有一台QNAP RAID机器上运行docker-1.9.1
。 它具有使用子网10.0.3.0/24
的默认bridge
networking。 在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