更安全的本地Docker網路

軒墨發表於2017-09-01
本文講的是更安全的本地Docker網路【編者的話】本文主要是解決了上一篇探索本地Docker橋接網路提出的問題。我們可以在Docker啟動時設定icc=false引數來禁止任意的跨容器通訊。

上週我寫了《探索本地Docker橋接網路》。在這篇文章中我介紹瞭如何使用nmap探索由同一橋接網路上的其它容器公開的服務,並展示了在這些服務沒有對映到主機的公有介面的埠的情況下如何去訪問這些服務。這是一個問題,因為大多數映象的工具、資料庫以及微服務都帶有不安全的預設配置。較為變通的工程師或管理員可能會把這些映象放到可以保護他們的防火牆或網路拓撲結構中。這隻適用於配置了防火牆和網路拓撲的環境。

預設情況下,Docker允許任意的跨容器通訊,在我看來這是一件好事,它不僅可以降低應用複雜度而且還降低了學習曲線。對於任何一個技術來說,能讓使用者快速上手,同時又有清晰的學習路徑是非常重要的。在Docker中,我們需要知道如何加強它們的容器網路。人們應該學會的第一件事就是如何禁用任意的跨容器通訊:啟動Docker守護程式時設定icc=false
docker -d --icc=false ....


當以這種方式啟動Docker時,它將配置iptables(防火牆):在橋接網路中移除所有容器間的通訊,這將禁止容器之間的通訊。

Chain FORWARD (policy ACCEPT)
target prot opt source    destination  
DROP   all  --  0.0.0.0/0 0.0.0.0/0 
ACCEPT all  --  0.0.0.0/0 0.0.0.0/0   ctstate RELATED,ESTABLISHED
ACCEPT all  --  0.0.0.0/0 0.0.0.0/0


如果你不想讓你的容器間直接通訊,那我們推薦你這樣做。但是需要注意的是這樣做無法阻止主機的公共介面與可以公開訪問的對映到另一個容器的埠之間的通訊(譯者注:當然無法阻止,對映的埠主機肯定可以訪問啦)。

1-_QyJABSe1WUQfVIXFHCw_w.png



這可以滿足很多人的需求,但故事並沒有到此結束。

當跨容器通訊被禁用時,你可以在容器建立時使用容器連線來確保指定容器間的通訊。當你建立一個容器並指定另一個作為連線的目標時,Docker建立相應的連線。例如:

docker run -d --name ex_a busybox /bin/sh
docker run -d --name ex_b --link ex_a:other busybox /bin/sh


如果今天我對Docker所有的部分都缺乏激情,很可能使用容器連線只是為了服務發現。當你連線兩個容器時,Docker為了使用此容器會設定帶有“位置”資訊的環境變數,此處有太多隱藏的問題。程式或者使用者建立的容器可以指定連線的別名。但是容器內的軟體必須與別名一致,否則它不知道要尋找什麼。即使我認為連線提供了埠資訊以及網路地址資訊,我依然更喜歡DNS。幸運的是,連線不僅僅是為了服務發現。

當你禁用了跨容器通訊時,為了使連線的容器之間得以通訊Docker會輸出異常。以下是摘自有這樣異常的iptables。

Chain FORWARD (policy ACCEPT)
target prot opt source     destination 
ACCEPT tcp  --  172.17.0.3 172.17.0.4  tcp spt:80
ACCEPT tcp  --  172.17.0.4 172.17.0.3  tcp dpt:80
DROP   all  --  0.0.0.0/0  0.0.0.0/0 
ACCEPT all  --  0.0.0.0/0  0.0.0.0/0   ctstate RELATED,ESTABLISHED
ACCEPT all  --  0.0.0.0/0  0.0.0.0/0



這是容器連線的最強大的應用。連線允許你用簡單的斷言來定義容器之間的關係。就輕量級而言,Docker確實比任何我用過的其他工具都更好。

原文連結:Safer Local Docker Networks (翻譯:田浩浩 校對:李穎傑)

===========================
譯者介紹
田浩浩悉尼大學USYD碩士研究生,目前在珠海從事Android應用開發工作。業餘時間專注Docker的學習與研究,希望通過DockerOne把最新最優秀的譯文貢獻給大家,與讀者一起暢遊Docker的海洋。

原文釋出時間為:2015-01-14 
本文作者:田浩浩 
本文來自雲棲社群合作伙伴DockerOne,瞭解相關資訊可以關注DockerOne。
原文標題:更安全的本地Docker網路


相關文章