2016-04-27 208 views
3

我在QNAP raid机器上运行了docker-1.9.1。它有使用子网10.0.3.0/24的默认bridge网络。在iptables的我看到nat表的规则:Docker是否在桥接网络的iptables中自动化IP伪装规则?

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

我假设泊坞创造了这个规则本身。

我创建了一个新的桥接网络:

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的一个规则。我错过了一步吗?

以下是完整安装命令和结果,复制@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] # 
+0

您是否知道在https://docs.docker.com/engine/userguide/containers/networkingcontainers/上创建自己的桥接网络? –

+0

我在该页面上使用了例子来创建我自己的网络。看起来不像是覆盖ip masquerade或iptables。 –

+0

它......实际上。你可以看到我在答案中运行的命令的实际顺序。或者你可以看到这个,这是我运行相同测试的实际会话:https://asciinema.org/a/9ipp0n6izkcb3iqk2tdgmpx1i – larsks

回答

0

我使用泊坞1.9.1(在Fedora 23原子),和您的命令似乎工作就好了。

之前创建网络:

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

创建网络:

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,该版本似乎正确地删除了网络删除的规则)。

更新

如果更新你的问题具有iptables -t nat -S整个输出的,然后还有其他事情是怎么回事,因为你缺少DOCKER链中nat表。

# 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链和参考文献,试图在我的系统导致创建一个新的网络:

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 
+0

我正在使用这些命令的版本修改我的问题。不创建规则,但仍然不确定原因。 –

+0

我有一个码头链,但不在'nat'表中。 [/ share/Containers]#iptables -S -P输入接受 -P正向接受 -P输出接受 -N DOCKER –

相关问题