A field guide to packet routing

TUN 模式下的
分流与 DNS 劫持之道

为什么开了代理国内网站反而打不开?为什么有些工具只看 IP 就能精准分流?为什么 Fake-IP 是「降维打击」?——这份讲义把代理工具藏在底层的四个核心机制拆给你看,看完之后任何一款代理软件你都能心中有数。

领域网络栈 · 代理协议 难度★★★☆☆ 形式图解 + 步进演示 语言中文
01

数字世界的地址簿 IP、域名、DNS——以及它们脆弱的根

互联网的本质,是把电信号从 A 点送到 B 点。所以第一个真正的问题永远是:A 和 B 在哪?后面所有关于代理、分流、DNS 的讨论,本质上都是围绕这个朴素问题展开。在我们正式讲 TUN 之前,必须先把这本「数字世界的地址簿」翻清楚——否则后面所有的黑魔法都看不到根基。

IP:互联网的门牌号

每一台连接互联网的设备都需要一个唯一的地址,就像每一栋楼都有门牌号。这个地址叫 IP 地址 (Internet Protocol Address)。它工作在网络分层中的第三层(网络层 / L3),所有上层协议(TCP/UDP、HTTP、Socks……)最终都要装进 IP 包里才能上路。

IP 有两个版本,今天的互联网两个版本同时在用:

IPv4 · 1981 32 bits = 4 个字节 192 8 bits · 0 – 255 . 168 8 bits · 0 – 255 . 1 8 bits · 0 – 255 . 1 8 bits · 0 – 255 地址空间: ≈ 4.3 × 10⁹(2011 年已耗尽) IPv6 · 1998 128 bits = 16 个字节 2001 16 bits : 0db8 16 bits : 85a3 16 bits : 0000 16 bits : 0000 16 bits : 8a2e 16 bits : 0370 16 bits : 7334 16 bits 地址空间: ≈ 3.4 × 10³⁸(给地球每粒沙子分配亿万个都用不完) 连续多个 0 可缩写:2001:db8:85a3::8a2e:370:7334
图 1 · v4 用 32 比特表示一个地址,4 个 0–255 的整数;v6 用 128 比特,8 组 16 进制——多出来的 96 比特让地址空间扩大了 2⁹⁶ 倍。

IPv4 早在 2011 年就分完了。过去十几年靠 NAT(家用路由器把多个内网设备共享同一个公网 IP)勉强续命。但根本解决方案是 IPv6——它的地址多到「这辈子用不完」的程度。

今天的网络是 双栈 (Dual-Stack) 状态:绝大多数主流服务(Google、Cloudflare、Apple……)同时部署 v4 和 v6,你的设备也通常同时拿到两种地址。当你访问一个网站时,浏览器会同时尝试 v4 和 v6(这个算法叫 Happy Eyeballs),哪个先建立 TCP 就用哪个。

这件事对代理用户极其重要:如果你的代理只接管了 v4 流量,那 v6 流量就会绕过代理直接出去,俗称「IPv6 漏代理」。我们会在第 6 章把这个隐患单独拎出来讲。

地址的「特殊段位」:不是所有 IP 都对等

你可能以为 IPv4 的 43 亿个地址都是平等的——其实远远不是。IANA(互联网号码分配机构)在切蛋糕时,划出了一大堆保留段,每段都有特殊使命:有的留给内网用、有的指向本机、有的纯粹是给文档示例。你在这份讲义后面看到的所有「IP 黑魔法」——为什么 192.168.x 不能进代理、为什么污染常返回 127.0.0.1、为什么 Fake-IP 选 198.18 这个怪段位——根都在这张表里。

必须认识的 IPv4 特殊段位 — 内网专用段 · RFC 1918 · 公网永远拒绝转发 — 10.0.0.0/8 大型企业内网 ≈ 1670 万个地址 172.16.0.0/12 中型组织内网 172.16.x – 172.31.x 192.168.0.0/16 家庭路由器最常见 ≈ 6.5 万个地址 — 功能性保留段 · 行为特殊 · 永远不出本机网卡 — 127.0.0.0/8 · loopback 永远指向「本机」自己 169.254.0.0/16 · APIPA DHCP 失败时的应急自分配地址 — IANA 留作不用的段 · 代理工具的「自留地」 — 198.18.0.0/15 基准测试保留段 · RFC 2544 公网路由表永远不会出现 —— Fake-IP 的天选材料
图 2 · 这张图是后面五章的「索引页」——所有 IP 类问题最终都能映射回这几个段位之一。
为什么会有这些段?
不是用不完,而是「分工」

