Skip to content

高阶极客:自定义规则集、DoH/Fake-IP 防污染与分进程代理

导读:在科学上网过程中,“节点延迟很低但网页死活打不开”、“访问 ChatGPT 提示 Access Denied”、“国内外测速都正常但微信收消息有延迟”,这些诡异问题 90% 都源自 DNS 投毒、DNS 泄漏或分流规则冲突。本教程将深入剖析内核 DNS 与规则引擎的高阶玩法。


一、为什么科学上网必须解决 DNS 问题?

在公网环境下,客户端请求一个网站(如 google.com)时必须先解析为 IP 地址:

  1. DNS 投毒(DNS Poisoning):GFW 部署在主干路由器上,一旦监听到你向海外发起的明文 UDP 53 端口 DNS 请求,会抢在真实服务器之前伪造一个错误的 IP 地址(抢答投毒),导致浏览器访问到死节点;
  2. DNS 泄漏(DNS Leak):虽然你开了代理,但系统的某些网络层依然偷偷向本地运营商(如中国电信 114.114.114.114)查询海外域名的 IP。你的上网记录被运营商一览无遗,且可能触发账号风控;
  3. CDN 负优化:如果你用海外公共 DNS 去解析爱奇艺或腾讯视频,解析出的 CDN 服务器可能位于香港或欧美,导致国内视频播放卡成幻灯片。
mermaid
graph TD
    Client["客户端应用发出域名查询"] --> ProxyDNS["客户端内部 DNS 调度中心"]
    
    ProxyDNS --> DomainFilter{"域名分流判定"}
    DomainFilter -->|国内域名 (geosite:cn)| ChinaDNS["国内加密 DoH<br/>阿里 223.5.5.5 / 腾讯 dns.pub"]
    DomainFilter -->|海外域名 (geosite:geolocation-!cn)| FakeIPEngine["Fake-IP 虚拟地址池 (198.18.0.0/16)"]
    
    ChinaDNS --> DirectCDN["解析为国内最优 CDN 节点 (满速直连)"]
    FakeIPEngine -->|立即返回虚拟 IP 0ms 响应| Client
    Client -->|向虚拟 IP 发送 HTTP/TLS 数据| Tunnel["客户端将请求打包通过专线发出"]
    Tunnel --> Egress["海外落地节点直接代为解析与请求 (彻底杜绝投毒)"]

二、Fake-IP 模式 vs Redir-Host 模式终极解析

在 Clash / Mihomo 的 DNS 配置中,模式(Mode)主要有两种选择:

对比维度Fake-IP 模式 (强烈推荐)Redir-Host 模式 (已逐步淘汰)
首包解析延迟接近 0ms(内核直接从本地内存池分配一个虚拟 IP)150ms~600ms(必须等待远端节点将真实 IP 返回给客户端)
DNS 投毒防护彻底免疫(海外真实解析完全转移至海外落地机进行)容易受本地残留解析或缓存污染影响
应用兼容性极佳,但对极少数依赖反向 Ping 的局域网联机软件需配过滤兼容性高,但容易因 DNS 超时造成应用假死
工作原理内核记录 google.com <-> 198.18.0.25 映射表并截获流量内核截获请求并向远端真实 DNS 发起递归解析

必须加入 fake-ip-filter 的白名单场景

虽然 Fake-IP 体验极佳,但部分服务要求必须拿到物理真实 IP,必须在配置文件中进行白名单放行:

yaml
dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    # 1. 局域网广播与私有设备
    - '*.lan'
    - 'localhost.ptlogin2.qq.com'
    # 2. 网络时间 NTP 对时服务 (避免系统时间误差导致 TLS 证书握手失败)
    - 'time.*.com'
    - 'time.*.gov'
    - 'pool.ntp.org'
    # 3. 游戏语音与国内联机对战
    - '*.msftncsi.com'
    - 'msftconnecttest.com'
    - '*.battlenet.com.cn'

三、高可靠国内 + 海外分流 DNS 配置范例

以下为针对国内网络环境深度优化的生产级 DNS 配置模版,兼顾了国内 CDN 极速解析与海外防投毒防泄漏:

yaml
dns:
  enable: true
  listen: 0.0.0.0:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://doh.pub/dns-query
  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  fallback-filter:
    geoip: true
    geoip-code: CN
    geosite:
      - gfw
    ipcidr:
      - 240.0.0.0/4

四、动态规则集 (Rule Providers) 进阶运维

传统机场订阅把几千行规则硬编码在配置文件中,往往数月不更新,导致新网站无法分流。高阶做法是采用 外部规则集 (Rule Providers) 动态热加载:

yaml
rule-providers:
  # 订阅社区知名优质分流库 (如 Loyalsoldier)
  reject:
    type: http
    behavior: domain
    url: "https://testingcf.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400

  icloud:
    type: http
    behavior: domain
    url: "https://testingcf.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
    path: ./ruleset/icloud.yaml
    interval: 86400

  apple:
    type: http
    behavior: domain
    url: "https://testingcf.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
    path: ./ruleset/apple.yaml
    interval: 86400

rules:
  - RULE-SET,reject,REJECT
  - RULE-SET,icloud,DIRECT
  - RULE-SET,apple,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,🐟 漏网之鱼

五、基于进程名的精准应用分流 (Process-Name Routing)

对于开发人员与高阶玩家,很多时候我们希望特定应用软件走独立节点,而不依赖容易变动的域名。Clash Meta (Mihomo) 支持强大的 PROCESS-NAME 语法:

yaml
rules:
  # 1. 开发工具强制走低延迟专线
  - PROCESS-NAME,cursor.exe,🤖 OpenAI
  - PROCESS-NAME,Code.exe,🤖 OpenAI
  - PROCESS-NAME,git.exe,🚀 节点选择

  # 2. 聊天工具独立分流 (避免因节点漂移导致被 Telegram 踢下线)
  - PROCESS-NAME,Telegram.exe,✈️ Telegram
  - PROCESS-NAME,Discord.exe,💬 社交媒体

  # 3. 游戏客户端直连不走代理
  - PROCESS-NAME,League of Legends.exe,DIRECT
  - PROCESS-NAME,Steam.exe,DIRECT

六、极客必备:命令行终端代理快速注入

如果不想常开 TUN 模式,但需要在 Windows PowerShell 或 Linux 终端中临时加速 git clonecurl,可在配置文件中配置快捷别名:

Windows PowerShell 配置(写入 $PROFILE

powershell
function set-proxy {
    $env:HTTP_PROXY="http://127.0.0.1:7890"
    $env:HTTPS_PROXY="http://127.0.0.1:7890"
    Write-Host "✅ 终端网络代理已开启 (127.0.0.1:7890)" -ForegroundColor Green
}

function unset-proxy {
    $env:HTTP_PROXY=""
    $env:HTTPS_PROXY=""
    Write-Host "❌ 终端网络代理已注销" -ForegroundColor Yellow
}

每次打开 PowerShell 只需输入 set-proxy,即可满速下载代码仓库与安装依赖包。

本站所有评测数据均基于独立实测与客观网络遥测。