Coreos安全性

我正在玩coreos和digitalocean,我想开始允许我的容器之间的内部沟通。

我已经为所有的主机设置了私人networking,现在我想确保一些容器只打开本地主机和内部接口的端口。

我已经探索了很多这方面的select,但没有一个看起来令人满意:

  • 使用'-p',我可以确保docker绑定到本地接口,但是这有两个缺点:
    • 我不能轻易地通过SSH进行testing,因为stream量来自本地主机
    • 我需要写一些hacky shell脚本来启动我的服务,以便注入容器运行的机器的地址
  • 我尝试使用法兰绒,但它不会使交通私密(或我没有设置它的权利)
  • 我考虑在容器上使用iptables来防止外部访问,但这似乎并不安全
  • 我尝试在coreos主机上使用iptables,但是…这是棘手的,我无法得到它的工作。
    • 当我尝试在主机上configurationiptables时,我使用这个方法: https : //docs.docker.com/articles/networking/#communication-between-containers-and-the-wider-world ,通过添加一个DROP规则到docker链,但是没有工作,包仍然通过

那么最好的办法是什么,我会投入时间让它工作。

总的来说,我想我需要find一些我可以做到的事情:

  • 向所有主机可靠地转出
  • 一些相当灵活的东西前进
  • 一些允许从更广泛的互联网访问的“边缘机器”。

我会进入我最终解决这个问题。 感谢larsks的帮助。 最后,他们的做法是正确的。 这对于coreos来说是非常棘手的,因为没有真正稳定的地址,像larsks所假设的那样。 它可以忘记ip地址的整个coreos点。

我通过find一个不错的方法来解决这个问题,将ip地址注入服务文件中的命令。 棘手的事情是,它并不真正支持我期望的许多shellfunction。 我想要做的是将机器的IP地址分配给一个variables,然后将其注入到命令中:

ip=$(ifconfig eth1 | grep -o 'inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'); /usr/bin/docker run -p $ip:7000:7000 ... 

但是,如前所述,这是行不通的。 那么该怎么办? 得到壳!

 ExecStart=/usr/bin/sh -c "\ export ip=$(ifconfig eth1 | grep -o 'inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*');\ echo $ip;\ /usr/bin/docker run -p $ip:7000:7000" 

我一路上遇到了一些问题。

  1. 我很确定这个命令中没有换行符,所以我必须添加';' 人物
  2. 当你在一个shell中testing上面的bash -c命令的时候,在systemd做这个时会有非常不同的效果。 在shell中,你需要转义'$'字符,而在systemdconfiguration文件中,你不需要。
  3. 我包括回声,以便我可以看到命令认为的IP是什么。
  4. 当我这样做的时候,我实际上插入了一个小型web服务器到docker镜像,这样我就可以使用curl来testing了。

这种方法的缺点是,它与ifconfig的工作方式和ipv4绑定在一起。 实际上,这种方法在我的linux mint笔记本电脑上不起作用,其中ifconfig产生不同格式的输出。 这里的重要教训是在yaml或json中输出东西,以便shell json工具可以更容易地访问事物。

我已经为所有的主机设置了私人networking,现在我想确保一些容器只打开本地主机和内部接口的端口。

这正是您在指定IP地址时使用-p选项获得的行为。 比方说,我有一个主机有两个外部接口, eth0 (地址为10.0.0.10)和eth1 (地址为192.168.0.10), docker0网桥为172.17.42.1/16。

如果我启动一个这样的容器:

 docker run -p 192.168.0.10:80:80 -d larsks/mini-httpd 

这将启动一个容器,通过192.168.0.10端口80上的eth1接口访问该容器。该服务可以从容器所在的主机访问docker0networking上分配给容器的地址。 这将是像172.17.0.39,端口80。

这似乎符合你的目标:

  • 容器端口通过“private” eth1接口暴露。
  • 容器端口可以从主机访问。

我不能轻易地通过SSH进行testing,因为stream量来自本地主机。

如果你在一个容器中运行ssh,你会在由Docker分配的“内部”地址ssh到它。 但是如果你在你的容器中运行ssh,你可能会考虑这样做,而是依赖像docker exec这样的工具。

我需要写一些hacky shell脚本来启动我的服务,以便注入容器运行的机器的地址

有了这个解决scheme,就没有必要将机器ip注入容器。

您可以使用环境文件来获取服务在其上进行调度的主机的IP地址(包括公共和私有IP地址),而不是使用grep-ping IP地址。 这允许您以简单的方式将您的容器端口绑定到公共或私有端口。

像这样:

 [Service] EnvironmentFile=/etc/environment ExecStart=/usr/bin/docker run --name myservice -p \ ${COREOS_PUBLIC_IPV4}:80:80 \ ${COREOS_PRIVATE_IPV4}:3306:3306 \ ubuntu /bin/bash