公网路由器之间需要约定「哪些地址可能从外部进来」。划出私有段意味着:你的家用路由器永远不会192.168.1.5 这条目宣告到公网,公网路由器也永远不会接受这样的宣告——这是互联网正常运转的基础协议。

/8、/15、/16 是什么意思
CIDR 前缀长度

192.168.0.0/16/16 是说「前 16 位固定」——也就是 192.168 这两段固定,后面 65536 个地址都属于这段。/8 是前 8 位固定,整个 10.x.x.x 都算。数字越小,段越大。

这些段位看似抽象,但每一段都在我们后面的故事里有重大戏份:

戏份 ① · 私有段为什么必须「直连」

任何正经代理配置开头都有一长串 IP-CIDR,10.0.0.0/8,DIRECT / IP-CIDR,192.168.0.0/16,DIRECT原因很简单:这些地址本来就不该出本机——你在公司访问内部 Wiki,目的 IP 是 10.x.x.x,要是被 TUN 抓进代理隧道,海外服务器收到「请连 10.x.x.x」会直接懵掉,包就消失了。这条规则的作用,就是给那些本不该出本机的流量贴一张「请绕过代理」的通行证。

戏份 ② · 127.0.0.1 为什么是污染常客

下一节我们要讲 DNS 污染——GFW 伪造的应答里,常返回 127.0.0.10.0.0.0这两个地址都指向「本机」自己,所以你拿到这个 IP 去连接时,实际上是在和自己通信——连接当场失败,但 DNS「查到了答案」不会重试。污染者用本机地址做坑,是因为它保证失败、又不会牵连任何真实服务器。

戏份 ③ · 198.18/15 为什么是 Fake-IP 的天选材料

IETF 在 RFC 2544 把 198.18.0.0/15 留出来专做「网络设备基准测试」,也就是说全球公网路由表里永远不会有这段。Fake-IP 借住这段就有了三重保证:① 不和任何真实主机冲突 ② 设备发出去也出不了本机 ③ 看到目的 IP 在这段就 100% 是代理软件自己刚伪造的。第 5 章 Fake-IP 整个魔法能成立,根基就在这里。

IPv6 也有完全对应的一套:::1/128 是 v6 版的环回(相当于 v4 的 127.0.0.1);fe80::/10 是链路本地(只在同一个网段内有效,永远不出本机);fc00::/7ULA(Unique Local Address,v6 版本的「RFC 1918 私有段」)—— 第 6 章里 IPv6 Fake-IP 用的 fc00::/18 正是这个母段的子集

把这张「段位表」记进脑子里,你看任何代理工具的 rules 规则表都会突然开窍——开头那一排 IP-CIDR 不是装饰,每一行都对应这张图上的一个保留段,作用是把本不该出本机的流量拦截在隧道之外。这就是一份正经代理配置的「兜底之手」。

DNS:把名字翻译成 IP

人脑记不住 IP——你能记住几个像 142.250.179.196 这样的数字?所以我们用名字:baidu.comtwitter.comanthropic.com

这就引出第二个问题:怎么从名字找到 IP?这正是 DNS (Domain Name System) 干的事——它是一本分布式、层级化的全球电话本。注意「分布式」三个字:没有任何一台机器存了全世界所有域名,整个系统是按层级分散在几十万台服务器上的。

当你输入 www.example.com,幕后真实发生的过程,比你想象的要绕得多:

解析 www.example.com 的全过程 本机 浏览器 存根解析器 Stub Resolver 递归解析器 Recursive Resolver 8.8.8.8 / 1.1.1.1 / 114.114 整个系统的大脑 根服务器( . ) 全球 13 个根集群 顶级域服务器( .com ) 每个 TLD 各自维护 权威服务器(example.com) 网站方自己运维 1 2 3 4 5 浏览器问本机存根解析器:example.com 的 IP 是? 递归解析器先问根:".com 谁管?" → 拿到 .com TLD 服务器地址 再问 .com TLD:example.com 谁管? → 拿到 example.com 权威服务器地址 再问权威服务器:example.com 的 A 记录? → 拿到真 IP 递归把 IP 缓存起来,按 TTL 时间内复用;同时返回给存根 → 浏览器拿到 IP 整个过程通常 20 – 200 ms。命中递归缓存时只走 ① 和 ⑤,几毫秒就完事。
图 3 · 你以为的「查 DNS」其实是 5 步联动。绝大多数时候只看到 ① 和 ⑤——因为递归解析器缓存了答案。

