我有一个 VPN 网关 Raspberry Pi(运行 Raspberry Pi OS)保护我的传出流量免受 VPN 泄漏。
我在我的 VPN 网关上运行 SOCKS5 代理(dante-server),以便我可以为特定应用程序在 VPN 上打出一个漏洞。
我按照以下说明创建了绕过 VPN 的第二个路由表:https://serverfault.com/a/761780
我不使用 cgroups,而是根据所有者是用户来标记数据包socks
。为了将没有 VPN 的路由复制到novpn
路由表(但没有 VPNtun0
路由),我创建了一个 dhclient 退出钩子,像这样。
对于 ipv4 来说,这一切都很顺利。但对于 ipv6,在默认路由表中我看到的是:
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
当我尝试将它们复制到表中时novpn
,它不允许我:
user@raspberrypi:~ $ sudo ip -6 route add fe80::/64 dev eth0 proto kernel metric 256 pref medium table novpn
user@raspberrypi:~ $ sudo ip -6 route add fe80::/64 dev eth1 proto kernel metric 256 pref medium table novpn
RTNETLINK answers: File exists
为什么系统能够在默认路由表中创建路由,而我无法将其复制到该novpn
表中?
答案1
Linux 内核可以作弊。它不会在意自己是否proto kernel
在同一路由表中自动添加具有冲突值的路由 ( )。这些路由通常是自动前缀 LAN 路由,无需进行某些检查。用户空间无法执行此操作:在同一个路由表中添加第二个接口上的相同路由会触发File exists
。
您可以更改度量,这样它就不会再被视为相同的路由,从而避免冲突。这对于链路本地 IPv6 地址无关紧要:使用它们时必须指定一个接口,以便eth0界面实际上不会有优先权:必须做出选择的情况永远不会发生。
sudo ip -6 route add fe80::/64 dev eth0 proto kernel metric 256 pref medium table novpn
sudo ip -6 route add fe80::/64 dev eth1 proto kernel metric 257 pref medium table novpn
[...]
由于第二条路由具有不同的度量:257 而不是 256,因此它不再是相同的路由,并且不存在冲突。
这对于自动化来说只会更加困难一些。