4903 字
25 分钟
代理网络学习笔记:从系统代理、TUN 到 DNS 与 Fake-IP

代理网络学习笔记:从系统代理、TUN 到 DNS 与 Fake-IP#

平时使用 Clash Verge Rev 时,经常会同时看到系统代理、TUN、规则模式、Fake-IP、混合端口和 Mihomo 等名词。它们看起来都和“代理”有关,却处在完全不同的层次。

理解这套系统最重要的不是记住每个开关,而是先回答四个问题:

  1. 应用流量怎样进入代理程序?
  2. 代理程序怎样知道目标域名?
  3. 接管流量后,怎样决定直连还是走节点?
  4. 代理程序用什么协议连接远端节点?

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
↓ DNS
203.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:

Terminal window
ipconfig /all

或者:

Terminal window
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 缓存:

Terminal window
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-query

9.3 default-nameserver#

这个名字容易产生误解。它主要负责解析 DoH、DoT 等 DNS 服务器自身的域名,也就是解决启动阶段的“先有鸡还是先有蛋”问题,并不等于所有普通域名都默认使用它。

dns:
default-nameserver:
- 223.5.5.5

9.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.54

DNS 正确还不够,内网流量通常也应该直连:

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 的结果:

Terminal window
Resolve-DnsName oa.example.internal -Server 10.20.30.53
Resolve-DnsName oa.example.internal -Server 223.5.5.5

11. HTTP、SOCKS5 与混合端口#

Mihomo 可以提供不同的本地代理入口:

port: 7891 # HTTP 代理
socks-port: 7892 # SOCKS5 代理
mixed-port: 7890 # 同时接受 HTTP 和 SOCKS5

混合端口会根据客户端握手自动判断协议:

HTTP 代理 ─┐
├→ 127.0.0.1:7890 → Mihomo
SOCKS5 代理 ─┘

同一个混合端口可以这样使用:

http://127.0.0.1:7890
socks5://127.0.0.1:7890

协议前缀决定应用用什么方式与本地 Mihomo 通信。

11.1 HTTP 代理#

HTTP 代理理解 HTTP 请求。访问 HTTPS 网站时通常通过 CONNECT 建立隧道:

CONNECT example.com:443

Windows 系统代理、浏览器和许多桌面应用主要使用这种入口。

11.2 SOCKS5#

SOCKS5 更接近通用网络转接协议,不关心传输内容是不是网页。它可以代理多种 TCP 流量,并支持 UDP 转发能力。

常见支持 SOCKS5 的软件包括 Telegram、Firefox、curl、部分下载器,以及经过明确配置的 Git 或开发工具。

以 curl 为例:

Terminal window
curl.exe --proxy socks5://127.0.0.1:7890 https://example.com

如果希望域名也由 SOCKS 代理一侧解析,curl 使用:

Terminal window
curl.exe --proxy socks5h://127.0.0.1:7890 https://example.com

SOCKS5 本身不等于端到端加密。数据安全还取决于 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 通用回退代理,常用于 SOCKS5
NO_PROXY 不经过代理的地址列表

临时为当前 PowerShell 及其子进程设置:

Terminal window
$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"
codex

HTTPS_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、Trojan

13.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 RevWindows、macOS、LinuxMihomoClash/Mihomo YAML
FlClashWindows、macOS、Linux、AndroidClash.Meta/Mihomo 体系Clash 风格配置
ClashX.MetamacOSMihomoClash 风格配置
v2rayNWindows、Linux、macOSXray、sing-box,也支持其他自定义内核多种配置体系
v2rayNGAndroidXray/v2fly 等V2Ray/Xray 体系
ShadowrocketiOS自有实现支持多种节点协议和自己的规则体系
Surge、Stash、Quantumult X、LoonApple 平台各自实现配置语义不完全相同
OpenClash、NikkiOpenWrt以 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.com
2. 应用发起 api.example.com 的 DNS 查询
3. TUN 的 DNS 劫持把查询交给 Mihomo
4. Mihomo 检查 hosts 和 nameserver-policy
5. Mihomo 记录域名与真实解析结果
6. Mihomo 向应用返回 198.18.x.x Fake-IP
7. 应用连接这个 Fake-IP
8. TUN 把数据包交给 Mihomo
9. Mihomo 由 Fake-IP 恢复 api.example.com
10. 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/VLESSMihomo 与远端节点通信时可能使用的协议

17. 使用建议#

  • 日常桌面软件为主:使用规则模式和系统代理即可;
  • 希望终端、游戏和 UDP 统一接管:使用规则模式和 TUN;
  • TUN 下需要稳定域名规则:优先使用 Fake-IP,针对不兼容域名设置过滤;
  • 公司内网:公司域名使用公司 DNS,公司域名和内网 IP 直连;
  • 排查规则问题:临时切换全局模式作对照,不要长期依赖;
  • 排查 Clash 是否参与:同时关闭系统代理和 TUN,而不只是切换直连;
  • 修改订阅配置:优先使用 Merge、覆写或脚本,避免订阅更新覆盖手工修改;
  • 同一台电脑:不要同时开启多个代理客户端的 TUN 或系统代理。

18. 延伸阅读#

一句话总结:系统代理和 TUN 决定流量怎样进入内核,DNS 与 Fake-IP 帮内核识别目标,规则决定流量从哪里出去,节点协议负责把流量安全地送到远端代理服务器。

代理网络学习笔记:从系统代理、TUN 到 DNS 与 Fake-IP
https://blog-8jx.pages.dev/posts/proxy-networking-notes/
作者
Starflyer
发布于
2026-09-13
许可协议
CC BY-NC-SA 4.0