几个值得知道的细节:

  • 记录类型A 记录把域名映射到 IPv4 地址,AAAA 记录映射到 IPv6(名字来源:A 的 4 倍,4 字节 vs 16 字节)。还有 CNAME(别名)、MX(邮件)、TXT(任意文本)等。
  • TTL (Time To Live):每条记录都有一个有效期,常见 300 秒到 1 小时不等。TTL 期内递归解析器会用缓存,过期才重新爬层级。这是为什么改了 DNS 要等几小时才生效。
  • 「递归解析器」 是整套系统的劳模。8.8.8.8(Google)、1.1.1.1(Cloudflare)、114.114.114.114(中国某 ISP 联盟)都是常见的公共递归解析器。你 PC 上配的 DNS 服务器,绝大多数情况就是指它。

DNS 的命门:为什么这本电话本会被改写

DNS 是 1983 年设计的协议。那年代网络上没什么坏人,所以设计极度天真——四个致命特征:

  1. UDP 协议(端口 53)——速度优先,没有连接握手
  2. 无状态、无认证——你发问,谁先回答你就信谁
  3. 完全明文传输——内容人人可见
  4. 「第一个应答就算数」——后到的应答会被丢弃

这些设计在今天看来个个都是漏洞。任何能在网络路径上看到你 DNS 包的设备(运营商、机房、ISP 中转节点……)都可以「抢答」——在真正的 DNS 服务器回应之前,先伪造一个错误的应答塞给你。这就是 DNS 污染 (DNS Pollution / DNS Spoofing)

DNS 抢答攻击的全过程 用户设备 问:twitter.com? 网络路径中的某个监听设备 监听 + 注入器 看到敏感关键词 触发伪造 真实 DNS 8.8.8.8 ① 查询出门 ② 继续放行 ③ 抢答(快) → 0.0.0.0 ④ 真应答(慢) ⑤ 第一个应答即胜出 用户拿到假 IP,连接必然失败 真应答(慢一拍) 迟到,被静默丢弃
图 4 · DNS 污染的本质是一场赛跑——伪造应答只需要在路径上的任意一台设备,比真正的 DNS 服务器先到。中国境内对敏感域名几乎是「百发百中」的抢答。

GFW 的污染战术

GFW 在中国出境网络节点上部署了庞大的「检测 + 注入」设备。看到一个 UDP 53 端口的查询时,会判断域名是否在敏感清单上(如 google.com、twitter.com、facebook.com):

  • 不去拦截你的查询包——让它继续流向真 DNS 服务器(这样你和真 DNS 都不会察觉)
  • 同时伪造一个 DNS 应答,源 IP 写成你查询的那个 DNS(比如 8.8.8.8),抢在真正应答之前发回来
  • 伪造应答里的 IP 通常是 0.0.0.0127.0.0.1,或某个无意义的境内 IP
  • 你的设备拿到这个假 IP 去连接,连接当然失败——但 DNS「查到了」结果,不会重试

值得注意的是:这个攻击对 IPv6 的 AAAA 记录同样有效——所以你不能指望「我用 IPv6 就没事了」。GFW 对 v4 v6 一视同仁。

对抗:加密 DNS 的崛起

业界过去十年发明了一堆「加密 DNS」协议来对抗污染,核心思路是:让监听设备看不到你在问什么,自然就无法抢答

DoT
DNS over TLS
  • 用 TLS 加密 DNS
  • 专用端口 853
  • 识别度高
  • 容易被针对性阻断
DoH
DNS over HTTPS
  • DNS 包塞进 HTTPS
  • 端口 443
  • 和正常 HTTPS 混在一起
  • 难以单独识别
DoQ
DNS over QUIC
  • 基于 QUIC 协议
  • 0-RTT 握手更快
  • 新一代标准
  • 支持范围还在扩张

代理工具都内置了对这些的支持——这就是为什么 Clash / sing-box 配置里你能看到 https://dns.cloudflare.com/dns-query 这种字符串。

