【问题标题】:How to prevent internet access in Docker containers如何防止 Docker 容器中的 Internet 访问
【发布时间】:2021-10-12 17:53:50
【问题描述】:

如何设置我的 Docker 网络以仅允许内部和主机访问?

我一直在使用用户定义的网络来阻止我的容器访问互联网。

networks:
  no-internet:
    internal: true
    ipam:
      config:
        - subnet: 172.19.0.0/16

这很好用。但是,我想允许我的容器连接到主机,以便我可以使用 XDebug。如果我使用默认的 Docker 网络,我可以设置 Xdebug 通过host.docker.internal 连接到主机。一旦我将容器添加到no-internet 用户定义的网络,容器就会失去对主机的访问权限。

【问题讨论】:

    标签: docker docker-compose containers


    【解决方案1】:

    我不知道 XDebug 是什么,所以我可能完全错了;但我的直觉是这是一个简单的案例。

    将 Xdebug 放入 no-internet 网络上的容器中。

    【讨论】:

    • 它只是一个调试工具,运行将调试器连接到 PHP。它已经在 no-internet 网络中的 Apache 容器中运行。我的主机需要连接到容器并且不能。
    【解决方案2】:

    创建用户定义的网络时,不要设置internal,而是设置com.docker.network.bridge.enable_ip_masquerade=false。这将防止 NAT 伪装来自该特定网络的出站流量(这是 Docker 在使用 IPv4 时将容器连接到主机网络的方式)。

    以下是使用 docker-cli 的方法。

    docker network create --subnet 172.19.0.0/16 \
       -o com.docker.network.bridge.enable_ip_masquerade=false \
       -o com.docker.network.bridge.name=nointernet \
       nointernet
    

    这就是使用 Docker Compose 的样子

    networks:
       front:
         driver: bridge
         driver_opts:
           com.docker.network.bridge.enable_ip_masquerade: 'false'
         ipam:
           driver: default
           config:
           - subnet: 172.19.0.0/16
    

    【讨论】:

    • 谢谢! Docker for Mac 运行着一个 Web 服务器。如果我从主机环境 (macOS) 运行 curl 127.0.0.1:8081,我会收到来自服务器的响应。如果我在容器中运行 curl host.docker.internal:8081,它不会解析。
    • Docker for mac 有点棘手。您可以直接进入 Linux 中的容器。在 docker 中,容器可以通过容器名称相互通信,只要它们在同一个网络上(每个容器可以有多个网络)。在 Mac 上,如果您需要直接连接到容器而不共享主机端口,则需要在 Docker 网络中创建一个 VPN 端点。有许多工具/教程可以帮助您做到这一点。
    • 知道了。谢谢!
    猜你喜欢
    • 2022-01-22
    • 2019-01-05
    • 2022-10-08
    • 2017-02-16
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多