如何配置VPN链式连接(VPN Chaining)?
看起来你遇到的是典型的VPN链式连接路由冲突问题——直接先后连两个VPN时,WireGuard的全流量路由规则把连它自己服务器的流量也导进了隧道,形成了环路,导致所有网络访问被阻断。别担心,咱们一步步调整配置就能实现你想要的效果:让访问B国服务器的流量来自A国的ExpressVPN节点,同时普通互联网流量从B国的WireGuard节点出去。
问题根源分析
你当前的WireGuard配置里AllowedIPs = 0.0.0.0/0, ::/0会把所有流量(包括你用来连接WireGuard服务器的流量)都导向WireGuard隧道。但此时你已经连了ExpressVPN,本地默认路由已经指向ExpressVPN的隧道端口,这就会出现矛盾:系统要连WireGuard服务器的流量被WireGuard规则强行塞进隧道,但隧道还没建立(或者建立后流量在环路里打转转),最终导致网络完全中断。
具体解决方案
步骤1:先确认ExpressVPN正常工作
先启动并连接ExpressVPN到A国服务器,确保此时能正常上网,且你的公网IP显示为A国的(可以用IP查询工具验证)。这一步是基础,确保ExpressVPN的路由已经正确接管了你的默认流量。
步骤2:修改WireGuard配置
打开你的WireGuard配置文件,做以下调整:
调整AllowedIPs规则
把原来的全流量路由改成排除WireGuard服务器IP的全流量,这样系统会用ExpressVPN的路由去连接WireGuard服务器,而其他所有流量走WireGuard隧道。
假设你的WireGuard服务器Endpoint IP是xxx(就是你配置里Endpoint = xxx:51820的那个IP),修改后的Peer部分应该是:
[Peer] PublicKey = xxx PresharedKey = xxx AllowedIPs = 0.0.0.0/0, ::/0, !xxx/32 # 排除WireGuard服务器的IP Endpoint = xxx:51820
解释:
!xxx/32表示“除了这个IP之外”,这样系统会把连接WireGuard服务器的流量交给ExpressVPN的路由处理,而其他所有流量都走WireGuard隧道。
调整MTU(可选但推荐)
链式VPN会增加数据包的头部开销,原来的MTU = 1420可能偏大,容易导致分片或丢包。建议改成MTU = 1380,适配双层隧道的开销:
[Interface] PrivateKey = xxx Address = 10.6.0.7/24 DNS = 8.8.8.8, 8.8.4.4 MTU = 1380 # 调整为更小的数值
步骤3:启动WireGuard并验证
现在先保持ExpressVPN连接,再启动WireGuard并连接。此时应该能正常上网了,你可以做两个验证:
- 访问普通网站,查公网IP应该显示为B国的(说明互联网流量走WireGuard)。
- 登录你的WireGuard服务器(B国的server2),查看连接日志,会发现来自你的连接的源IP是A国的ExpressVPN节点(说明到server2的流量是从A国过去的)。
额外注意事项
- 如果你的WireGuard服务器是动态IP(不是固定IP),那上面的
!xxx/32规则就不适用了。这种情况下,你需要在启动WireGuard之前,手动添加一条静态路由,让WireGuard的域名解析后的IP走ExpressVPN的网关。比如在Windows上可以用命令:
(ExpressVPN的网关IP可以通过route add <WireGuard服务器IP> mask 255.255.255.255 <ExpressVPN网关IP>route print命令查看,找到目标0.0.0.0对应的网关) - 防火墙/杀毒软件可能会干扰VPN路由,如果你还是遇到问题,可以临时关闭防火墙测试,之后再添加允许两个VPN的规则。
备注:内容来源于stack exchange,提问作者Gerardus Calcitrosus

