我想在我的 Ubuntu 服务器上建立几个到两个不同国家 A 和 B 的 VPN 连接。然后我想设置基于GeoIP的规则来确定当我上网时应该使用哪个VPN连接。如果我浏览的网站位于 A 国,那么我应该使用 VPN 连接 A,如果它位于 B 国,那么我应该使用连接 B,如果它既不在 A 国,也不在 B 国,那么我不应该使用任何一个 VPN 连接(默认应该是我的 DSL 连接)。
这个可以设置吗?
答案1
我不知道有什么“开箱即用”的解决方案可以完全自动且无缝地完成此操作。有可能的。我能做的就是提供一个“高层次”的总结。
基本上,您正在考虑路由问题。您希望发往特定子网的流量通过不同的网关 IP 地址传输。如果您愿意在没有动态解决方案的情况下生活,您可以执行以下操作:
- 找出哪些子网代表“不同国家/地区”的流量以及您希望他们使用哪个 VPN。例如,假设 10.4.0.0/16 中的任何内容都位于不同的国家/地区,并且您不希望它离开,除非通过 VPN。您已将调制解调器连接到
eth0
,并且它具有 ISP 的默认网关 IP。 - 如果您的 VPN 提供商使用为每个 VPN 创建虚拟网络适配器的协议(例如,OpenVPN 创建一个虚拟
tun0
接口,PPTP 会执行类似的操作(如果我没记错的话),那么这会容易得多 - IPSec 可能会给您带来问题)。假设您有一个很酷的基于 OpenVPN 的提供商,它为您提供适当的配置文件并tun0
为您创建一个。 - 使用该
ip route
命令创建一条新路由,表示任何离开系统前往 10.4.0.0/16 的流量都必须通过 离开tun0
。您需要为其分配适当的指标,使其始终在实际默认网关上使用。 - 为了真正安全起见,您可能需要创建一些规则来阻止所有从默认网关(您的实际 NIC)
iptables
流出到 10.4.0.0/16 的流量。eth0
这可以防止泄漏。 - 您需要将
ip route
命令放入启动时执行的脚本中。 - 对您的第二个 IP 范围和 VPN 再次执行此操作。
- 然后,不在这两个 IP 范围内的流量将被忽略
eth0
(即您的默认网关)。
您可以使用 轻松找到远程站点 ISP 的 IP 范围whois
,除非他们使用某种类型的 CDN 前端。如果使用 CDN 前端(例如 Cloudflare),该网站将看起来来自完全不同的位置。在这种情况下,您最好使用 HTTP 层代理,例如squid
它可以根据 URL 的内容将流量重定向到不同的 IP。