鸡生蛋的悖论

DoH / DoT 也不是完美的——它们能防污染,但仍然需要先解析出 DNS 服务器自己的 IP。dns.cloudflare.com 是个域名,要查它就要 DNS——但 DNS 正是要被保护的对象。这是经典的「鸡生蛋」问题。现代代理工具的做法是:把几个 DoH 服务器的 IP 硬编码进配置(叫 bootstrap-dns 或类似名字),先用它们建立加密连接,之后所有 DNS 都走加密通道。

到这里你已经具备了理解所有 TUN / 代理黑魔法的基础语言:IP 是地址,地址有「公网/私有/保留」之分,DNS 是名字翻译机,DNS 容易被污染,IPv6 是不可忽视的第二条路径。
带着这些武器,我们正式进入代理的世界。
02

系统代理 vs TUN 模式 两种世界观的根本分歧

你打开 Clash,第一眼看到两个开关:系统代理TUN 模式。教程会让你打勾,但很少有人告诉你它们差在哪。其实这是两套截然不同的世界观——它们工作的「楼层」根本不同。

要理解这件事,先回忆一下网络分层。从下往上:物理层 → 数据链路层 → 网络层(IP)传输层(TCP/UDP)应用层(HTTP/HTTPS/Socks)。流量从应用发出,每经过一层就被「贴一张标签」(封装),最后变成一串电信号发出去。

系统代理:在「门口」拦人

系统代理工作在应用层。它本质上是在操作系统里挂了一个公告:「以后所有 HTTP/HTTPS/Socks 请求,都先发给 127.0.0.1:7890,那里是我们的代理软件。」于是浏览器、curl、Postman 这些认这个公告的程序,会乖乖把请求送过去。

问题:不是所有程序都认这个公告。很多游戏、Telegram、Steam、命令行小工具、各种系统服务,它们要么不读系统代理设置,要么用的是 UDP(系统代理只管 TCP 的 HTTP/Socks),要么直接走原生 socket。这些流量就「绕开了」代理,俗称漏代理

TUN 模式:在「楼底」截胡

TUN 模式工作在网络层(L3)。代理软件创建一块虚拟网卡(叫 utun0Meta),然后修改系统路由表,把「默认路由」指向这块假网卡。结果是:整台机器所有出网的 IP 包,无论是 TCP/UDP/ICMP、无论哪个程序发的,全部经过代理软件。

代理软件收到的是裸的 IP 包(有源 IP、目的 IP、协议号、载荷),而不是 HTTP 请求。它要自己重组 TCP 流、自己解析 DNS、自己决定每一个包是直连还是入隧道——相当于代理软件自己成了「半个内核」。

系统代理 · L7 拦截 TUN 模式 · L3 拦截 Chrome 读系统代理 游戏 · UDP 不读 / 不支持 代理软件(监听 127.0.0.1:7890) 只处理 HTTP / Socks 协议 系统网络栈 / 物理网卡 代理出口 直接漏出 Chrome 游戏 · UDP 系统网络栈(按路由表分发) utun0 虚拟网卡(默认路由) 收到裸 IP 包 · 协议无关 代理软件:解析 / 分流 / 重组 统一出口(直连 或 隧道)
图 1 · 系统代理在应用层「请」流量过来,遗漏 UDP 与不读代理设置的程序;TUN 模式在网络层「截胡」,应用根本无从绕过。

那么 TUN 是不是万能?——并不

这正是后面三章存在的理由。当代理软件在 L3 接管全部流量后,它失去了应用层的语义信息——拿到一个 IP 包,它不知道这是哪个域名、属于哪个网站、该走国内直连还是走代理。这就埋下了 TUN 模式独有的三大难题:

难题 ①
DNS 自己也是流量

应用查 DNS 也是 UDP 包,会被 TUN 抓走。如果不特殊处理,用来查国内 DNS 的请求会被送进海外隧道——网络当场胎死腹中。

难题 ②
只有 IP 没有域名

有些 App 会自己查 DNS,给 TUN 看到的只是「连接 142.250.x.x:443」。怎么知道这是 Google 还是某个国内 CDN?

所以你看到的所有「TUN 黑魔法」——DNS 劫持、SNI 嗅探、Fake-IP——本质上都是在给 L3 层重新装回 L7 的语义信息。这就是这份讲义剩下三章要讲的事。
03

