docker - 核心安全

标签 docker iptables coreos

我正在使用 coreos 和 digitalocean,我想开始允许容器之间进行内部通信。

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

我为此探索了很多选择,但似乎没有一个令人满意:

  • 使用“-p”,我可以确保 docker 绑定(bind)到本地接口(interface),但这有两个缺点:
    • 我无法通过 SSH 轻松测试服务,因为该流量源自本地主机
    • 我需要编写一些 hacky shell 脚本来启动我的服务,以便注入(inject)容器正在运行的计算机的地址
  • 我尝试使用 flannel,但它无法使流量私密(或者我没有正确设置)
  • 我考虑过在容器上使用 iptables 来防止外部访问,但这似乎并不安全
  • 我尝试在 coreos 主机上使用 iptables,但是......这很棘手,而且我无法让它工作。

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

总的来说,我想我需要找到一些我能做到的东西:

  • 可靠地发布到所有主机
  • future 相当灵活的东西
  • 允许从更广泛的互联网访问“边缘机器”。

解决方案

我将详细介绍我最终是如何解决这个问题的。感谢 larsks 的帮助。最终,他们的做法是正确的。这在 coreos 上很棘手,因为没有像 larsks 假设的那样真正稳定的地址。 coreos 的全部意义就是能够忘记 IP 地址。

我通过找到一种不太糟糕的方法将 IP 地址注入(inject)到服务文件中的命令中解决了这个问题。棘手的是它并没有真正支持我期望的很多 shell 功能。我想要做的是将机器的 IP 地址分配给一个变量,然后将其注入(inject)命令中:

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 中测试上述 bash -c 命令时,它会产生与 systemd 执行此命令时截然不同的效果。在 shell 中,您需要转义“$”字符,而在 systemd 配置文件中,则不需要。
  3. 我添加了 echo,以便我可以看到命令认为的 IP 是什么。
  4. 当我做这一切时,我实际上在 docker 镜像中插入了一个小型网络服务器,这样我就可以使用curl进行测试。

这种方法的缺点是它与 ifconfig 的工作方式和 ipv4 相关。事实上,这种方法在我的 linux mint 笔记本电脑上不起作用,因为 ifconfig 会生成不同格式的输出。这里重要的一课是用 yaml 或 json 输出内容,以便 shell json 工具可以更轻松地访问内容。

最佳答案

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

像这样:

[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

关于docker - 核心安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182325/

相关文章:

linux - 如何使用 iptables 重定向 ip 地址

iptables - 最近使用 iptables 进行速率限制会出错

docker - 一个 Docker 容器可以管理其他 Docker 容器吗?

google-compute-engine - 为什么我无法安装 Google Heapster Kubernetes 插件?

mongodb - 使用 ssl 从 spark 连接到 mongo docker

django - Docker 容器中的 Nginx 出现 `connection reset` 错误,但在没有容器的情况下工作正常

python - 无法使用 docker 内的解释器运行 python 脚本 [Errno 13] 权限被拒绝

python - docker build 期间没有名为 'numpy' 的模块

c++ - 将 IP 数据包重定向到我的应用程序,然后将它们转发

docker - 两个相同的 Docker 镜像怎么可能安装不同的软件包?