我们有一个具有公共 IPv4 地址的虚拟机,我们的域指向该example.com
地址*.example.com
。
我们有几台分布式低技术计算机与可公开访问的虚拟机建立了 wireguard 连接/隧道。
80
我们希望虚拟机在端口/上提供网站服务443
、通过端口接受 ssh 连接22
等等。
我们希望低技术含量的计算机能够通过相应的子域(如 、 等)公开访问low-tech-01.example.com
,low-tech-02.example.com
并将请求代理/路由到相应的本地/wireguard IP 地址。这应该适用于通过端口80
/进行的网站443
、通过端口 进行 ssh 连接22
等。
编辑:理想情况下,SSL 证书应由低技术计算机提供,并且 SSL 连接不应在虚拟机上终止。
编辑:理想情况下,用于与低技术计算机建立连接的 ssh 私钥不应该存在于虚拟机上,而应该只存在于客户端上。
编辑:对于 ssh,我们可以为每台低技术计算机打开并路由一个唯一的端口,从public_IPv4:22xxx
到local/wireguard_IP:22
不幸的是,在花了两天时间反复试验 nginx 配置后,我们发现这个任务可能无法仅靠 nginx 来解决。
注意:ssh 不发送 SNI;nginx 无法在相同的端口上监听http
以及stream
连接;可能还会出现更多问题。
但同时,我们也完全没有主意,不知道该怎么做可以确实妥善解决了这个任务。
(www\.)?example.com
–> 公共 IPv4 –> 网站、ssh 等。
low-tech-01.example.com
–> 公共 IPv4 –> ??? ~> 10.0.0.101
–> 网站、ssh 等。
low-tech-02.example.com
–> 公共 IPv4 –> ??? ~> 10.0.0.102
–> 网站、ssh 等。
…
感谢您的建议和时间。
—
编辑:以下 nginxstream
配置接近我们想要实现的目标。(可能)唯一的缺点是我们必须为每台低技术计算机手动定义一个端口,而不是像 SSL 连接那样动态处理。
stream {
map $ssl_preread_server_name $name {
example.com example.com;
www.example.com example.com;
low-tech-01.example.com low-tech-01.example.com;
low-tech-02.example.com low-tech-02.example.com;
}
upstream example.com {
server 127.0.0.1:8443;
}
upstream low-tech-01.example.com {
server 10.0.0.101:443;
}
upstream low-tech-02.example.com {
server 10.0.0.102:443;
}
server {
listen 443;
proxy_pass $name;
ssl_preread on;
}
server {
listen 22101;
proxy_pass 10.0.0.101:22;
}
server {
listen 22102;
proxy_pass 10.0.0.102:22;
}
…
}
答案1
您需要在服务器上获取多个 IP 地址,每个要使用的子域一个。
然后,您需要为每个虚拟机分配一个公共 IP 地址。之后,您可以将子域绑定到该 IP 地址。在虚拟机中,您可以进行端口转发到您想要的任何最终目的地。