**
- 我的域名:xxx.com
我的外部 ip:88.101.10.30 WAN 地址
DNS A 记录
A 记录 server1.xxx.com 88.101.10.30 A
记录 server2.xxx.com 88.101.10.30 A
记录 server3.xxx.com 88.101.10.30 ....
我的内部 LAN 服务器地址机器名称:server1,ip:192.168.1.10机器名称:server2 ,ip:192.168.1.20机器名称:server3,ip:192.168.1.30 ...我想在所有协议基础上向所有机器开放所有端口RDP 协议 server1.xxx.com:3389 => 192.168.1.10:3389 应用程序:RDP 服务器 server2.xxx.com:3389 => 192.168.1.20:3389 应用程序:RDP 服务器 server3.xxx.com:3389 => 192.168.1.30:3389 应用程序:RDP 服务器... VPN 协议server1.xxx.com:1194 => 192.168.1.10:1194应用程序:VPN 服务器server2.xxx.com:1194 => 192.168.1.20:1194应用程序:VPN 服务器server3.xxx.com:1194 => 192.168.1.30:1194 应用程序:VPN服务器... HTTP/HTTPS server1.xxx.com:80|443 => 192.168.1.10:80|443 应用程序:Web 应用程序server2.xxx.com:80|443 => 192.168.1.20:80|443 应用程序:Web 应用程序server3.xxx.com:80|443 => 192.168.1.30:80|443 应用程序:Web 应用程序. . .其他 TCP/UDP 协议server1.xxx.com:PORT => 192.168.1.10:PORT 应用程序:任意server2.xxx.com:PORT => 192.168.1.20:PORT 应用程序:任意server3.xxx.com:PORT => 192.168.1.30:PORT 应用程序:任意. . .我无法使用反向代理来做到这一点,因为它只提供基于 Http 的协议并且只提供 1 个端口的处理,我希望能够接收所有端口和所有协议。
**
答案1
您对主机名考虑太多了,而互联网是基于 IP 和 IPv6 运行的。名称只是辅助的东西,旨在让我们这些卑微的人类更容易访问。要使服务独立,它必须有一个专用的 IP/IPv6 地址。
只有 HTTP 进行了一定程度的扩展,使主机名具有了扩展的含义。其他任何协议都只能赋予地址和端口含义。此外还出现了 NAT,它允许多台主机隐藏在一个地址后面;以前,如果您希望主机与 Internet 通信,您必须为其分配一些全局唯一的路由(公共)地址。
因此,你不能太依赖名字,而且你绝对地必须使用不同的 IP 地址和/或端口将流量导向不同的服务。仅凭名称无法区分任何东西。
对于 HTTP仅有的,可以运行基于名称的反向代理(任何都可以:Nginx、Caddy、Haproxy、Apache),因此所有网站都可以使用,而无需指定端口名称。但是,对于 HTTPS,您将在反向代理上终止 TLS 层,因此您需要在反向代理上拥有所有全局受信任的证书及其相应的私钥,在前端节点上运行它是很自然的。(使用 Haproxy,可能还可以分析 ClientHello 中的 ALPN 和 SNI,并根据名称直接将 HTTPS 流量传递到后端服务器,但这确实是高级主题。)
对于所有其他协议,最好的方法是:
TCP 88.101.10.30:3389 -> 192.168.1.10:3389
TCP 88.101.10.30:3390 -> 192.168.1.20:3389
TCP 88.101.10.30:3391 -> 192.168.1.30:3389
等等。请注意,不同的端口映射到不同的服务器。基本上有没有办法绕过这。
虽然每台服务器都可以运行自己的 VPN 服务,但最好在前端系统上运行单个服务,并根据客户端证书 DN 为不同的客户端提供对不同后端服务器的不同访问权限(不同的防火墙规则)。这样,连接到 VPN 后,每台服务器都将直接看到并使用内部服务器地址 (192.168.1.x),而无需任何 NAT。
此外,对于 SSH 访问,你可以使用 SSH Jump Host 配置,这样它出现让用户感觉就像直接连接到内部服务器一样。为此,您需要在前端节点上创建一个受限用户。每个用户都会生成一个 SSH 密钥,然后像往常一样在后端节点上安装这些密钥。此外,您将此密钥安装到前端系统中,放入该受限用户的 authorized_keys 中,并进一步限制它仅允许该连接进行 TCP 端口转发。然后,用户将他们的 SSH 客户端配置为在连接到后端 systemd 时自动使用公共 IP 作为跳转主机(例如使用 ProxyJump 选项)。
我还想采纳@davidgo 的建议:将 IP 地址从 192.168.1.x 改为其他地址,因为许多 SOHO 设备默认配置了该地址(另外,不要使用 192.168.0.x、192.168.88.x 等)。这将使将来的许多问题变得容易解决。
答案2
您无法按照您提出的方式执行所要求的操作(尤其是“其他 TCP/UDP 协议”要求)
您可以通过设置单个 VPN 端点(或多个端口上的多个 VPN)然后连接到 VPN 来实现这一点 - 如果您推送路由,您的 VPN 客户端将能够访问其后面的所有 IP 和端口。重新编号为 192.168.1 之外的某个地址是个好主意 - 事实上,重新编号为 172.18.xx 会大大降低您与远程分配给您的 IP 发生冲突的可能性。