2017-10-18 36 views
3

使用碼頭工具時,我們從圖像開始。我用docker創建了一個容器。無法理解碼頭工人iptables規則

docker run --name register -d -p 1180:5000 registry 

iptables規則可以通過運行iptables-save命令列出:

# Generated by iptables-save v1.4.21 on Mon Oct 16 14:01:03 2017 
*nat 
:PREROUTING ACCEPT [129:14002] 
:INPUT ACCEPT [129:14002] 
:OUTPUT ACCEPT [25:1792] 
:POSTROUTING ACCEPT [25:1792] 
:DOCKER - [0:0] 
-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 172.17.0.0/16 ! -o docker0 -j MASQUERADE 
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE 
-A DOCKER -i docker0 -j RETURN 
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 1180 -j DNAT --to-destination 172.17.0.2:5000 
COMMIT 
# Completed on Mon Oct 16 14:01:03 2017 
# Generated by iptables-save v1.4.21 on Mon Oct 16 14:01:03 2017 
*filter 
:INPUT ACCEPT [2721358:1990060388] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [2726902:1992988803] 
:DOCKER - [0:0] 
:DOCKER-ISOLATION - [0:0] 
-A FORWARD -j DOCKER-ISOLATION 
-A FORWARD -o docker0 -j DOCKER 
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT 
-A FORWARD -i docker0 -o docker0 -j ACCEPT 
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT 
-A DOCKER-ISOLATION -j RETURN 
COMMIT 
# Completed on Mon Oct 16 14:01:03 2017 

我不明白這個規則。

-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE 
+0

這可能是https://unix.stackexchange.com的一個問題 – Matt

回答

2

最好的猜測是,當你將iptables POSTROUTING表默認爲拒絕任何不符合規則的數據包時,該規則將修復邊緣情況,這允許容器通過映射端口從容器到自身的連接。在正常操作中,規則不起作用。

我認爲這是pull request (#7003)添加MASQ規則,但沒有文件說明爲什麼它被添加。該提交被標記爲"Create tests for pkg/iptables"。這項工作通常圍繞着發行具有默認DENY表的發行版修復Docker。

issue #12632中有一條建議,除非關閉用戶態端口映射代理,否則不會觸及該規則。

+0

似乎比我的答案更精確。 +1 – VonC

0

這「Bind container ports to the host

所示默認情況下Docker容器可以到外面的世界連接,但外界無法連接到容器。它開始時,每個傳出的連接將出現從主機自身的感謝一個iptables僞裝的主機上規則的一個IP地址發起的碼頭工人服務器創建:

$ sudo iptables -t nat -L -n 

... 
Chain POSTROUTING (policy ACCEPT) 
target  prot opt source    destination 
MASQUERADE all -- 172.17.0.0/16  0.0.0.0/0 
... 

泊塢窗服務器創建一個僞裝規則,允許容器連接到外部世界的IP地址。

你可以看到in this thread當這些規則產生會發生什麼。 (他們need to be restored

您可以在「Build your own bridge」中學習相同的選項。

+0

雖然所討論的規則有點不同,但出站連接的標準MASQUERADE是ops輸出中的上述規則。此規則特別關於在端口映射的目標端口上連接到自身的容器。我不確定爲什麼在那裏使用MASQ規則,除非它想要更改這些連接的源IP。顯然只有在你關閉用戶區域代理時纔會觸發(https://github.com/moby/moby/issues/12632) – Matt

+0

@Matt感謝您引用[moby issue 33726](https:// github。 COM/MOBY/MOBY /問題/ 33726)。我也不確定。 – VonC

+0

對不起,這是錯誤的。它是https://github.com/moby/moby/issues/12632 – Matt