我和我的团队正在创建一项服务,当用户请求时,它会动态创建一个新的服务器实例,每个新实例都有不同的 IP。问题是我通过 WebSockets 从客户端连接到该新创建的服务器。但我需要它获得 SSL 认证。所以我不能只使用 IP。
因此,我的想法是为每个服务器实例创建一个子域。这里唯一的问题是我需要子域能够非常快速地可用,但我不知道是否可以信任 DNS 传播时间。
有没有什么解决办法?比如说,我自己的路由服务器有一个通配符子域,然后根据它路由流量?我想我不能使用 Apache 或这类解决方案,因为我处理的不仅仅是 HTTP/S 流量。
答案1
您可能事先知道 IP 地址范围?您可以xxxxxx.dyn.example.com. IN A
提前为网络创建一些模式。这样您就可以*.dyn.example.com
对它们全部使用通配符证书,而不会出现 DNS 缓存引起的任何问题。
答案2
我最终使用了反向代理。在这种情况下特拉菲克正是我所需要的。
我做了一个修改配置文件的简单 API,它有一些很好的功能,比如在配置时请求 SSL 证书
以下是我最终使用的配置,以防有人需要类似的东西。
InsecureSkipVerify = true
defaultEntryPoints = ["https"]
[entryPoints]
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
dnsProvider = "dnsprovider"
email = "[email protected]"
storage = "acme.json"
entryPoint = "https"
acmeLogging = true
delayDontCheckDNS = 0
onHostRule = true
[frontends]
[frontends.frontend0]
backend = "backend0"
[frontends.frontend0.routes.main]
rule = "Host:din0.instance.mydomain.com"
[backends]
[backends.backend0]
[backends.backend0.servers.server1]
url = "wss://165.227.200.126"
答案3
DNS 传播时间为不是真实的东西(大多数情况下)
取决于您对环境的控制程度:
您的服务器实例的 IP 地址通常会从某些保留的 IP 范围中分配。
只需在您的正向(理想情况下也包括反向)DNS 区域中填充一些相应可预测的样板主机名,用于这些范围内的每个 IP 地址:
ip-10-9-8-7.instances.example.com. IN A 10.9.8.7
并在实例模板中包含通配符证书*.instances.example.com.
作为服务器证书。如果您事先确实不知道 IP 地址,也无法预先创建记录,那么您将依赖于主 DNS 服务器开始响应新创建的记录的响应速度,以及权威名称服务器将新创建的记录复制到彼此的速度。这是唯一重要的传播延迟,实际上取决于 DNS 实现,但可以接近即时。(注意:它也可能是手动更改过程,需要几天时间......)
无论这些极端情况如何,当这在您的情况下还不够快时:您还可以将新分配的 IP 地址与样板主机名配对/etc/hosts
......