在服务器上使用 sing-box 代理

背景

服务器上面不能科学上网。以前都是直接 用 ssh 做代理转发 的,但是现在在校外只能使用 rvpn,连接非常不稳定,也无法大流量传输文件,只能考虑在服务器上直接上网。

平时使用 Windows 上的 v2rayN 上网,考虑将其配置迁移到服务器上。由于服务器是多人共享,我有以下需求:

  1. 不用 systemd 启动。
  2. 配置私有化,且其他人不能看到配置。
  3. 用的时候临时启动,用完之后就退出进程。

服务器上的准备

  1. 服务器上 下载安装 sing-box
  2. 服务器上创建一个文件夹 sing-box。
  3. 在 v2rayN 中点“设置 > 打开存储所在的位置”,文件夹中的 bin\srss 中包含大量 geo* 文件。将 srss 文件夹拷贝到服务器上的 sing-box 文件夹中。

这一步下载了 sing-box 并且将一些公开配置复制到了服务器上。

准备好配置文件

  1. 在 v2rayN 中切换到 sing_box 模式,调整好配置。配置包括:代理服务器、DNS、规则、是否运行局域网访问等。
  2. 在 v2rayN 中点“设置 > 打开存储所在的位置”,文件夹中的 binConfigs\config.json 就是可用的文件。
  3. 复制一份文件,将 experiment.clash_api 字段删掉。
  4. 把所有 geo 文件的路径引用全都改成 ./srss/geo*。只要在 sing-box 文件夹启动服务,就可以相对于这个路径访问。
  5. 把 cache 路径改成 ./cache.db

这一步得到了一个文件 config.json,先别上传。

对配置文件加密

将处理好的配置文件保存为 config.json,使用 openssl(WSL 中有)对其加密。参考 https://askubuntu.com/a/160334/ ,不过 des3 加密强度不够,要换一下。

openssl des3 -pbkdf2 -iter 100000 < config.json > config.json.des3

现在得到了新的文件 config.json.des3。将这个文件复制到服务器上的 sing-box 文件夹内。

运行

首先来到 sing-box 文件夹中,然后运行:

openssl des3 -pbkdf2 -iter 100000 -d < config.json.des3 \
    | sing-box run -c /dev/stdin

有个在 tmux 中就无法成功运行的问题(提示有 $\mu$ 字符),我个人感觉还是 Windows Terminal 不识别转义序列的问题。进入 tmux 之后别用初始的 panel,开启一个新的 panel 就能用了。参考 tmux attach 的时候出现转义字符序列

ss 验证是否成功:

Tip

输出不一定带有 sing-box 名字(我不确定),如果查不出来可以去掉 grep,看看列表里面是否出现了期望的端口号。