Wireguard 自定义路由在暂停后丢失

Wireguard 自定义路由在暂停后丢失

我正在使用 WiFi 连接从联想笔记本电脑在 Ubuntu 22.04 上运行 wireguard 客户端,以连接到我的家庭网络。配置将所有流量引导到我的家庭网络,一切运行良好。我最近稍微更改了配置,包括一些自定义路由,以直接转到选定的站点 - 例如 facebook.com (157.240.0.0/16) - 而不是通过我的家庭网络。为此,我做了以下事情:

1. Added the following line to /etc/iproute2/rt_tables to create new custom routing table
>200 custom
2. I added "PostUp and "PreDown" directives to my wireguad configuration file:
PostUp = ip route add 157.240.0.0/16 via `ip route | grep default | cut -d ' ' -f 3,3` table custom
PreDown = ip route delete 157.240.0.0/16 via `ip route | grep default | cut -d ' ' -f 3,3` table custom

现在一切正常,路由表看起来符合预期:

ip rule show
0:  from all lookup local
32763:  from all lookup custom
32764:  from all lookup main suppress_prefixlength 0
32765:  not from all fwmark 0xca6c lookup 51820
32766:  from all lookup main
32767:  from all lookup default

ip route show table custom
157.240.0.0/16 via 192.168.1.254 dev wlp1s0 

ip route show table 51820
default dev wghome scope link

但是,如果我合上笔记本电脑的盖子,它已配置为进入挂起模式以节省电量。但是当我打开盖子并再次登录时,Wireguard 界面正常显示,但自定义路由表现在是空的。

当我尝试执行“wg-quick down wg0”时,它将无法关闭 wg0 接口,因为 predown 指令由于缺少要删除的路由而失败。我必须使用 ip link 语句等进行一些手动关闭,而指向我家路由器的自定义 DNS 配置保持不变,导致名称解析失败。

我更改了 NetworkManager 默认配置,以防止它处理 wireguard 接口,因为它无法处理 PreUp 和 PreDown 指令,并且我还关闭了 wifi 接口的 NetworkManager 省电功能。但这对问题没有影响。

现在这不是世界上最大的问题,因为我可以简单地不使用自定义规则,让所有流量都通过我的家庭网络,但由于网络路径较长,这有时会增加一些较长的往返时间,具体取决于我目前在世界上的位置。所以如果有人有想法我会很高兴。

我怀疑我需要有一些与挂起期间的 wghome 接口或 wifi 接口(或两者)相关的启动/关闭逻辑?

答案1

问题解决了。我自己找到了解决方案。在 /etc/NetworkManager/dispather.d/wg0-updown.sh 中创建了一个脚本,该脚本处理在 wg0 发生“up”事件时创建自定义路由,并在发生“down”事件时拆除路由。我还必须在进入挂起模式后处理 wifi 接口的“up”事件(例如当盖子关闭时)。

相关内容