搜索 K
Appearance
如果你只想让 TUN 模式立刻跑起来,先按这五条做,八成问题当场消失:
wintun.dll 的位置比版本更重要。它必须和内核可执行文件放在同一目录,且架构必须与宿主进程一致(x64 内核配 x64 dll)。放在 System32 或 PATH 里不会生效,反而容易被杀软盯上。netsh winsock reset 会把你所有 LSP 依赖软件(含部分安全软件、企业 VPN)一起打回原形,属于核弹级操作,90% 的场景用不到。很多人把 Wintun 当成"一个虚拟网卡软件",这是误解。Wintun 是一个 基于 NDIS 的 L3 虚拟网络适配器实现,由 WireGuard 项目作者主导开发,用来替代老旧的 TAP-Windows6。它的核心设计目标有两个:把数据面的拷贝次数压到最低���以及把"装驱动"这件事从系统层面挪到运行时。
一条从浏览器发出的 TCP SYN,在 TUN 模式下会经历:
0.0.0.0/1 + 128.0.0.0/1 两条半默认路由,而不是 0.0.0.0/0,这一点后面细说)。wintun.dll 暴露的 API 从环形缓冲区批量取包,加密后发往远端节点。理解这条链路,就能理解为什么故障会集中在四个位置:权限(第 2、3 步的适配器与路由操作)、dll 加载(第 4 步)、路由竞争(第 2 步)、网段冲突(第 2 步的接口地址)。
几个必须建立的底层认知:
0.0.0.0/0 更具体,所以按最长前缀匹配胜出,同时不破坏原有默认路由。副作用是:企业 VPN 的网段路由一旦比 0/1 更具体,就会绕过 TUN,出现"部分网站不走代理"。198.18.x.x 段地址)。如果 DNS 请求没被正确劫持,你会看到"IP 直连正常、域名解析失败"。| 对比维度 | Wintun(TUN 模式) | TAP-Windows6(旧 TUN) | WinDivert 类(NF/Proxifier 型) | 系统代理(HTTP/SOCKS) |
|---|---|---|---|---|
| 内核实现层级 | NDIS L3 虚拟适配器 | NDIS L2 虚拟适配器(带以太网头) | WFP 过滤驱动(无虚拟网卡) | 无,纯应用层 |
| 是否需管理员权限 | 首次创建适配器需要 | 需要(安装驱动) | 需要 | 不需要 |
| 单流吞吐上限(千兆环境实测) | 1600–2300 Mbps | 700–1100 Mbps | 900–1500 Mbps | 受应用实现限制,通常 > 2000 Mbps |
| 空载 CPU 占用(单核占比) | 约 1%–3% | 约 3%–7% | 约 2%–5% | 近似 0% |
| UDP 转发支持 | 完整(含 QUIC、游戏、语音) | 完整 | 完整 | 依应用而异,多数不支持 UDP |
| ICMP(ping)穿透 | 支持 | 支持 | 部分支持 | 不支持 |
| 与 Hyper-V / WSL2 / Docker 共存 | 良好,需注意网段 | 一般,易抢占 | 良好 | 无影响 |
| 与第三方 VPN 共存 | 需手工调路由 | 冲突概率高 | 冲突概率中 | 无影响 |
| 抗杀软误杀 | 中(dll 常被误报) | 低(驱动签名老) | 高 | 高 |
| 典型故障恢复难度 | 中 | 高 | 低 | 极低 |
| 最适合场景 | 全局透明代理、开发调试、多设备共享 | 老系统兼容 | 精细化分流、单进程代理 | 浏览器/单应用轻量使用 |
矩阵里最值得注意的是**"与 Hyper-V / WSL2 / Docker 共存"和"网段冲突"这两项**——这是 2026 年 Windows TUN 故障的头号来源,远超驱动本身。
A. 纯浏览器党 / 轻度使用 不必开 TUN。系统代理 + 浏览器扩展的组合已经足够,且完全规避驱动层风险。只有当你要代理 Telegram 桌面端、Steam、命令行工具时才上 TUN。
B. 开发与运维(WSL2 / Docker / Git / npm) 必须 TUN。但请先做网段体检:Docker Desktop 默认占用 172.17.0.0/16,WSL2 常用 172.x 段,很多客户端默认隧道网段是 172.19.0.1/30 或 198.18.0.1。冲突时会表现为"容器起得来但没网"或"宿主机 DNS 随机挂"。解决思路是改隧道网段而不是改 Docker,成本更低。
C. 游戏与低延迟需求 TUN 支持 UDP,但要注意两个点:一是虚拟适配器本身有 0.2–0.8 ms 的处理开销(可忽略),二是节点线路质量才是延迟主因。如果你的诉求是中转加速,优先选 IEPL/IPLC 类内网专线,而不是折腾驱动。
D. 企业内网 + 代理双环境 最常见的翻车场景。公司 VPN(深信服 EasyConnect、AnyConnect、FortiClient)会安装自己的 NDIS 过滤驱动,抢占 LSP,并下发 10.x/172.x 内网路由。此时建议:TUN 用规则模式而非全局,把公司网段显式加白,并在 interface-name 里锁定物理网卡,避免 Wintun 抢走 VPN 隧道。
E. 多网卡 / 多热点切换(笔记本 + 手机热点) 开启 auto-detect-interface,让内核动态绑定当前默认出口。固定写死 Ethernet 或 WLAN 的配置,在切换热点后必然出现"TUN 已启动但无流量"。
关键字段逐条对照:
tun:
enable: true
stack: mixed # gvisor 兼容性最好;system 性能最高但偶发断流;mixed 是折中
device: Mihomo # 别用中文名,别用已有适配器同名
auto-route: true
auto-detect-interface: true
strict-route: false # 与公司 VPN / 虚拟机共存时建议 false
dns-hijack:
- any:53
- tcp://any:53
mtu: 1500 # 弱网/PPPoE 环境降到 1400 或 1420避坑要点:
device 名一旦被占用(上一次异常退出残留),会报 Cannot create a file when that file already exists。到设备管理器把残留的 Mihomo 适配器卸载即可,不用重装客户端。strict-route: true 会阻止流量从物理网卡直连,某些企业网络下会直接把 DNS 掐死。auto-route 后,如果 Get-NetRoute 里看不到 0.0.0.0/1 与 128.0.0.0/1,说明路由改写失败,八成是权限不足。v2rayN 从 6.x 起默认用 sing-box 承载 TUN。必须勾选"以管理员身份运行"(或在设置里安装为服务)。TUN 相关的 wintun.dll 由内核自动释放到运行目录,如果你之前手工从网上下过旧版本 dll 覆盖进去,反而会因签名校验失败无法加载。删掉手工放置的 dll,让内核自己解压是最高成功率的做法。
{
"inbounds": [
{
"type": "tun",
"interface_name": "singbox",
"inet4_address": "172.19.0.1/30",
"auto_route": true,
"strict_route": false,
"stack": "mixed",
"mtu": 1400
}
]
}如果 inet4_address 与现有网段重叠,sing-box 会直接启动失败并提示地址冲突。此时把它改成 172.30.0.1/30 之类冷门段即可。
wintun.dll 是否一致(x64 对 x64)。wintun.dll 是否与内核 exe 同目录。WireGuard Tunnel / Mihomo / singbox 残留。# 列出所有网络适配器及索引
Get-NetAdapter | Format-Table Name, InterfaceDescription, Status, LinkSpeed, ifIndex -AutoSize
# 查看接口跃点(metric 越小优先级越高)
Get-NetIPInterface -AddressFamily IPv4 | Sort-Object InterfaceMetric | Format-Table ifIndex, InterfaceAlias, InterfaceMetric, ConnectionState
# 查看路由表,确认 0.0.0.0/1 与 128.0.0.0/1 是否被 TUN 接管
Get-NetRoute -AddressFamily IPv4 | Sort-Object RouteMetric | Format-Table DestinationPrefix, NextHop, ifIndex, RouteMetric
# 确认 wintun 驱动是否注册
pnputil /enum-drivers | Select-String -Pattern "Wintun" -Context 2,4# 第 1 层:隧道接口本身
ping -n 4 172.19.0.1
# 第 2 层:IP 层直连(不涉及 DNS)
ping -n 4 1.1.1.1
curl.exe -s -o NUL -w "connect=%{time_connect} ttfb=%{time_starttransfer} speed=%{speed_download}\n" https://1.1.1.1
# 第 3 层:域名解析(验证 DNS 劫持是否生效)
nslookup google.com 172.19.0.1
Resolve-DnsName www.google.com | Format-Table Name, IPAddress, Type
# 第 4 层:路径质量(mtr 更直观,Windows 可用 tracert 或 winmtr)
tracert -d -h 20 1.1.1.1
mtr -rwzc 50 1.1.1.1
# 第 5 层:端口可达性
Test-NetConnection -ComputerName www.google.com -Port 443 -InformationLevel Detailed
tcping -n 10 -t 3 www.google.com 443# 内置工具,无需装 Wireshark,直接抓虚拟网卡
pktmon start --etw -c --comp nics -m real-time
# 复现问题后
pktmon stop
pktmon format PktMon.etl -o capture.txt关注两点:虚拟网卡上有没有出向 SYN(没有 = 路由没接管),有没有回向 SYN-ACK(没有 = 节点或链路问题,不是驱动问题)。
| 现象 | 关键命令 | 判定结论 | 处理动作 |
|---|---|---|---|
| 客户端提示 tun start failed / operation not permitted | 任务管理器看进程权限 | 权限不足 | 管理员运行或安装为服务 |
| 提示找不到 wintun.dll / 错误 126 | dir 内核目录 | dll 缺失或架构不符 | 删除手工 dll,让内核重新解压 |
| 提示 file already exists | 设备管理器比对适配器名 | 适配器残留 | 卸载残留适配器后重启内核 |
TUN 已连接,ping 1.1.1.1 通但网页打不开 | nslookup 指定隧道 IP | DNS 未劫持 | 开启 dns-hijack,检查 fake-ip 配置 |
ping 不通国内也不通国外 | Get-NetRoute 无 0/1 路由 | 路由改写失败 | 提升权限,检查 strict-route |
| 只有部分网站不通 | Get-NetRoute 找更具体前缀 | 网段被 VPN/内网路由绕过 | 调整规则模式,显式加白 |
| 容器/WSL 无网络 |