2016-04-27 71 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 –