如何将WiFi Dongle的互联网流量通过uvpn0 VPN接口路由至10.87.0.1?
看起来你遇到的是典型的VPN路由黑洞问题——当你直接把默认路由切换到uvpn0后,连VPN服务器本身都ping不通了,核心原因是:VPN隧道的基础连接是通过wlan0建立的(你需要先访问VPN服务器的公网IP才能维持uvpn0隧道),但修改默认路由后,所有流量(包括去VPN服务器的流量)都被导向了uvpn0,这就形成了逻辑上的“死循环”,导致隧道无法维持。
下面是一步步的解决思路和操作:
1. 先保留VPN服务器公网IP的路由走wlan0
首先你需要找到VPN服务器的公网IP地址(不是10.87.0.1这个内网虚拟地址),可以通过修改路由前执行traceroute 10.87.0.1,或者查看VPN客户端的配置文件获取。
假设VPN服务器公网IP是X.X.X.X,同时先找到wlan0的默认网关(执行ip route show default | grep wlan0,比如输出是default via 10.117.176.1 dev wlan0,网关就是10.117.176.1)。
添加这条关键路由,确保访问VPN服务器的流量仍走wlan0:
ip route add X.X.X.X/32 via 10.117.176.1 dev wlan0
2. 替换默认路由到uvpn0(而非新增)
你之前用ip route add default只是新增了一条默认路由,系统可能会优先选择旧的wlan0路由,或者导致路由冲突。正确的做法是先删除原默认路由,再添加新的:
# 删除原wlan0默认路由 ip route del default via 10.117.176.1 dev wlan0 # 添加uvpn0作为默认路由 ip route add default via 10.87.0.1 dev uvpn0
3. 调整NAT规则(覆盖所有需要走VPN的网段)
你当前的NAT规则只覆盖了10.117.176.0/24(wlan0所在网段),但你的dongle还有usb0接口的10.0.0.0/24网段,如果主机也需要通过VPN上网,需要把这个网段也加入NAT:
# 保留原有规则(针对wlan0网段) iptables -t nat -A POSTROUTING -s 10.117.176.0/24 -o uvpn0 -j MASQUERADE # 添加usb0网段的NAT规则 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o uvpn0 -j MASQUERADE
4. 验证VPN服务器端的路由配置
别忘了确认VPN服务器(10.87.0.1)那边是否配置了正确的反向路由:需要有一条指向10.117.176.0/24和10.0.0.0/24的路由,下一跳是你的dongle的VPN地址10.87.0.3,同时服务器要开启IP转发(执行sysctl net.ipv4.ip_forward=1)。
5. 验证路由表和连通性
执行ip route show查看路由表,确认:
- 到VPN服务器公网IP
X.X.X.X的路由指向wlan0 - 默认路由指向uvpn0
然后尝试ping10.87.0.1,再访问外网(比如ping 8.8.8.8),确认流量是否通过uvpn0。
备注:内容来源于stack exchange,提问作者Ragavan Kalatharan

