有 2 个 Windows 服务器,Server-A 和 Server-B。
服务器-A 通过 IP-1 和 IP-2 直接连接到互联网。
服务器-B 通过 NAT 路由器后面的 IP-3 连接到互联网。
我想设置 WireGuard 以将来自 IP-2 的服务器 A 的所有公共流量转发到服务器 B,以由服务器 B 上的 IIS 处理。
进入 IP-1 的服务器 A 的公共流量应继续由服务器 A 上的 IIS 处理。
Server-A WireGuard 配置是这样的:
[Interface]
PrivateKey = ***
ListenPort = 51820
Address = 10.2.2.1/32
[Peer]
PublicKey = <Server-B-Public-Key>
AllowedIPs = <IP-2>/32
Server-B WireGuard 配置是这样的:
[Interface]
PrivateKey = ***
Address = <IP-2>/32
[Peer]
PublicKey = <Server-A-Public-Key>
AllowedIPs = 10.2.2.1/32
Endpoint = <IP-1>:51820
PersistentKeepalive = 25
VPN 连接正常,我可以看到握手。
但是,从 IP-2 进入的流量继续由服务器 A 上的 IIS 处理,而不是由服务器 B 处理。
如果该地址需要路由到另一台主机,那么它也不能分配给该主机,因为这将优先于您的自定义路由。
因此,您需要从服务器 A 的网络接口取消分配地址,然后使用代理 ARP 使 Vultr 仍然向您发送该地址的流量(即响应未分配地址的 ARP 查询)。
但是,虽然 Windows 中存在该功能,但我找不到任何 CLI 接口(显然它仅适用于内置 RAS VPN),我想它仍然可以通过 powershell 使用 P/Invoke 或从C 程序。也可能有适用于 Windows 的第三方代理 ARP 工具;还没有找过。
(我建议使用 Linux 或 FreeBSD 作为您的“路由器”服务器——而不是 Windows。后者在技术上能够进行 IP 路由,但在尝试执行内置 RAS 和 ICS 功能之外的事情时,功能严重不足。)
作为替代方案,如果所有流量都基于 HTTP 或 HTTPS,您可以在 Server-A 上配置一个 Web 服务器以充当“反向代理”并在 HTTP 级别转发请求。IIS 和 Apache 都可以充当反向代理。
netsh portproxy
对于其他 TCP 流量,Windows 也有一个可以转发 TCP 连接的内置代理。使用此功能的缺点是您的 Server-B 将始终将 Server-A 视为所有连接的来源。