代理网络学习笔记:从系统代理、TUN 到 DNS 与 Fake-IP
平时使用 Clash Verge Rev 时,经常会同时看到系统代理、TUN、规则模式、Fake-IP、混合端口和 Mihomo 等名词。它们看起来都和“代理”有关,却处在完全不同的层次。
理解这套系统最重要的不是记住每个开关,而是先回答四个问题:
- 应用流量怎样进入代理程序?
- 代理程序怎样知道目标域名?
- 接管流量后,怎样决定直连还是走节点?
- 代理程序用什么协议连接远端节点?
1. 先建立完整的分层模型
可以把一次网络访问拆成下面几层:
应用:浏览器、Git、Codex、游戏 ↓流量入口:系统代理 / HTTP / SOCKS5 / TUN ↓代理内核:Mihomo、sing-box、Xray ↓决策方式:规则 / 全局 / 直连 ↓节点协议:Shadowsocks、VMess、VLESS、Trojan、Hysteria 2 ↓远端代理服务器 ↓目标网站这些概念不是互相替代的选项。例如,一次真实连接可能是:
浏览器 → TUN 接管 → Mihomo 根据域名规则选择节点 → 使用 Shadowsocks 连接远端节点 → 访问 HTTPS 网站其中 TUN、Mihomo、规则模式、Shadowsocks 和 HTTPS 分别位于不同层。
2. 从 URL 到 IP:DNS 在做什么
浏览器输入:
https://docs.example.com:8443/guide?id=1需要 DNS 解析的只有主机名:
docs.example.com协议 https、端口 8443、路径 /guide 和参数 id=1 都不参与 DNS 查询。
DNS 的工作是把域名转换成网络连接需要的 IP:
docs.example.com ↓ DNS203.0.113.20得到 IP 后,操作系统才能向对应服务器发起 TCP 或 UDP 连接。
不过,“浏览器输入 URL 后一定先查询公共 DNS”并不严谨。浏览器可能先检查自己的缓存,也可能把域名交给系统、Clash 或远程代理解析。使用显式 HTTP 代理时,浏览器甚至可以直接发送:
CONNECT docs.example.com:443然后由代理程序处理域名。
3. DHCP:自动领取网络配置
DHCP 全称是 Dynamic Host Configuration Protocol,即动态主机配置协议。设备连接 Wi-Fi 或有线网络后,通常通过 DHCP 自动获取:
- 本机 IP;
- 子网掩码;
- 默认网关;
- DNS 服务器;
- 地址租期。
经典交互过程简称 DORA:
Discover:设备询问“网络里有 DHCP 服务器吗?”Offer: DHCP 服务器提供一套配置Request: 设备请求使用这套配置Ack: DHCP 服务器确认租约家庭网络中的 DHCP 服务器通常是路由器。公司网络可能使用独立 DHCP 服务,并向员工设备下发公司内部 DNS。
在 Windows 中可以查看当前网卡得到的 DNS:
ipconfig /all或者:
Get-DnsClientServerAddress -AddressFamily IPv4如果系统既没有获得 DHCP 配置,也没有手动配置地址,Windows 可能给网卡分配 169.254.x.x。这通常表示没有成功取得正常的网络配置。
4. hosts 与 DNS 的关系
Windows 的 hosts 文件位于:
C:\Windows\System32\drivers\etc\hosts可以手动写入静态映射:
10.20.30.40 oa.example.internal对于由 Windows 系统解析器处理的请求,可以近似理解为:
本地缓存 / hosts ↓ 未命中DNS 服务器但关键在于“谁负责解析”。如果浏览器把域名交给 HTTP/SOCKS 代理,或者 TUN 将 DNS 请求交给 Mihomo,那么最终可能由代理内核解析。此时是否使用 Windows hosts,要看内核配置。
Mihomo 中相关字段包括:
dns: use-hosts: true use-system-hosts: true它还可以维护自己的 hosts:
hosts: "oa.example.internal": 10.20.30.40修改 Windows hosts 后,可以清理系统 DNS 缓存:
ipconfig /flushdns浏览器可能还有独立缓存,必要时需要完全重启。
5. 系统代理:应用主动把请求交给代理
开启 Clash Verge Rev 的系统代理,通常是修改 Windows 的系统 HTTP 代理设置:
支持系统代理的应用 ↓127.0.0.1:本地代理端口 ↓Mihomo优点是简单、开销较小,浏览器和许多桌面应用都能直接使用。
限制也很明显:只有愿意读取系统代理设置的程序才会进入 Mihomo。某些命令行工具、游戏、Windows 服务、UDP 程序、WSL 或容器中的进程可能忽略系统代理。
因此经常出现:
浏览器可以访问但 Git、npm 或某个程序不能访问纯粹开启系统代理通常不会直接改变 Windows 网卡的 DNS 地址;不过被代理的请求可能改由 Mihomo 或远程节点解析域名。
6. TUN:用虚拟网卡实现透明代理
Clash Verge Rev 中的“TUN 模式”“虚拟网卡模式”和“TUN 透明代理”,通常是在描述同一套机制。
- TUN 描述实现技术;
- 透明代理描述使用效果。
开启 TUN 后,代理内核创建虚拟网络接口并调整系统路由:
应用正常联网 ↓Windows 网络栈 ↓TUN 虚拟网卡 ↓Mihomo ↓直连或代理节点应用不需要知道代理地址,也不需要原生支持 HTTP 或 SOCKS5,所以 TUN 更容易接管命令行程序、游戏、UDP 和其他不读取系统代理的应用。
它的代价包括:
- 需要更高系统权限;
- 可能与公司 VPN、其他 VPN、虚拟化网络或防火墙冲突;
- 需要正确处理局域网、DNS 和路由;
- 出现问题时排查链路更长。
在其他系统上,透明代理也可以通过 iptables、TPROXY 或 REDIRECT 等机制实现,并不永远等于 TUN;但在 Windows 的 Clash Verge Rev 语境下,两者通常可以近似视为同义表达。
7. 规则、全局、直连:接管后怎么处理
系统代理和 TUN 解决“流量怎样进入 Mihomo”,规则、全局和直连则解决“进入以后怎样处理”。两个维度彼此独立。
7.1 规则模式
Mihomo 按顺序匹配规则:
局域网地址 → DIRECT国内域名 → DIRECT开发平台 → PROXY广告域名 → REJECT剩余流量 → 默认策略组这是最适合日常使用的模式。
7.2 全局模式
几乎所有被接管的外部流量都交给指定代理组。它适合临时验证“是不是规则写错了”,但长期使用可能让国内网站、下载和本地服务绕远路。
7.3 直连模式
流量进入 Mihomo 后统一执行 DIRECT。这不一定表示 Mihomo 完全退出:系统代理或 TUN 可能仍然开启,只是内核收到连接后选择直接访问。
如果要彻底排除 Clash 的影响,需要关闭系统代理和 TUN,而不只是切换到直连模式。
8. Fake-IP:给域名发放内部编号
TUN 捕获的是 IP 数据包。应用完成普通 DNS 查询后,建立连接时通常只剩下目标 IP,原始域名可能已经丢失:
应用查询 api.example.com ↓DNS 返回 203.0.113.20 ↓应用连接 203.0.113.20 ↓TUN 看到的是 IP这会给域名规则带来困难:一个 CDN IP 可能同时承载许多域名,DNS 缓存也可能变化。Mihomo 可以尝试通过 DNS 缓存或流量嗅探恢复域名,但不一定始终可靠。
Fake-IP 的思路是不给应用真实 IP,而是返回一个仅供本机代理内部识别的地址:
应用查询 api.example.com ↓Mihomo 返回 198.18.0.10 ↓Mihomo 保存映射:198.18.0.10 ↔ api.example.com ↓应用连接 198.18.0.10 ↓Mihomo 准确恢复原始域名并匹配规则这个 Fake-IP 不会作为真实目标地址发送到公网,更像是 Mihomo 给域名分配的内部编号。
Fake-IP 的主要价值是:
- 在 TUN 模式下保留域名身份;
- 提高域名规则匹配的准确性;
- 减少对 TLS SNI、HTTP Host 等嗅探手段的依赖;
- 先判断分流策略,再决定使用哪组 DNS;
- 减少本地 DNS 污染或错误解析的影响。
如果只使用显式 HTTP 代理,浏览器已经通过 CONNECT api.example.com:443 告诉 Mihomo 域名,Fake-IP 的价值就没有 TUN 场景那么明显。全局代理或只使用 IP 规则时也是如此。
Fake-IP 也可能影响局域网发现、打印机、某些游戏和依赖真实 DNS 结果的程序,因此通常要设置过滤:
dns: enhanced-mode: fake-ip fake-ip-filter: - "*.lan" - "*.local" - "localhost"Mihomo 内核并不是永远默认开启 Fake-IP。如果没有显式配置 enhanced-mode,应以当前内核文档和客户端生成的最终配置为准。许多 Clash 配置模板会主动写入 enhanced-mode: fake-ip。
9. Clash DNS 配置中的几个关键字段
Mihomo 没有一个永远固定的公共 DNS 地址。DNS 从哪里来,取决于最终合并配置。
9.1 dns.enable
dns: enable: false关闭 Mihomo DNS 模块后,通常使用系统 DNS。
dns: enable: true开启后,由 Mihomo 的 DNS 配置决定解析过程。
9.2 nameserver
nameserver 是普通域名查询默认使用的上游 DNS:
dns: nameserver: - https://doh.pub/dns-query - https://dns.alidns.com/dns-query9.3 default-nameserver
这个名字容易产生误解。它主要负责解析 DoH、DoT 等 DNS 服务器自身的域名,也就是解决启动阶段的“先有鸡还是先有蛋”问题,并不等于所有普通域名都默认使用它。
dns: default-nameserver: - 223.5.5.59.4 nameserver-policy
它可以让特定域名使用指定 DNS,并优先于普通 nameserver:
dns: nameserver-policy: "+.example.internal": - 10.20.30.53 - 10.20.30.54+.example.internal 可以匹配根域名及其子域名。适合公司内网、家庭局域网和需要 Split DNS 的场景。
10. 公司内网为什么容易在开启 Clash 后失效
很多公司采用 Split DNS,即同一个域名在公司内外得到不同答案:
公司 DNS 查询 oa.example.internal→ 返回内网地址 10.20.30.40
公共 DNS 查询 oa.example.internal→ NXDOMAIN、错误地址或外网地址连接公司 Wi-Fi 后,DHCP 原本会下发公司 DNS。不开 Clash 时,Windows 使用公司 DNS,因此内网正常。
如果 Clash 开启自己的 DNS 模块并改用公共 DNS,就可能无法解析公司域名。解决思路不是把所有 DNS 都改成公司 DNS,而是为公司域名单独设置策略:
dns: nameserver-policy: "+.example.internal": - 10.20.30.53 - 10.20.30.54DNS 正确还不够,内网流量通常也应该直连:
rules: - DOMAIN-SUFFIX,example.internal,DIRECT - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve完整逻辑是:
公司域名 → 公司 DNS 解析公司域名/内网 IP → DIRECT其他流量 → 普通代理规则排查时先查看 Clash 的连接记录:
- 显示代理节点:路由规则可能错误;
- 显示
DIRECT,但域名解析失败:重点检查 DNS; - Clash 中完全没有请求:检查浏览器 DoH、系统代理和其他网络层。
Windows 中可以比较不同 DNS 的结果:
Resolve-DnsName oa.example.internal -Server 10.20.30.53Resolve-DnsName oa.example.internal -Server 223.5.5.511. HTTP、SOCKS5 与混合端口
Mihomo 可以提供不同的本地代理入口:
port: 7891 # HTTP 代理socks-port: 7892 # SOCKS5 代理mixed-port: 7890 # 同时接受 HTTP 和 SOCKS5混合端口会根据客户端握手自动判断协议:
HTTP 代理 ─┐ ├→ 127.0.0.1:7890 → MihomoSOCKS5 代理 ─┘同一个混合端口可以这样使用:
http://127.0.0.1:7890socks5://127.0.0.1:7890协议前缀决定应用用什么方式与本地 Mihomo 通信。
11.1 HTTP 代理
HTTP 代理理解 HTTP 请求。访问 HTTPS 网站时通常通过 CONNECT 建立隧道:
CONNECT example.com:443Windows 系统代理、浏览器和许多桌面应用主要使用这种入口。
11.2 SOCKS5
SOCKS5 更接近通用网络转接协议,不关心传输内容是不是网页。它可以代理多种 TCP 流量,并支持 UDP 转发能力。
常见支持 SOCKS5 的软件包括 Telegram、Firefox、curl、部分下载器,以及经过明确配置的 Git 或开发工具。
以 curl 为例:
curl.exe --proxy socks5://127.0.0.1:7890 https://example.com如果希望域名也由 SOCKS 代理一侧解析,curl 使用:
curl.exe --proxy socks5h://127.0.0.1:7890 https://example.comSOCKS5 本身不等于端到端加密。数据安全还取决于 HTTPS、SSH 等上层协议,以及 Mihomo 与远端节点之间的节点协议。
11.3 混合端口不是节点端口
127.0.0.1:7890 是本机应用进入 Mihomo 的入口,不是机场服务器的端口:
应用 → 本机混合端口 7890 → Mihomo → 节点协议和远端节点端口 → 网站开启 TUN 后,大部分应用不需要显式填写 7890;混合端口仍可供需要主动指定代理的命令行工具使用。
12. Codex 与代理环境变量
Windows 和命令行工具常见以下通用代理环境变量:
HTTP_PROXY HTTP 请求使用的代理HTTPS_PROXY HTTPS 目标使用的代理ALL_PROXY 通用回退代理,常用于 SOCKS5NO_PROXY 不经过代理的地址列表临时为当前 PowerShell 及其子进程设置:
$env:HTTP_PROXY = "http://127.0.0.1:7890"$env:HTTPS_PROXY = "http://127.0.0.1:7890"$env:ALL_PROXY = "socks5://127.0.0.1:7890"$env:NO_PROXY = "localhost,127.0.0.1,::1"
codexHTTPS_PROXY 写成 http://127.0.0.1:7890 并不矛盾:这里的前缀描述客户端怎样连接本地代理,HTTPS 目标通常通过 HTTP CONNECT 隧道访问。
这四个变量不是 Windows 上运行 Codex 时“四个缺一不可”的强制配置。它们是许多网络库和命令行工具共同遵循的约定:
- TUN 已经稳定接管流量时,通常不需要重复设置;
- 只有系统代理,而 Codex 启动的 Git、npm、curl 等工具不读取系统代理时,显式环境变量更可预测;
HTTP_PROXY和HTTPS_PROXY通常足以覆盖网页请求;ALL_PROXY按软件和协议需求配置;NO_PROXY应至少保护本机回环地址,避免本地开发服务或工具错误绕行代理。
环境变量只会被新启动的进程继承。修改后应重新打开终端,并从这个终端启动 Codex;已经运行的桌面应用不会自动获得当前 PowerShell 中的 $env: 变量。
还要区分 Codex 的本地命令网络、模型与登录连接、网页搜索、浏览器和连接器。它们不一定走同一条网络通道,Codex 自身用于限制沙箱命令访问范围的“网络代理”也不是 Clash。
13. GUI、内核与节点协议
代理客户端不是一个不可拆分的整体,可以分成:
客户端 GUI:Clash Verge Rev、FlClash、v2rayN ↓代理内核:Mihomo、sing-box、Xray ↓节点协议:Shadowsocks、VMess、VLESS、Trojan13.1 GUI 做什么
GUI 通常负责:
- 导入和更新订阅;
- 编辑及合并配置;
- 启停系统代理、TUN 和服务模式;
- 选择代理组和节点;
- 展示连接、流量和日志;
- 管理内核版本。
13.2 内核做什么
Mihomo 等内核负责:
- 监听 HTTP、SOCKS5 和混合端口;
- 创建 TUN;
- 处理 DNS 与 Fake-IP;
- 匹配域名、IP、进程和规则集;
- 执行直连、拒绝或代理决策;
- 实现与远端节点通信的协议。
Clash Verge Rev 是基于 Mihomo 的 GUI。Mihomo 延续 Clash 风格的 YAML 配置和规则体系,过去也常被称为 Clash.Meta 或 Meta 内核。Alpha 是 Mihomo 的测试构建,不是完全不同的内核家族。
13.3 节点协议做什么
节点配置中的:
type: ss表示 Mihomo 使用 Shadowsocks 与远端节点通信;而:
type: vmess表示使用 VMess。规则模式下,不同连接可能选择不同节点,直连流量则不使用任何代理节点协议。
因此不能简单地问“Mihomo 的协议是什么”。更准确的问题是:
这条连接从应用进入 Mihomo 时用了什么入口方式,Mihomo 最终又选择了什么类型的节点?
14. 常见代理客户端与内核家族
不同客户端有时只是同一个内核的不同 GUI,有时却连内核和配置体系都不同。
| 客户端 | 常见平台 | 内核或实现 | 配置特点 |
|---|---|---|---|
| Clash Verge Rev | Windows、macOS、Linux | Mihomo | Clash/Mihomo YAML |
| FlClash | Windows、macOS、Linux、Android | Clash.Meta/Mihomo 体系 | Clash 风格配置 |
| ClashX.Meta | macOS | Mihomo | Clash 风格配置 |
| v2rayN | Windows、Linux、macOS | Xray、sing-box,也支持其他自定义内核 | 多种配置体系 |
| v2rayNG | Android | Xray/v2fly 等 | V2Ray/Xray 体系 |
| Shadowrocket | iOS | 自有实现 | 支持多种节点协议和自己的规则体系 |
| Surge、Stash、Quantumult X、Loon | Apple 平台 | 各自实现 | 配置语义不完全相同 |
| OpenClash、Nikki | OpenWrt | 以 Mihomo 等为主 | 路由器透明代理 |
历史上的 Clash for Windows 使用 Clash Premium 内核,已经停止维护。原版 ClashX 和 ClashX.Meta 也不能只按名字视为同一个项目。
即使 Mihomo、sing-box、Xray 和 Shadowrocket 都支持某种节点协议,它们的 DNS、TUN、路由语法和配置格式也可能不同。节点能导入,不代表整个配置文件可以无损互换。
同一台电脑可以安装多个客户端用于比较,但不应同时让多个客户端开启系统代理或 TUN,否则它们会争抢系统代理、路由和 DNS。
15. 一次访问的完整链路
以 规则模式 + TUN + Fake-IP 为例:
1. 用户访问 https://api.example.com2. 应用发起 api.example.com 的 DNS 查询3. TUN 的 DNS 劫持把查询交给 Mihomo4. Mihomo 检查 hosts 和 nameserver-policy5. Mihomo 记录域名与真实解析结果6. Mihomo 向应用返回 198.18.x.x Fake-IP7. 应用连接这个 Fake-IP8. TUN 把数据包交给 Mihomo9. Mihomo 由 Fake-IP 恢复 api.example.com10. Mihomo 按规则决定 DIRECT 或代理组11. 如果走代理,使用选中节点的 SS/VMess/VLESS 等协议12. 远端节点连接目标网站如果是显式系统代理,链路会更短:
浏览器 → HTTP CONNECT api.example.com:443 → 本机混合端口 → Mihomo 已经知道目标域名 → 规则判断 → 直连或代理节点16. 最简速查表
| 名词 | 一句话解释 |
|---|---|
| DHCP | 自动向设备下发 IP、网关和 DNS 等网络配置 |
| DNS | 把域名转换成 IP |
| hosts | 本机维护的静态域名映射 |
| 系统代理 | 支持系统代理的应用主动把请求交给本地代理端口 |
| TUN | 用虚拟网卡从 IP 层接管流量 |
| 透明代理 | 应用无需知道代理存在的使用效果 |
| Fake-IP | 用内部假地址保存域名身份,便于透明代理按域名分流 |
| 规则模式 | 按域名、IP、进程等规则选择出口 |
| 全局模式 | 被接管的外部流量统一交给指定代理组 |
| 直连模式 | 流量进入内核后统一直接访问 |
| HTTP 代理 | 面向 HTTP/HTTPS 的本地代理入口 |
| SOCKS5 | 更通用的本地连接转发协议 |
| 混合端口 | 同一个端口同时接受 HTTP 和 SOCKS5 |
| Mihomo | 实际执行 DNS、TUN、规则和代理协议的内核 |
| Clash Verge Rev | 管理 Mihomo 的图形客户端 |
| SS/VMess/VLESS | Mihomo 与远端节点通信时可能使用的协议 |
17. 使用建议
- 日常桌面软件为主:使用规则模式和系统代理即可;
- 希望终端、游戏和 UDP 统一接管:使用规则模式和 TUN;
- TUN 下需要稳定域名规则:优先使用 Fake-IP,针对不兼容域名设置过滤;
- 公司内网:公司域名使用公司 DNS,公司域名和内网 IP 直连;
- 排查规则问题:临时切换全局模式作对照,不要长期依赖;
- 排查 Clash 是否参与:同时关闭系统代理和 TUN,而不只是切换直连;
- 修改订阅配置:优先使用 Merge、覆写或脚本,避免订阅更新覆盖手工修改;
- 同一台电脑:不要同时开启多个代理客户端的 TUN 或系统代理。
18. 延伸阅读
- Mihomo DNS 配置
- Mihomo 第三方客户端列表
- Clash Verge Rev 官方文档
- Clash Verge Rev:无法访问公司内网域名
- sing-box 官方文档
- v2rayN 项目说明
- Codex 环境变量
- Codex Agent approvals & security
一句话总结:系统代理和 TUN 决定流量怎样进入内核,DNS 与 Fake-IP 帮内核识别目标,规则决定流量从哪里出去,节点协议负责把流量安全地送到远端代理服务器。