私有且有代理的 Docker 网络设置

私有且有代理的 Docker 网络设置

所需架构

以上是所需网络的布局。我正在努力让它变得恰到好处。路由器的内部链接与此问题无关

要求:

  1. 唯一直接向公众暴露的容器应该是代理。
  2. 所有容器都可以相互通信,最好通过主机名(参见用户定义的 docker 网络)。
  3. 某些服务(例如 Portainer)需要互联网访问(传出)才能从其服务器检索某些数据,但否则无法直接访问。
  4. 可能允许主机直接访问容器服务,但只能从主机本身访问,而不能从外部访问。

我目前所取得的成就:

  1. 代理正确地将所需的容器代理到外部。
  2. 所有容器都可以相互通信,并且可以通过服务名称解析其IP。

问题:

  1. 所有容器仍可直接访问,无需使用代理(通过使用其公开的端口)
  2. 如果他们不在桥接网络中,他们就没有互联网,但如果他们在桥接网络中,他们可以直接访问。

我认为有 3 个网络是必要的:

  1. 容器本身的内部网络
  2. 有互联网的网络(但不知何故没有暴露任何端口)
  3. 代理将使用的网络将向公众公开

我正在通过 Portainer 配置一切,docker 主机正在使用 Firewalld。提前感谢任何建议!

答案1

好吧,在重新审视这个问题后,我读了 Docker 的一份速查表,意识到你可以绑定到一个接口。默认情况下,如果没有指定接口,它会绑定到0.0.0.0,但通过指定,例如127.0.0.1:80:80意味着只有 docker 主机才能访问端口 80 上的容器。

这样,我将我的私有网络 (192.168.1.0/24) 指定为所有 docker 容器的公开端口的绑定接口(这样我就可以直接从网络内部访问)以及我绑定的 Caddy 代理0.0.0.0。现在,它的表现正如我所愿,不需要任何特殊设置。

另外,我把所有容器链接到同一个用户定义的网络中,并internal在其中设置限制外部访问true。这样,容器可以相互通信,可以通过容器名称解析,并且除了我的私有网络之外无法被任何东西访问。所有容器中的所有服务仅通过反向代理向公众公开。

答案2

将所有容器放入 Docker Overlay 网络中。这样它们将相互通信,但您无法通过其他方式连接到其中任何一个。将代理设置为 Ingress Docker 服务。默认情况下,容器也将有权连接到 Internet。

如果您只希望某些容器可以访问 Internet,请禁用该 Overlay 网络的 IP 伪装,然后:

a. 创建另一个覆盖网络,禁用 ICC 并启用伪装,仅将需要访问 Internet 的容器连接到该网络。

b. 设置一个代理容器,比如 Squid,并通过 Docker 的默认 Bridge 网络授予其 Internet 访问权限(允许 IP 伪装)。

c. a)和b)的组合。

相关内容