将对子域的请求代理/路由到不同的本地/Wireguard IP 地址?

将对子域的请求代理/路由到不同的本地/Wireguard IP 地址?

我们有一个具有公共 IPv4 地址的虚拟机,我们的域指向该example.com地址*.example.com

我们有几台分布式低技术计算机与可公开访问的虚拟机建立了 wireguard 连接/隧道。

80我们希望虚拟机在端口/上提供网站服务443、通过端口接受 ssh 连接22等等。

我们希望低技术含量的计算机能够通过相应的子域(如 、 等)公开访问low-tech-01.example.comlow-tech-02.example.com并将请求代理/路由到相应的本地/wireguard IP 地址。这应该适用于通过端口80/进行的网站443、通过端口 进行 ssh 连接22等。

编辑:理想情况下,SSL 证书应由低技术计算机提供,并且 SSL 连接不应在虚拟机上终止。

编辑:理想情况下,用于与低技术计算机建立连接的 ssh 私钥不应该存在于虚拟机上,而应该只存在于客户端上。

编辑:对于 ssh,我们可以为每台低技术计算机打开并路由一个唯一的端口,从public_IPv4:22xxxlocal/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 地址。在虚拟机中,您可以进行端口转发到您想要的任何最终目的地。

相关内容