跳转至

记一次给 v2rayN 的 pr

最开始只是想研究 Linux 上 tun 是怎么工作的,向 AI 请教后说去看 ip route 路由表,然而开关 tun 模式后并没有发现 ip route 有什么不同,然后又找 ip rule,果然,是规则变了,添加了好几条更高优先级的规则,如果匹配到就去 table xxxx 查规则。 然后关闭 tun 模式,再次查看 ip rule,竟然没变,这就很奇怪了,尝试另一个代理客户端,开启 tun,查看 ip rule,发现成功修改,然后关闭 tun,ip rule 恢复如初,说明正确清理了,而 v2rayN 没有。

于是打算提 issue,去 github,打开 issue,看到模板需要贴软件运行日志,我就去打开软件日志看,结果发现并没有任何错误,成功执行了 run_as_sudo 和 kill_as_sudo 两段脚本,到这里我好奇心被激发了,没有错误说明存在 bug,那就找 bug 呗。

首先找到两个脚本,打开一看,第一个仅仅是 sudo 然后运行命令,第二个脚本接受一个 PID 然后 kill -9 暴力递归杀掉,然后我就想可以给脚本手动添加清理代码,于是就想去看看别的代理客户端是怎么清理的...结果翻了半天代码发现客户端根本就没清理,直接交给内核清理,恍然大悟,确实是内核该做的事情,但是 v2rayN 的 tun 内核是什么呢?我知道 xray 暂时还没实现 tun 入站,所以去看软件的 config,原来是 sing-box 的 tun 然后出站设置成 xray 的 socks 监听端口,所以是 sing-box 内核。但是 sing-box 为什么没能正确清理呢?

接着我在电脑上裸跑 sing-box + tun 配置,然后尝试一些终止方法比如 Ctrl + C 都是可以正确清理的。到这里可以确定问题出在客户端这边了。去看了 sing-box 代码不懂 go 但是大概找到了处理终止信号的逻辑,再次确定是客户端的问题。

首先怀疑是 kill -9 的问题,kill -9 是强制进程终止,kill -9 太暴力了直接杀掉了 sing-box 导致其没有机会清理,所以核心思路不要暴力杀掉,所以修改代码为 kill -15 $PID。所以开始修改脚本,首先尝试直接修改,发现会被软件覆盖(出于安全原因这当然是合理行为),然后我就想我改完后直接 chattr +i 不让软件再改了,结果报错不运行了,所以只能去重新编译软件了。

编译软件又踩了会坑,第一次用 C#,上网搜了点命令就开始编译了,结果编译的是 Windows 版本所以直接报错了,然后去 aur 上抄 PKGBUILD 上的编译命令,终于编译成功。但是实际测试下来 ip rule 还是没有正确清理,就让 AI 找到 run_as_sudo 和 kill_as_sudo 的代码逻辑讲给我听,接着我描述了我的问题,AI 就给我指出说 PID 捕捉的是 bash 的 PID 而不是 sudo 或 sing-box 的 PID,拿到错误的 PID 就算 kill -15 也没用。恍然大悟,在 sudo 前加上 exec 然后重新编译,开关 tun,发现 ip rule 正确清理,最后加上一些细节的打磨 pr 就完成了。


Loading Comments...