看了下 wireguard 的实现
1. 对方的目的地址在本端是有记录的,就记录在 wg_peer 的 endpoint->src4 里
这个包从哪个 netdevice 进来的也有记录,同样记录在 wg_peer 的 endpoint->src_if4 里
只不过在查路由的时候,如果查到的出口与入口不相同(rt->
dst.dev->ifindex != endpoint->src_if4),就会让路由模块重新选择源地址
2. 你的修改只是不让路由模块重新选择源地址,但是出口还是错的,在某些情况下回程包仍有可能被丢弃
3. 个人认为上游不接受你的修改是因为已经提供了 fwmark 来解决你的问题
举例来说
ip route add default dev ens3 table 1000 #创建路由表 1000 ,默认路由出口是 ens3 ,如果是 p2p 接口这样就 ok ,否则要写成下一跳
wg set wg0 fwmark 1234 # 由 wg0 接口出的包一律打上 fwmark 1234
ip rule add fwmark 1234 table 1000 # 打上 fwmark 1234 的包查路由表 1000