如何将流量从特定 IP/网络接口路由到商业 VPN 线卫接口?

如何将流量从特定 IP/网络接口路由到商业 VPN 线卫接口?

我正在尝试实现一种设置,其中我的设备有一个 Tailscale 网络,可以路由到我的 Tailscale 网络上的 VPS,这是一个退出节点,但出口节点可以通过 ProtonVPN 线卫隧道转发相关流量。这样做的主要动机是我的 Android 客户端一次只能有一个“始终在线”VPN 连接,这需要我在以下两者之间进行选择:任何一个连接到 Tailscale 或 ProtonVPN。

同时,我想确保在出口节点“终止”的流量(例如通过 SSH 连接到 VPS 上的 Tailscale IP)不会转发到上游 VPN。对于那些不熟悉 Tailscale 的人来说,它提供了一个名为tailscale0用 IP 地址调用100.64.0.0/10 范围到设备。此外,我在 VPS 主机上有几个 Docker 容器,它们通过 HTTP/HTTPS 在公共互联网上公开 Web 服务,我希望这些服务保持可访问性。

下面的图表总结了我所需的设置(以及 VPS 上的网络接口): 所需的 Tailnet、VPS 和 VPN 设置

在 VPS 出口节点上,我通过设置net.ipv4.ip_forward = 1和启用了 IP 转发net.ipv6.conf.all.forwarding = 1。我正在运行 Ubuntu 22.04,启用了 ufw,允许端口 80、443 和 SSH。

ProtonVPN 提供的wireguard 配置如下所示:

[Interface]
PrivateKey = <REDACTED>
Address = 10.2.0.2/32
DNS = 10.2.0.1

[Peer]
PublicKey = <REDACTED>
AllowedIPs = 0.0.0.0/0
Endpoint = <PROTON VPN SERVER>:51820

我已放入此配置,/etc/wireguard/wgpvpn0.conf但当我运行时wg-quick up wgpvpn0,我无法再通过 SSH 连接到 VPS(通过公共互联网接口或 Tailscale 接口),并且通过公共接口公开的端口 80/443 上托管的所有服务都不再可访问。我认为这是由于AllowedIPs = 0.0.0.0/0wgpvpn0接口成为所有流量的默认网关。

我认为解决方案是在wireguard 配置中使用来PreUp/PostDown添加一些防火墙/路由规则,但是由于不熟悉 iptables,我不确定要添加什么。我认为我需要的规则是:

  • 任何具有以下特征的流量最终目的地100.64.0.0/10 范围内的网络应由 Tailscale 网络接口管理。
  • 任何带有最终目的地Tailscale 出口节点 IP 的信息应由出口节点处理。我怀疑上面的规则会通过 Tailscale 接口来处理这个问题。
  • 任何具有以下特征的流量最终目的地VPS 的公共 IP 的信息应由 VPS 处理(例如,通过ens3接口接收并由我的 VPS 上运行的反向代理处理)。
  • 从我的 Tailscale 网络(这意味着由 Tailscale 接口接收)转发到 VPS 出口节点的任何流量,但具有最终目的地公共互联网的网络应通过 ProtonVPN 线卫接口路由。相反方向的反应也应该相应地流动。 (例如,通过 Tailscale 网络向 google.com Android 客户端登录请求 -> tailscale 网络上的 VPS -> VPS 上的 ProtonVPN 隧道 -> 通过互联网在 Google 服务器上登录响应 -> VPS 上的 ProtonVPN 隧道 -> tailscale 网络上的 VPS -> Android Tailscale 网络上的客户端)
  • 来自 VPS 的任何流量都应使用 ProtonVPN 隧道(0.0.0.0/0 现在的用途)。

有人可以帮忙吗?

相关内容