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

时间:2016-04-27 18:19:56

标签: networking docker iptables qnap

我在QNAP raid计算机上运行了docker-1.9.1。它具有使用子网bridge的默认10.0.3.0/24网络。在iptables中,我在nat表中看到一条规则:

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

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

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

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] #

1 个答案:

答案 0 :(得分:0)

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

在创建网络之前:

# 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