我在服务器上运行了以下代码,这样即使服务器连接到 VPN,我也可以通过 SSH 进入服务器。以下代码在启动后作为服务运行。
ip addr add 192.168.1.113 dev enp1s0 label enp1s0:0
ip rule add from 192.168.1.113 table 402
ip route add default via 192.168.1.1 dev enp1s0:0 table 402
这适用于 openvpn,但不适用于 wireguard,因为我的 wireguard 客户端在上述规则前面添加了一些规则。
0: from all lookup local
32761: from all lookup main suppress_prefixlength 0
32762: not from all fwmark 0xca6c lookup 51820
32763: from 192.168.1.113 lookup 402
32766: from all lookup main
32767: from all lookup default
如果我在 wireguard 连接后添加规则from 192.168.1.113 lookup 402
,那么我就可以通过 SSH 进入服务器。所以我认为这是一个优先级问题。
32763
即使在 wireguard 连接并添加了那几条规则( 32761
, )之后,如何确保我的规则( )仍然保持优先权?32762
失败的解决方案:
我了解到左边的数字是优先级。然后我尝试将规则的优先级调低。
ip rule add from 192.168.1.113 table 402 prio 300
.. 但是在我连接到 wireguard vpn 之后,wireguard 客户端只是将他们的规则优先级放在我的规则之下299
,然后298
。
298: from all lookup main suppress_prefixlength 0
299: not from all fwmark 0xca6c lookup 51820
300: from 192.168.1.113 lookup 402
有什么办法可以防止这种情况发生吗?我想我可以PostUp
在 wireguard conf 文件中放置一个命令来改变优先级,但我觉得必须有一个更干净的解决方案。
路由规则的操作由脚本执行;您可以在此处
wg-quick
查看相关部分。由于它添加规则时没有设置明确的优先级,因此它们将始终添加到表中任何现有规则的“下方”。您需要确保仅在配置接口和路由表后才 添加自定义规则
wg-quick
。您可以通过将自定义配置移至后续挂钩来实现这一点。将PostUp
指令添加到接口配置文件中:(
%i
将被替换为接口名称。)这将导致
wg-quick
在打开界面后执行给定的命令。在您的PostUp
脚本中(这里是/etc/wireguard/scripts/example-postup.sh
,但可以在任何地方),添加您的自定义规则。例如:您可能需要添加另一个脚本(可能是
PreUp
或者可能是PostDown
)来删除该自定义规则;否则下次打开界面时您会遇到同样的问题(因为在wg-quick
添加自定义规则时该规则已经存在)。