使用 traefik 和 docker 安全地公开一些容器

使用 traefik 和 docker 安全地公开一些容器

我有一台 16 核、128GB 的​​服务器,可以处理家里的各种事务。我在虚拟机上运行 Windows 域控制器,并且我的所有 Windows PC 都已加入该域。

在服务器上,我还在 Docker 容器中运行多个服务。最初,我通过记住运行它们的端口来访问它们,但当我找到 Traefik 时,我设置了它并将 DNS 记录添加到我的域 DNS,以将所有服务指向服务器的 IP。

我还在 pfSense 盒上设置了自己的内部证书颁发机构,并为所有 Traefik 路由服务创建了通配符证书。

我正在使用 Traefik 的“官方” Docker 镜像,我的配置如下所示。

docker-compose.yml

services:
  traefik:
    image: traefik:1.5.4
    restart: always
    ports:
      - 8088:8080
      - 80:80
      - 443:443
    networks:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /docker/containers/traefik/traefik.toml:/traefik.toml
      - /docker/containers/traefik/acme.json:/acme.json
    container_name: traefik

networks:
  web:
    external: true

traefik.toml我补充道

# Entrypoints to be used by frontends that do not specify any entrypoint.
# Each frontend can specify its own entrypoints.
#
# Optional
# Default: ["http"]
#
defaultEntryPoints = ["http", "https"]

################################################################
# Entrypoints configuration
################################################################

# Entrypoints definition
#
# Optional
# Default:
[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
      [[entryPoints.https.tls.certificates]]
        certFile = "/certs/wildcard.internal.my.domain.com.crt"
        keyFile = "/certs/wildcard.internal.my.domain.com.key"

然后对于给定的 Docker 容器,我设置标签喜欢traefik.basic.frontend.rule进行所有必要的设置以使路由适用于该容器。

这效果很好,我服务的所有流量都可以通过易于记忆的 URL 进行,并且都使用通配符证书通过 SSL 加密,而无需我为每个服务器创建新证书或更改配置。

现在,“问题”是我现在想在服务器上托管一些公共网站。为了便于讨论,我希望 internal.my.domain.com 下的所有内容只能在我的网络内访问,而例如 foo.my.domain.com 和 bar.my.domain.com 之类的内容可以从外部访问。我知道我必须为这些域创建公共记录,将它们指向我家里的服务器。

但我的问题是

  • 我可以设置 Docker 容器使得某些容器只能在网络内部访问,而某些容器可以在网络外部访问吗?
  • 我可以设置 traefik 来处理到正确容器的流量路由,以及处理一些是“外部的”而一些仅是内部的吗?
  • 我可以设置 traefik 的 Let's encrypt 集成来处理所有“外部”地址的加密,并为我的内部服务保留我自己的 CA 的自签名通配符证书吗?

此外,我的 pfsense 盒子上有四端口 NIC 和多个外部 IP 地址,我还在考虑使用一个外部 IP 地址用于公共内容,另一个用于处理我的“正常”流量。为了控制我用于所有个人流量的 IP,并不像 ping 我的外部主机名之一然后在我玩游戏时对我进行 DOS 攻击那么容易知道 :)。

  • 我该如何进行最简单的设置?
  • 在我的服务器(运行 Ubuntu)上使用虚拟接口或使用另一个专用以太网端口(有两个)是最好的方式吗?
  • 我该如何设置 traefik 来处理多个接口上的流量?

答案1

我可以设置 Docker 容器使得某些容器只能在网络内部访问,而某些容器可以在网络外部访问吗?

不要将域名添加到您的 DNS。对于您的内部网容器,请使用myservice.myintranet.local无法从外部解析的域名(例如)。

如果你想要额外的安全性,你可以创建另一个入口点IP白名单.或者你也可以使用标签(如果您愿意的话,请阅读该表的最后两行)。

我可以设置 traefik 来处理到正确容器的流量路由,以及处理一些是“外部的”而一些仅是内部的吗?

Traefik 根据Host标头为您的容器提供服务,因此您只需设置 IP 过滤(而不创建公共 DNS 记录)以保护内联网容器/域免受外部攻击,同时仍允许流量进入您的公共容器/域。

我可以设置 traefik 的 Let's encrypt 集成来处理所有“外部”地址的加密,并为我的内部服务保留我自己的 CA 的自签名通配符证书吗?

我从未测试过这一点,但你可以创建另一个入口点并在你的acme 的配置。 前任:

[entryPoints]
  ...
  [entryPoints.httpsle]
  address = ":443"
    [entryPoints.httpsle.tls]

[acme]
...
entryPoint = "httpsle"

并将该入口点与公共子域的标签一起使用,以便使用 Let's Encrypt 自动签名。

我该如何最简单地进行设置?使用我的服务器(运行 Ubuntu)上的虚拟接口还是使用另一个专用以太网端口(有两个)是最好的方法?

我认为更好的方法是在您的 LAN 中为您的服务器分配 2 个 IP,每个以太网端口一个。

我该如何设置 traefik 来处理多个接口上的流量?

您无需设置任何东西。为您的服务器提供 2 个 IP(一个用于公共托管,一个用于个人流量/内联网),它将接收对这两个 IP 的请求。然后,Traefik 将根据标头将请求路由到正确的容器Host

相关内容