Mat*_*haw 5 networking iptables qnap docker
我docker-1.9.1
在 QNAP raid 机器上运行。bridge
它具有使用 subnet 的默认网络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
Run Code Online (Sandbox Code Playgroud)
这不会在 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] #
Run Code Online (Sandbox Code Playgroud)
我正在使用 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>
Run Code Online (Sandbox Code Playgroud)
创建网络:
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
Run Code Online (Sandbox Code Playgroud)
检查iptables:
# iptables -t nat -S | grep 10.0.5.0
-A POSTROUTING -s 10.0.5.0/24 ! -o lxcbr1 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
...我注意到运行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
Run Code Online (Sandbox Code Playgroud)
事实上,我很惊讶你的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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17561 次 |
最近记录: |