我有一个简单的网状 VPN(使用 Tinc 实现),其中包含我的个人笔记本电脑和具有公共 IP 的 VPS。假设服务器的公共 IP 是1.2.3.4
。笔记本电脑的私有地址是10.16.1.2
,服务器的私有地址是10.16.0.2
。
我想路由全部通过 VPN 传输来自笔记本电脑的流量,并使其从 VPS 退出。我已经通过启用转发和伪装将服务器设置为网关,但我不知道如何在笔记本电脑上配置路由。
问题是笔记本电脑没有固定的本地子网。例如,有时它可能是192.168.0.0/24
我家路由器的子网,也可能是172.16.0.0/12
我大学的子网。
我希望我的笔记本电脑能够通过 VPN 网关路由所有流量,但同时,即使它有一个未知的变化子网,我也应该能够访问本地网络。
这是我成功完成的事情:
# ip route
default via 192.168.0.1 dev wlan0
0.0.0.0/1 via 10.16.0.2 dev vpn
128.0.0.0/1 via 10.16.0.2 dev vpn
10.16.0.0/16 dev vpn proto kernel scope link src 10.16.1.2
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.133
按照一些 OpenVPN 指南,我将整个互联网分成两个大的/1
,这样它们就可以充当某种默认路由,而不会更改实际的默认路由(default via 192.168.0.1 dev wlan0
)。问题是,即使是发往 VPS 的数据包也会1.2.3.4
被路由捕获/1
,导致流量被卡住。
如果可以写类似这样的内容:
ip route add 1.2.3.4/32 via default
这会很好,但我不认为这可能。
我甚至尝试了基于策略的路由并使用 iptables 标记数据包,但没有成功。
答案1
如果不知道您的实际 VPS IP 地址,我无法为您提供确切的命令,但基本上您需要将“互联网”分成更多部分,其中不包括您的 VPS。例如,如果您的 VPS 地址是 255.255.255.255(显然不是),那么您需要
- 127.0.0.0/7 通过 10.16.0.2 dev vpn
- 255.0.0.0/15 通过 10.16.0.2 dev vpn
- 255.255.0.0/23 通过 10.16.0.2 dev vpn
- 255.255.255.0/31 通过 10.16.0.2 dev vpn
请注意,这涵盖了您的第二个互联网块,但您的 VPS 地址除外。请注意,我故意选择了一个简单的地址,这样我就不会整天都在这里,但如果您愿意编写足够的路线,您可以为任何您想要的地址执行此操作,只要您的 VPS 地址不变,您只需执行一次即可。