DNS 致命环路 当查询自己变成了被查询对象

第 1 章我们讲过:DNS 协议自身就脆弱——明文、无认证、谁先回应谁算数。在裸的国内网络环境下,这种脆弱表现为「污染」;而一旦你开了 TUN 模式,它会被放大成另一种更暴力的失败模式。这一章就是这个故事。

TUN 模式开启之后,整台机器所有的出网流量都要先「报备」给代理软件。这里有个看似无害但实际致命的细节:DNS 查询,也是流量。

你访问 www.baidu.com 的时候,发生的第一件事不是连百度——而是先发一个 UDP 包到 114.114.114.114:53,问它「百度的 IP 是多少」。这个 UDP 包,在 TUN 模式下,同样会被那块 utun0 虚拟网卡抓走

如果你不告诉代理软件「DNS 服务器必须直连」,会怎样?

代理软件看到一个去 114.114.114.114:53 的 UDP 包,它不认识这个 IP,也没规则说它应该直连,于是按默认规则——送进海外代理隧道

下面这张图把这条死亡链路画出来了。你可以点「开始播放」一步步看:

一次失败的 baidu.com 访问 浏览器 查 baidu.com 的 IP UDP → 114.114.114.114:53 utun0 / 代理 截获 UDP 包 规则未声明「DNS 必须直连」 → 默认走代理 海外代理服务器 「来代我去问 114.114.114.114」 出口 IP 是境外 IP 失败 A · DNS 不应答 114.114 仅服务国内 IP 海外请求被丢弃 失败 B · GFW 污染 UDP 53 出境被拦 返回错误 IP 更糟糕的情况:异常 DNS 地址 255.x.x.x — 本地广播,永远不该出本机 192.168/10.x — 内网,发到海外服务器毫无意义 112.x — 私有 / 保留段,公网根本路由不到 结果:DNS 永远超时 浏览器空白、网络「胎死腹中」 —— 即使代理本身完全正常
0 / 7
演示 点击「开始播放」逐步看一次 DNS 查询是怎么被自己开的代理害死的。

三种典型的「DNS 死法」

把图上的失败路径展开说,你日常遇到的所有「开 TUN 后国内网络瘫痪」基本都是这几种之一:

DEATH MODE A · 国内 DNS 拒答海外 IP

114.114.114.114国内 ISP 联合提供的公益 DNS,它有一条隐式规则:来自境外 IP 的查询会被无视或返回 SERVFAIL。当你的 DNS 包绕地球一圈从美国机房发回去,114 看到一个洛杉矶来的 IP,直接拒绝服务。结果就是 DNS 永远超时。

DEATH MODE B · GFW 污染 / 拦截

中国出境的 UDP 53 端口本来就是 GFW 重点照顾对象。即使你的代理隧道是好的,你这个「从境外回访国内 DNS」的奇怪流量,可能会被中间路径上的设备直接丢弃,或者注入伪造响应。你以为查的是 baidu.com,拿回来一个错误 IP。

DEATH MODE C · 异常 DNS 地址在公网走失

某些应用会把 DNS 配置成本不该出本机的地址255.255.255.255(本地广播)、192.168.1.1(家用路由器)、112.x.x.x(运营商内部网段)。对照第 1 章「段位表」——这些都是 RFC 1918 私有段或本地链路段,它们在 LAN 内才有意义。一旦被 TUN 抓进海外隧道,公网路由器看到 192.168.1.1 这种地址会直接丢弃,包就消失了。你的程序于是认为「网络坏了」。

解决方案:DNS 流量必须「强制直连」+ 由代理自己接管

所有现代代理工具的标准操作有两步:

  1. 对一切 DNS 服务器 IP(53 端口、DoH/DoT 端口)声明「绕过 TUN 直连」——告诉代理软件「这些包不要抢,让系统自己发」。
  2. 代理软件自己内置一个 DNS 解析器,所有应用查询的域名先交给代理软件回答,由它根据规则决定「这个域名应该问国内 DNS 还是问海外 DNS」。这条规则在 Clash 配置里叫 dns.nameserver / fallback / fallback-filter,在 Sing-box 里叫 dns.servers + dns.rules
这就是为什么任何一份正经的 Clash/Sing-box 配置,开头几十行总是在写 DNS 规则。它不是装饰,是续命设置。
04

