更安全的本地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
如果你不想讓你的容器間直接通信,那我們推薦你這樣做。但是需要注意的是這樣做無法阻止主機的公共接口與可以公開訪問的映射到另一個容器的端口之間的通信(譯者注:當然無法阻止,映射的端口主機肯定可以訪問啦)。
這可以滿足很多人的需求,但故事并沒有到此結束。
當跨容器通信被禁用時,你可以在容器創建時使用容器連接來確保指定容器間的通訊。當你創建一個容器并指定另一個作為連接的目標時,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 (翻譯:田浩 校對:李穎杰)
來自:http://dockerone.com/article/139##
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!