2016-12-12 65 views
4

我們在使用Docker的服務器上運行的一些服務試圖連接到私有IP地址(10.0.0.0/8,192.0.0.0/16,172.16.0.0/12 ,100.64.0.0/10)。阻止從Docker容器到私有IP的傳出連接

此行爲很正常,但我們的服務器提供商檢測到此流量並向我們發送警報。

我們只想停止傳出流量,而不是使用iptables傳入。

這是我們的當前設置:

-A OUTPUT -d 192.168.0.0/16 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 100.64.0.0/10 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 172.16.0.0/12 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 
-A OUTPUT -d 10.0.0.0/8 -m owner --uid-owner `id -u dockeruser` -j REJECT --reject-with icmp-port-unreachable 

然而,這似乎並沒有工作,因爲碼頭工人創建以下規則:

Chain FORWARD (policy ACCEPT) 
target  prot opt source    destination 
DOCKER-ISOLATION all -- anywhere    anywhere 
DOCKER  all -- anywhere    anywhere 

對於服務:

Chain DOCKER (1 references) 
target  prot opt source    destination 
ACCEPT  tcp -- anywhere    172.17.0.2   tcp dpt:1234 
ACCEPT  tcp -- anywhere    172.17.0.4   tcp dpt:1234 

最後:

Chain DOCKER-ISOLATION (1 references) 
target  prot opt source    destination 
RETURN  all -- anywhere    anywhere 

任何反饋意見。

+0

我不是iptables專家,但是您可以通過在啓動守護進程時將'--iptables = false'作爲標誌來阻止Docker修改您的iptables。 – johnharris85

+0

感謝您的建議,但我們希望Docker添加它自己的防火牆規則 –

+0

全部或全部atm afaik。 – johnharris85

回答

3

您正在添加錯誤鏈中的規則。源自碼頭集裝箱的流量通過filter表的FORWARD鏈,而不是OUTPUT鏈。這是因爲從主機的角度來看,流量來自接口,而主機只是作爲轉發器。

爲了區分入站和出站流量,請使用-i-o選項指定接口。你也不能使用uid來確定流量是否來自碼頭集裝箱(因爲數據不是本地產生的)。檢查傳入界面就足夠了。

所以,添加以下規則到DOCKER-ISOLATION鏈(其正在從FORWARD鏈稱爲):

-A DOCKER-ISOLATION -d 192.168.0.0/16 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 100.64.0.0/10 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 172.16.0.0/12 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 
-A DOCKER-ISOLATION -d 10.0.0.0/8 -i docker0 ! -o docker0 -j REJECT --reject-with icmp-port-unreachable 

由搬運工創建的虛擬接口的名稱替換docker0

(注意:如果鏈條DOCKER-ISOLATION不存在,直接附加到FORWARD鏈)。

另請參閱iptables -vLiptables -t nat -vL的輸出以更好地瞭解地址如何翻譯。

+0

直到我們用'-I FORWARD 1'將規則插入到第一個位置的FORWARD鏈中時,原來的答案才起作用。我編輯了你的答案,但如果違反規則,請自行更新,以便其他人可以受益。 –

+0

在FORWARD鏈開頭插入這些規則不是一個好主意,因爲它會阻止來自這些IP範圍的傳入流量(您希望允許)。要麼追加在FORWARD鏈的末尾,要麼附加一個名爲'DOCKER-ISOLATION'的鏈。 – Tanmay

+0

由於'DOCKER'鏈僅用於傳出流量(docker0到物理接口),原始答案無效。我編輯了答案。 – Tanmay