内核的嗅探超能力 没有域名,怎么知道这流量该走哪

上一章解决了「我自己查 DNS」的场景。但现实里,并不是所有应用都老老实实通过系统 DNS 解析——很多流量到达 TUN 时,根本就没有「域名」这条线索。具体来说有这么几种典型情况:

  • App 内置了 DoH——浏览器(Firefox、Chrome)和 iOS / Android 上越来越多的应用,自己用 HTTPS 直接问 Cloudflare 或 Google DNS,完全跳过系统 DNS 模块。代理软件根本看不到这个查询。
  • 硬编码 IP 直连——很多游戏服务器、P2P bootstrap 节点、IoT 设备的回调地址,把 IP 写死在客户端里,从来不查 DNS。
  • WebRTC / 实时通话——拿到对端候选 IP 后直接发 UDP,全程不经过域名解析。
  • 推送系统——服务端把目标 IP 通过其他通道(如 push notification)推过来,客户端拿到就连。

这些情况下,代理软件在 utun0 看到的只是一条裸 IP 连接,比如 TCP → 142.250.179.196:443。这是 Google?是国内某 CDN?是某个游戏?——只看 IP,没有任何线索。这一章就讲代理软件怎么在「无域名」的劣势条件下,还能做出准确的分流决策。

分流的第一道防线:GeoIP 二进制字典

代理软件本地会带一份叫 geoip.dat 的二进制文件,里面是各个国家/地区的 IP 段汇总(CN、US、JP、HK……)。看到 IP 后第一步:查这个 IP 属于哪个国家

这一步解决了大部分场景:114.114.114.114 属于 CN,那就直连;142.250.x.x 属于 US,那就走代理。完事。

但 GeoIP 不够用——同一个 IP 可能代表完全不同的服务

Cloudflare、Akamai、Google 都用任播 (Anycast)。同一个美国 IP,可能服务的是 Discord,也可能是 Twitter、Tumblr。你想代理 Twitter 但不想代理 Discord——只看 IP 办不到

这时候就用到了代理软件最神奇的一招:流量嗅探(Traffic Sniffing)

嗅探:拆开 TLS 握手包,从明文里偷域名

关键事实:HTTPS 在握手阶段是明文的

你访问任何 HTTPS 网站,TCP 连接建立后的第一个包叫 Client Hello,里面写着「我想和 twitter.com 这台服务器握手」——这个字段叫 SNI (Server Name Indication)。它必须是明文,因为服务端要根据 SNI 决定用哪张证书。

代理软件抓住这点,在转发流量之前先暂停一下,拆开 TCP 流的前几个包,找到 Client Hello,提取出 SNI 字段。一瞬间,「一条裸 IP 连接」就变成了「一条去 twitter.com 的连接」——L7 信息凭空回来了。

嗅探子系统 · sniffer 裸 TCP 连接 142.250.x.x:443 缓存首批 4KB 不放行 等握手 解析 Client Hello 读 TLS 扩展 SNI 字段 域名 twitter.com 查 GeoSite 本地字典 命中「twitter」分组 → 走代理 嗅不到?回退 GeoIP 按目的 IP 国家归属判定
图 2 · 嗅探的本质:用 TLS 握手必须明文这件事,把 L3 流量「降维」补回 L7 语义。嗅不到(比如非 TLS、自定义协议)才回退到按 GeoIP 国家判断。

除了 TLS SNI,还能嗅什么?

可嗅探
明文协议特征
  • HTTP/1.1:直接读 Host:
  • HTTPS / TLS:读 Client Hello 的 SNI
  • QUIC / HTTP3:读 QUIC Initial 包里的 SNI
  • 普通 DNS (UDP 53):读 QNAME 字段
嗅不到
加密 / 私有协议
  • ECH (Encrypted Client Hello):连 SNI 都加密了
  • SSH / 自定义二进制协议:没有可读字段
  • UDP-based 私有游戏协议:天书
  • 这些情况只能回退到 GeoIP,或要求用户写 IP 规则

嗅探在 Clash.Meta / sing-box 配置里通常叫 sniffer / sniff。打开它,你的分流准确率会显著提升——尤其对那些「自己查 DNS」的应用。

但嗅探也有代价:每条连接都要先缓存一小段、解析一下,再放行。这会带来几毫秒到几十毫秒的延迟。所以大多数工具默认只对 443/80 端口开启嗅探。
05

