首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coreos安全

Coreos安全
EN

Stack Overflow用户
提问于 2015-03-21 11:43:58
回答 2查看 983关注 0票数 2

我正在玩coreos和数字海洋,我想开始允许我的容器之间的内部通信。

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

对此,我已经探索了许多选择,但似乎没有一个方案令人满意:

  • 使用'-p',我可以确保对接者绑定到本地接口,但这有两个缺点:
    • 我不能轻易地用SSHing测试服务,因为流量来自本地主机
    • 我需要编写一些hacky shell脚本来启动我的服务,以便注入运行容器的机器的地址。

  • 我试过使用法兰绒,但这并不能让交通变得私密(或者我没有正确设置)
  • 我考虑过在容器上使用iptable来防止外部访问,但这似乎不太安全
  • 我试过在coreos主机上使用iptables,但是..。这很棘手,但我没能让它起作用。

那么什么是最好的方法,我会花时间让它发挥作用。

总之,我想我需要找到我能找到的东西:

  • 可靠地扩展到所有主机。
  • 未来相当灵活的事情
  • 允许“边缘机器”从更广泛的互联网上访问的东西。

解决方案

我来谈谈我是怎么解决这个问题的。感谢larsks的帮助。最后,他们的做法是正确的。这在coreos上是很棘手的,因为没有像larsks所设想的那样真正稳定的地址。coreos的全部意义在于它能够忘记ip地址。

我找到了一种不错的方法将ip地址注入到服务文件中的命令中,从而解决了这个问题。这方面的棘手之处在于,它并不真正支持我所期望的很多shell特性。我想要做的是将机器的ip地址分配给一个变量,然后将它注入命令中:

代码语言:javascript
复制
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 ...

但是,如前所述,这是行不通的。那该怎么办呢?去拿贝壳!

代码语言:javascript
复制
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中测试上述bash -c命令时,它将产生与systemd完全不同的效果。在shell中,您需要转义'$‘字符,而在systemd配置文件中则不需要转义。
  3. 我加入了回声,这样我就可以看到命令认为ip是什么。
  4. 当我这样做的时候,我实际上插入了一个小型的webserver到docker映像中,这样我就可以使用curl进行测试了。

这种方法的缺点是它与ifconfig和ipv4的工作方式有关。实际上,这种方法不适用于我的linux膝上型计算机,在这里,ifconfig会产生不同格式的输出。这里的重要经验是在yaml或json中输出内容,这样shell json工具可以更容易地访问事物。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-21 12:48:00

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

这正是您在指定ip地址时使用-p选项时所得到的行为。假设我有一个主机,它有两个外部接口:eth0 (地址10.0.10)和eth1 (地址192.168.0.10),docker0桥位于172.17.42.1/16。

如果我启动这样的容器:

代码语言:javascript
复制
docker run -p 192.168.0.10:80:80 -d larsks/mini-httpd

这将启动一个可以通过eth1接口在192.168.0.10端口80访问的容器。此服务也可从容器所在的主机上访问--位于docker0网络上分配给容器的地址。这大概是172.17.0.39,端口80。

这似乎符合你的目标:

  • 容器端口通过“私有”eth1接口公开。
  • 容器端口可从主机访问。

我不能轻易地用SSHing测试服务,因为流量来自本地主机。

如果您在容器中运行ssh,您将在Docker分配的“内部”地址上运行ssh。但是,如果在容器中运行ssh,则可能需要考虑不这样做,而是依赖像docker exec这样的工具。

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

使用此解决方案,不需要将机器ip注入容器中。

票数 1
EN

Stack Overflow用户

发布于 2015-08-11 11:45:40

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

就像这样:

代码语言:javascript
复制
[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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29182325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档