我有一台 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
。