适合 Linux 桌面的 sing-box 客户端配置
Contents
sing-box 作为代理工具的集大成者,支持多协议多功能,且覆盖多平台,但是配置起来比较复杂,这里给出一个适合 Linux 桌面使用的配置样本,供参考。
本配置适合 Linux 桌面,不适配 Windows 和 Android,Mac OS 也许可以参考部分。
配置策略
本配置主要实现的目的:
- 提供本地 HTTP/HTTPS/SOCKS5 代理,供给浏览器(Firefox)和命令行工具等使用,自动分流国内和国外流量(基于 GeoIP 和 GeoSite);
- 通过代理的 DNS 同样提供国内和国外分流;
- 提供本地 DNS 服务器,通过该服务器可以实现 DNS 国内和国外分流;
- 避免 DNS 泄漏(DNS 泄漏可以认为是:访问的境外域名泄漏给国内 DNS 服务商,使之可以获悉你访问的境外网站);
- 过滤广告;
配置内容
本配置主要内容如下,适合 sing-box 1.10 beta 以上版本,如果使用版本为 1.9.x,则可以考虑删除广告过滤的配置即可:
|
|
备注
主要配置思路:
-
dns 服务器部分,国内使用 alidns 作为境内 dns 服务器,有普通和 DOH 两个,国外使用 Cloudflare 的 DOH dns 服务器,同时创建了一个用于屏蔽的 dns-block 服务器;
-
dns 规则部分较为简单,基于 anti-ad 规则进行 dns 屏蔽;对于全局代理入口 global 则都转发到 dns-remote 解析;对于域名匹配了 GeoIP-CN 和 GeoSite-CN 规则集,则使用境内 dns 服务器; final 使用 dns-remote。这里实现了 dns 分流和广告屏蔽。outbound=any 规则保证了代理服务器域名的解析,否则代理无法正常启动。
-
inbounds 提供了 3 个服务入口:
- dns-in 提供本地 dns 服务,后续可以将系统 dns 请求转发到这里(配合 systemd-resolved);
- global 提供本地全局代理,支持 HTTP/HTTPS/SOCKS5,代理流量全部走境外;
- auto 提供本地分流代理,支持 HTTP/HTTPS/SOCKS5,代理流量会自动分流;
-
outbounds 除了常规的 direct、block 外,创建了一个 dns-out 服务,以及用于代理的 selector 和真正的 trojan/hyseria,这里具体配置则根据实际的来。
-
route 规则部分,主要包括:
- dns-in 转发给 dns-out,用于本地 dns 服务器;
- 基于 anti-ad 的广告屏蔽;
- global 的全局代理路由;
- 基于境内网站、IP 匹配或私有网络 IP 匹配,则流量通过本地;
- final 设置为 proxy 走境外来保证境外流量规则;
- protocol=dns 部分走 dns-out 是为了 dns 分流;
-
规则集部分,除了 anti-ad 需要 1.10 beta 以上版本支持,其他都兼容 1.9.x。这里都是用远程规则集,并使用了
experimental.cache_file
来保证本地缓存。 -
需要额外注意的是,不要在 DNS 规则中使用 IP 规则集(比如 GeoIP 等),这会导致在 DNS 路由处理前将域名解析为 IP 进行匹配,以至于在这个阶段发生 DNS 泄漏。
自启动管理
为了实现 sing-box 自启动和权限,则可以使用如下 systemd service 文件,需要注意可执行文件路径及配置文件路径:
|
|
通过 systemctl enable sing-box –now 后,通过 systemctl status sing-box 查看状态,通过 journalctl -u sing-box 查看日志。
DNS 转发
另外,如果想将系统 DNS 全部转发给 sing-box,我们则可以通过 systemd-resolved dnsmasq 来转发请求(dnsmasq 可以利用 strict-order
来实现 fallback 机制)。
安装完 dnsmasq 后,新增配置文件:
|
|
然后 systemctl restart dnsmasq 来重启服务。
同时,需要手动修改 /etc/resolv.conf
文件来指定使用 dnsmasq 服务器:
|
|
为了避免 /etc/resolv.conf
被以外修改,可以使用 sudo chattr +i /etc/resolv.conf
来标记不可变属性。
对于 Firefox,需要将配置中的代理配置为 127.0.0.1:1090,所有协议共用这个端口。对于普通命令行工具,则可以在 ~/.bashrc 文件中追加两行:
|
|
DNS 泄漏检测
所有正常后,想检查是否存在 DNS 泄漏,则可以用 Firefox 访问以下两个网站任意一个即可:
如果访问的 ip 显示境外,且 dns 服务器也在境外,则表明不存在泄漏。另外,还可以使用 wireshark 来抓 dns 包检查。