Windows 下 sing-box tun 全局代理配置踩坑记
背景
最近在 Windows 系统上配置 sing-box 的 tun 模式全局代理时,遇到了一个典型的"虚拟网卡冲突"问题。经过一番折腾,最终发现问题的根源和解决方案。记录下这个过程,希望能帮助遇到类似问题的朋友。
过程有大模型辅助
问题描述
目标是配置 sing-box 的 tun 模式,实现系统级别的全局代理,让所有流量(包括 curl、浏览器等)都经过 sing-box 转发。更重要的是,我们要通过 SSH 隧道将本地的 socks5 代理分享到远程服务器。
整体架构
| |
配置过程
1. 建立 SSH 隧道
首先建立 SSH 隧道,将本地的 socks5 代理端口转发到远程:
| |
这个命令的含义:
-R 7890:127.0.0.1:7890:将远程的 7890 端口转发到本地的 127.0.0.1:7890-N:不执行远程命令,仅用于端口转发-f:后台运行administrator@192.168.5.20:目标服务器
2. 初始配置文件
创建 sing-box 配置文件 config.json:
| |
3. 第一个问题:配置文件解析失败
启动 sing-box 后发现,虽然进程启动了,但 tun 功能没有生效。检查发现:
- tun0 网卡创建了,但 IP 是系统自动分配的
169.254.34.95 - 路由表没有自动修改,默认路由依然指向物理网卡
- curl 流量没有经过 sing-box
原因:JSON 文件中的注释导致 sing-box 解析失败,auto_route 等功能没有生效。
解决:清理配置文件,去除所有注释,确保是合法的 JSON 格式。
4. 第二个问题:手动分配 IP 冲突
为了测试,手动为 tun0 分配了 IP:
| |
这导致 tun0 有了正确的 IP,但 sing-box 无法接管。
5. 第三个问题:虚拟网卡冲突
重启 sing-box 时出现错误:
| |
原因:tun0 虚拟网卡已经存在,sing-box 无法重新创建。
解决方案
1. 彻底清理虚拟网卡
| |
2. 优化配置文件
创建无注释的配置文件,并添加必要的字段:
| |
3. 关键发现:关闭其他终端
在多次尝试后,发现一个关键问题:其他正在运行的终端或进程可能占用了 tun 相关的系统资源。
最终解决方案:
- 关闭所有相关的终端窗口
- 确保没有其他 sing-box 进程在运行
- 以管理员权限启动 sing-box
| |
完整的工作流程
1. 建立 SSH 隧道
| |
2. 启动 sing-box
| |
3. 验证配置
| |
验证方法
1. 检查 tun0 网卡状态
| |
应该显示:
| |
2. 检查路由表
| |
应该看到默认路由(0.0.0.0/0)指向 tun0。
3. 测试流量
| |
如果配置成功,curl 的流量会经过 sing-box,在日志中能看到流量记录。
4. 检查 SSH 隧道
| |
经验总结
SSH 隧道配置:使用
-R参数进行反向端口转发,将远程端口映射到本地。配置文件格式:sing-box 的配置文件必须是严格的 JSON 格式,不能包含注释。
虚拟网卡管理:Windows 下的虚拟网卡管理比较严格,一旦创建就很难完全删除,需要彻底清理。
进程冲突:多个终端或进程可能占用相同的系统资源,导致 tun 网卡创建失败。
权限要求:tun 模式需要管理员权限,且需要确保没有其他程序干扰。
调试方法:通过检查网卡状态、路由表和进程状态,可以快速定位问题。
常见错误及解决方案
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
Cannot create a file when that file already exists | tun0 网卡已存在 | 彻底清理 tun0 网卡 |
open interface take too much time to finish | 系统资源被占用 | 关闭其他终端,重启系统 |
| 路由表未修改 | auto_route 未生效 | 检查配置文件格式,确保无注释 |
| tun0 IP 为 169.254.x.x | 自动分配失败 | 在配置文件中指定 address 字段 |
| SSH 隧道连接失败 | 网络或权限问题 | 检查 SSH 配置和防火墙设置 |
应用场景
这个配置的主要应用场景是:
- 远程办公:在远程服务器上通过 SSH 隧道使用本地的代理服务
- 网络隔离环境:在内网环境中通过隧道访问外网资源
- 开发调试:在远程开发环境中使用本地的网络代理
这个踩坑过程让我深刻理解了 Windows 下虚拟网卡管理的复杂性,也学会了如何系统地排查和解决这类问题。通过 SSH 隧道结合 sing-box tun 模式,实现了灵活的全局代理配置。
最后,想起 sing-box 支持 SSH 出站