Fake-IP:终极降维打击 让代理软件「先发牌后看牌」

嗅探解决了不少问题,但还有一类硬骨头啃不下来——应用查 DNS 这件事本身是慢的

想象一下:你点开 Twitter 链接,浏览器先发 DNS 查询,DNS 包要往返代理隧道,国外 DNS 解析 + 回程,整个 DNS 解析可能要 200~500ms。这段时间页面是白屏的。如果 DNS 走得不顺(DNS 污染、超时、上游故障),可能直接卡死。

于是有人想出了一个鬼才方案:既然查 DNS 这么麻烦,那我干脆不查真的,先随便给一个假 IP 让你赶紧连上来,等你连上来我再慢慢搞清楚你想干什么。这就是 Fake-IP。

Fake-IP 的核心思想:用「假地址 + 内部账本」换速度与可控

代理软件在内部预留一段 本不会出现在公网的 IP 段——正是第 1 章段位表里那个「IANA 自留地」198.18.0.0/15(RFC 2544 基准测试保留段,全球路由表里永远不会出现)。这就是 Fake-IP 整套机制能站住脚的物理基础。

当应用问「twitter.com 的 IP 是?」,代理软件做以下几件事:

  1. 0.001ms 内立刻吐出一个假 IP,比如 198.18.0.42。不查任何上游 DNS。
  2. 把这条映射记到一本「账本」里198.18.0.42 ⇄ twitter.com
  3. 应用拿到假 IP 后立即发起连接:TCP → 198.18.0.42:443。这个包当然又被 TUN 抓住了。
  4. 代理软件一看目的 IP 在 198.18/15 段——这是我的假 IP!反向查账本:找到这是 twitter.com
  5. 有了真域名,再走规则判断:twitter 走代理,传送门打开。

下面这张图把整个生命周期演示出来——这是 Fake-IP 最值得反复看的一张图:

代理软件内部 应用 浏览器 / 任何客户端 映射账本(mapping table) DNS? twitter.com Fake-DNS 模块 分配 198.18.0.42 耗时 ~0.001ms → 198.18.0.42 TCP → 198.18.0.42:443 TUN 拦截 反查账本 twitter.com L7 恢复 规则匹配 → 真 DNS + 代理出口 用户感知延迟:≈ 0ms(DNS 部分) 真实 DNS 在隧道内异步进行
0 / 7
演示 点击「开始播放」看一遍 Fake-IP 是怎么用「假地址 + 账本」把 DNS 卡顿和分流不准这两个问题一次解决的。

它为什么是「降维打击」?

对比这三种模式你就懂了:

模式 A · Redir-Host
真实 DNS
  • 每次都要真查 DNS
  • 查询本身可能被污染
  • 首次访问慢 200~500ms
  • 分流靠真 IP + GeoIP
模式 B · Sniffing
嗅探补救
  • DNS 还是真查
  • 连接握手前先暂停嗅
  • 仍有 DNS 卡顿
  • 对非 TLS 无效
模式 C · Fake-IP
假地址 + 账本
  • DNS 永远不出本机
  • 查询 0.001ms 返回
  • 首屏延迟显著降低
  • 账本里有完整 L7 信息

Fake-IP 的额外妙处

  • 彻底告别 DNS 污染:本机根本不发 DNS 出去,没法被污染。
  • 分流绝对精准:账本里直接存着真域名,每一条连接都带域名标签,不用嗅探不用 GeoIP 兜底。
  • 不会有 DNS 死循环:DNS 查询本身被代理软件本地应答,根本不会跑去隧道里转圈。
  • 资源极轻:账本是一个 LRU 哈希表,几万条映射常驻内存毫无压力。

它也不是完美无瑕

代价 · 偶发的副作用

① 应用如果不查 DNS 直接用硬编码 IP 连接,Fake-IP 用不上。这种场景仍然需要嗅探 / GeoIP 兜底——所以现代工具一般 Fake-IP + Sniffing 同时开。

② 某些校验 IP 的安全软件会困惑。比如某些银行 App 看到「域名解析出来的 IP 是 198.18.x.x」会报警,这时候需要把这类域名加入 fake-ip-filter 走真实 DNS。

③ 账本有 TTL,过期后假 IP 会被回收复用。长链接如果跨过 TTL 边界要小心,不过现代实现都做了引用计数。

