更安全的本地Docker网络

本文讲的是更安全的本地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 (翻译:田浩浩 校对:李颖杰)

===========================
译者介绍
田浩浩,悉尼大学USYD硕士研究生,目前在珠海从事Android应用开发工作。业余时间专注Docker的学习与研究,希望通过DockerOne把最新最优秀的译文贡献给大家,与读者一起畅游Docker的海洋。

原文发布时间为:2015-01-14 

本文作者:田浩浩 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:更安全的本地Docker网络

时间: 2024-10-21 09:15:55

更安全的本地Docker网络的相关文章

探索本地Docker桥接网络

本文讲的是探索本地Docker桥接网络,[编者的话]本文主要介绍了Docker的基础网络知识,作者通过容器与MongoDB实例的连接的小实验探索了Docker的网路知识以及其中的一些问题. 我正在写<Docker in Action>(译者注:此书的样章可以在这里查看)第五章,内容有关Docker的容器连接与网络配置.最近一直在关注Docker的其它几个部分,我也重新熟悉了容器连接并深入研究了网络. 本文不会赘述我们已经熟悉的网络桥接.但是我猜很多使用Docker的开发者仍然不熟悉这部分内容,

Docker网络和服务发现

本文讲的是Docker网络和服务发现[编者的话] 本文是<Docker网络和服务发现>一书的全文,作者是Michael Hausenblas.本文介绍了Docker世界中的网络和服务发现的工作原理,并提供了一系列解决方案. 前言 当你开始使用Docker构建应用的时候,对于Docker的能力和它带来的机会,你会感到很兴奋.它可以同时在开发环境和生产环境中运行,只需要将一切打包进一个Docker镜像中,然后通过Docker Hub分发镜像,这是很直接了当的.你会发现以下过程很令人满意:你可以快速

Docker网络一览

本文讲的是Docker网络一览,[编者的话]本文是Nuage Networks公司Filip Verloy的一篇博文,简单介绍了一下Docker网络情况,单主机的四种模式及多主机的Libnetwork模式,大家可以试用了.同时本文讲的是,Nuage Networks公司在鼓捣的SDN方案,我觉得大家也可以去了解一下. 介绍 无疑外面已经有很多关于Docker网络的博客,我也不想再去重复那些了,恰恰相反,通过展示下面一些不同设置的例子,我想为现在Docker网络到底能做什么而提供一个清晰的描述.

DockOne微信分享(六十六): Docker网络方案初探

本文讲的是DockOne微信分享(六十六): Docker网络方案初探[编者的话]这次主要跟大家聊聊Docker的网络方案,首先是现有容器网络方案介绍, 接下来重点讲解Calico的特性及技术点,作为引申和对比再介绍下Contiv的特性,最后给出对比测试结果. 随着容器的火热发展,数人云越来越多的客户对容器网络特性要求也开始越来越高,比如: 一容器一IP: 多主机容器互联: 网络隔离: ACL: 对接SDN等等. 这次主要跟大家聊聊Docker的网络方案,首先是现有容器网络方案介绍, 接下来重点

Win8.1本地与网络一体化搜索

  尽管网上议论纷纷,但Win8.1绝非简单升级,新增主要功能之一,即是"智能搜索",其实小编觉得改为"本地与网络一体化搜索",也许更恰当点. Win8.1一体化"智能搜索"定义:把Bing网页搜索与系统本地搜索(Windows内搜索)融为一体的搜索引擎. 在右侧Charmbar点击"搜索",在"搜索"下方有个下拉列表,点击向下箭头的标志,出现搜索设置"所有位置"."设置&qu

蚂蚁金服Docker网络技术实践

以下内容根据演讲PPT以及现场分享整理而成. 主要内容提纲 一.docker网络分析 二.docker网络插件开发 三.蚂蚁金服的网络插件实践 一.docker网络分析 主要介绍三种docker网络,Bridge网络.docker原生的Overlay网络以及Weave网络,在这里主要分享一下这些网络的架构或者说是结构. docker Bridge网络 Bridge网络可能是大家最熟悉的网络,如下图所示,HostA和HostB是两个宿主机,docker运行起来就将在宿主机上创建docker0的网桥

Docker网络原则入门:EXPOSE,-p,-P,-link

本文讲的是Docker网络原则入门:EXPOSE,-p,-P,-link,[编者的话]构建多容器应用程序,需要定义网络参数来设置容器间的通信,可以通过EXPOSE或者-expose暴露端口.使用-p发布特定端口,还可以用-link等等来实现,这些方法可能会得到一样的效果,但是这些方法之间是否有不同,应该选择什么样的方法,将是本文讨论的重点内容. 如果你已经构建了一些多容器的应用程序,那么肯定需要定义一些网络规则来设置容器间的通信.有多种方式可以实现:可以通过--expose参数在运行时暴露端口,

Docker网络深度解读

Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容器的IP直接去通信,又能保证在这个集合外的一些容器不能够通过这个容器IP去通信,能做到网络隔离.网络这个概念是由网络的驱动去创建.管理的.网络的驱动又分为全局的和本地的,全局的意思是这个网络可以跨主机,没必要说我的两个容器非要在一个主机上才能通过这个网络去通信,我可以在不同主机上还是通过容器的IP相

利用OpenVSwitch构建多主机Docker网络

本文讲的是利用OpenVSwitch构建多主机Docker网络,[编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(