【问题标题】:Docker opened up ports to public. How do I close them?Docker 向公众开放了端口。我该如何关闭它们?
【发布时间】:2020-09-26 19:59:48
【问题描述】:

令人惊讶的是,运行 docker-compose 会打开一些端口。我只想打开 80、22 和 443。我该如何做到这一点?如何禁用 docker 能够打开它们?这真的是一个巨大的安全问题。

【问题讨论】:

  • Running docker-compose 只显示了我的用法。你到底用什么配置运行了什么?您如何检查端口是否打开?究竟哪些端口是开放的?
  • @KamilCuk 我运行docker-compose up -d 来启动所有容器。那些在我做ports: - "1234:80"的地方是开放的,它向公众开放了1234。
  • 那么请贴出这些“所有容器”的配置。 IE。显示 docker-compose.yml 。 it opened up 1234 to public 这正是 ports 所做的
  • @KamilCuk 我希望它不向公众开放,而只对本地机器开放。

标签: linux docker docker-compose


【解决方案1】:

我会回答你没有问过但你真正想知道的问题,希望它能对未来的读者有所帮助,主要是因为我自己碰到了这个问题。

如何安全正确地进行?

我假设默认的--iptables=true docker 配置。

绑定容器端口时默认--ip0.0.0.0,即。所有接口。所以容器绑定到所有接口,即。端口1234 从所有传入接口重定向到端口80。因为DOCKER 链是在PREROUTING 链中的iptables nat 表中添加的,所以它通常在正常防火墙插入filter 表中的任何其他内容之前被重定向。

为了安全起见,修改/etc/docker/daemon.json并指定重定向端口时容器将绑定到的默认ip

{
    "ip": "127.0.0.1"
}

或将命令行选项 --ip=127.0.0.1 添加到您的 docker 实例。这样ports 在未指定时只会插入 localhost 的重定向。

这可能还不够,因为 iptables 规则可能很奇怪 - 所以了解您的 iptables 规则并在需要时修改它们是可取的。或者,您可以在filter 表中的DOCKER_USER 链中添加一些过滤规则来专门过滤流量。

对于你真的想要暴露给外界的实例,显式设置0.0.0.0(或外部接口的ip号):

ports:
- 0.0.0.0:1234:80    # global
- 127.0.0.1:1235:80  # local only
- 1236:80            # whatever defaults is set in docker.json, usually 0.0.0.0

如何关闭它们?

停止docker 服务。停止容器。从 iptables 中删除规则。关闭你的电脑。从您的电脑上删除网络连接。

我只想打开 80、22 和 443。我如何做到这一点?

所以只重定向那些端口而不是别的。

如何禁用 docker 能够打开它们?

在 docker 中禁用 iptables 支持 - 将 --iptables=false 传递给 dockerd 或相应地修改 /etc/docker/daemon.json

【讨论】:

    【解决方案2】:

    在做:

    iptables -I DOCKER-USER -i eth0 ! -s 127.0.0.1 -j DROP
    

    为我解决了这个问题。

    https://www.jeffgeerling.com/blog/2020/be-careful-docker-might-be-exposing-ports-world

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2017-10-29
      相关资源
      最近更新 更多