④ IPv6 也要有自己的 Fake 段。回想第 1 章的双栈现实——应用经常先查 AAAA 记录。如果你的代理只配了 IPv4 的 Fake-IP(198.18.0.0/15),AAAA 查询会落空或泄漏。所以现代配置里通常会同时给一个 IPv6 假段,常见的是 fc00::/18(ULA 私有段),两本账本各管一边。

06

把它们串起来 一个能用一辈子的心智模型

现在回头看这四章,其实它们讲的是同一件事的四个层面——代理软件在 L3 接管流量后,如何一步一步把 L7 的语义信息「找回来」,以便做出正确的分流决策。

一条流量的完整旅程 应用发出请求 任意协议 / 任意端口 utun0 接管 章 2 · L3 拦截 这是 DNS 吗? 章 3 · DNS 必直连 Fake-IP 模块本地应答 章 5 · 0.001ms 返回 + 记账本 目的 IP 在 Fake 段? 198.18.0.0/15 反查得真域名 L7 语义恢复 嗅探 SNI / Host 章 4 · L3 → L7 回退 GeoIP 按国家归属 最终规则决策 DIRECT · REJECT · PROXY-NODE-XX
图 3 · 一切代理工具内部的真实模样。理解了这张图,你看任何配置文件都不会再迷路。

第六块拼图:IPv6 双栈下的隐形陷阱

前面五章的逻辑都默认了「IP」是 IPv4。但回想第 1 章——你的设备其实是双栈的,每次连接都在 v4 / v6 之间做选择。这就埋下了几个独立于前面所有讨论的隐形陷阱:

陷阱 ① · TUN 只接管 v4

有些代理软件默认只创建 IPv4 路由表项,IPv6 流量会走系统原生路径直接出去。表现:你访问 Google,明明开了代理却还是连不上——因为你的设备先尝试了 v6,v6 走的直连路径被 GFW 拦在国门外,TCP SYN 一直超时,应用直到 Happy Eyeballs 超时(约 250ms)才退回 v4。或者更糟,v6 通了但 v4 没通,于是绕过了代理。配置时要确认代理同时接管 v4 + v6(在 Clash 里是 ipv6: true,sing-box 里 inet6_address)。

陷阱 ② · AAAA 查询被遗忘

DNS 不止有 A 记录,还有 AAAA。GFW 同样污染 AAAA。所以你的 DNS 规则必须对 A 和 AAAA 一视同仁地保护。不少老配置只考虑 A,结果 AAAA 查询返回污染地址,应用 Happy Eyeballs 选了那个伪造的 v6 IP——网络又「莫名其妙挂了」。

陷阱 ③ · Fake-IP 也要双栈

如果你启用了 Fake-IP 但只配了 IPv4 假段,AAAA 查询要么返回空(应用立刻退回 v4,问题不大),要么走真实 DNS(前功尽弃)。要拿到完整的 Fake-IP 收益,需要同时配一个 IPv6 假段,常见用 fc00::/18

换句话说:本讲义的每一招(DNS 直连、嗅探、Fake-IP)都要在 v4 和 v6 上各做一遍。一旦遗漏了某一边,整套防线就有一个洞。这是新手最容易踩、却最难自己排查的坑。

三句话总结

  • TUN 模式 = 在 L3 接管全部流量,代价是丢掉 L7 语义。
  • DNS 直连 + 嗅探 + Fake-IP = 三种逐步精准地把 L7 语义找回来的方法。
  • 所有代理软件做的事都一样,区别只在「这三件事各自做得有多好、配合得有多顺滑」。
长期心法

下次再看 Clash / Sing-box / Surge 的配置文件,第一段先找 dns block,看它的 listen / nameserver / fallback / fake-ip-range / fake-ip-filter 几项是怎么写的——这一段决定了你的网络稳不稳。

然后找 sniffer / sniff 段,看是否开启了 TLS/QUIC/HTTP 嗅探——这决定了硬骨头流量分流准不准。

最后才看 rules / route 段。其实那部分只是「最终决策列表」——前面两段才是让代理软件「看得见东西」的根基。

· · ·

讲义至此完结
从 IP 到 DNS,从 TUN 到 Fake-IP,从单栈到双栈——
这一切讲的不是某个工具的某一版本,
而是所有代理工具背后同一个不变的网络分层逻辑