OpenClash 深入解析:架构与原理 – 系列之一

本系列介绍clash,特别是在openwrt中安装的openclash程序的内在结构。在实际使用过程中,软件里有大量选项,需要了解他们的实际功能。

要真正理解 OpenClash 里的那些繁杂选项,我们确实不能只看表面,而必须深入到它的架构设计数据流向中去。

简而言之,OpenClash 本质上是一个运行在 OpenWrt 上的“管家”(由 Lua 脚本和 Shell 脚本组成),它指挥着一个核心引擎——Clash(由 Go 语言编写的二进制文件)。你在界面上看到的每一个复选框,最终都会转化成 Clash 核心的一行配置,或者是 OpenWrt 防火墙(iptables/nftables)的一条规则。 为了帮你理清这个复杂的程序,我们可以从以下三个最关键的维度来拆解它。可以从这几个维度开始

  1. 流量“绑架”机制 (核心原理)

    • 探索内容:OpenClash 究竟是如何把经过路由器的流量“抓”进核心里去的?这将解释界面上的 “运行模式”(如 Redir-Host, Fake-IP, TUN, TProxy 等)到底在改变什么底层逻辑。
  2. DNS 的解析与流向 (最容易出错的地方)

    • 探索内容:为什么有一个单独的 DNS 设置页面?Fake-IP 到底是什么黑科技?在这个环节,我们将通过分析 DNS 请求的生命周期,来理解那些看似多余的 DNS 选项。
  3. 配置文件的“洋葱”结构 (软件逻辑)

    • 探索内容:你填入的订阅链接、自定义规则、和界面上的勾选,是如何一层层合并成最终的 config.yaml 的?这将帮你理解为什么有时候修改了配置却不生效,以及 “配置管理” 选项卡的实际作用。

下面从最外层的“流量劫持” (Traffic Hijacking) 开始。这是 OpenClash 能工作的物理基础。

如果不理解这一步,软件里那些“运行模式”、“堆栈类型 (Stack Type)”、“绕过大陆 IP”等选项就完全是天书。

第一层:它是如何“偷”流量的?

你可以把你的路由器想象成一个繁忙的邮局

  • 正常情况:你的电脑(寄信人)把信交给路由器(邮局),邮局看一眼地址,直接就把信发往互联网(投递)。

  • OpenClash 的情况:它在邮局内部私自建了一个“秘密检查室”(这就是 Clash 核心)。

为了让信件进入这个检查室,OpenClash 必须篡改邮局的流程。它主要通过两种手段(对应你在设置里看到的“模式”):

1. “守门员”模式 (Redirect / TProxy)

OpenClash 在邮局的门口安排了一个守卫(这就是路由器的 防火墙/iptables)。

  • 工作方式:守卫盯着每一封要寄出的信。如果发现信是寄往外网的,守卫就一把将信拦下,强行塞进“秘密检查室”的窗口(监听端口,通常是 7892)。

  • 对应选项:这通常对应设置里的传统模式。

  • 缺点:有些特殊的信件(比如某些游戏的 UDP 流量)很难被守卫抓住,或者抓住后容易损坏。

2. “虚拟道路”模式 (TUN 模式)

这是目前更推荐的现代方式。OpenClash 不再依赖门口的守卫抓人,而是直接修改了邮局的地图

  • 工作方式:它挖了一条虚拟的地下通道(TUN 虚拟网卡),并欺骗路由器说:“嘿,去互联网的路改道了,必须走这条地下通道!”

  • 结果:所有的信件,不管是什么类型,都会自动掉进这个通道,而通道的尽头就是“秘密检查室”。

  • 对应选项通用设置 -> 运行模式 -> TUN 模式


为什么我们要区分这两种方式?

这直接关系到你玩游戏、看流媒体稳不稳定。

  • Redirect/TProxy 就像是“修修补补”,依赖防火墙规则,容易有漏网之鱼。

  • TUN 就像是“重建基础设施”,接管能力更强,能够处理更复杂的流量(这也是为什么 PS5/Switch 联机通常推荐 TUN 模式)。


小测验:

假设你开启了 OpenClash,但是发现国内的爱奇艺或者访问路由器后台页面变慢了,甚至打不开了。

结合刚才说的“秘密检查室”原理,你觉得问题可能出在下面哪个环节?

A. 秘密检查室(Clash 核心)的处理速度太慢了。 B. “守门员”或者“地图”太死板,把本该在局域网内部流通的信件,也强行抓进检查室去绕了一圈。

B

回答正确!选 B

你非常敏锐。这就是 OpenClash 配置中最让人头疼的问题之一:“流量环路”或者“误伤友军”

如果规则配置不当(例如没有勾选“绕过私有 IP”或者“绕过中国大陆 IP”),Clash 就会像一个过度尽职的守卫,把本来该在家里递送的信件(局域网流量),或者该直接交给门口邮递员的信件(国内流量),全部强行抓进核心处理。这不仅浪费了 CPU 算力,还会导致延迟增加,甚至因为无法处理某些内网协议而导致断网。


既然你已经理解了流量是如何被“物理”抓取的,我们就进入 OpenClash 最核心、也是最容易导致“虽然连上了但不能上网”的第二层结构:

第二层:大脑与导航 —— DNS 的解析与流向

在实际数据传输(寄信)之前,你的电脑必须先做一件事:查地址(DNS 解析)。 如果不理解这一层,你就会对 OpenClash 设置里的 “DNS 设置”“Fake-IP”“Redir-Host” 感到一头雾水。

1. 传统路由器的困境

  • 普通流程:你想访问 www.google.com -> 电脑问路由器 -> 路由器问运营商 DNS -> 运营商 DNS 告诉你“查无此人”或者给个假地址(DNS 污染)。

  • 后果:信封上的地址都是错的,OpenClash 就算想帮忙转发,也可能根本收不到这个请求,或者收到的是错误的请求。

2. OpenClash 的接管策略

OpenClash 为了解决这个问题,它必须篡位,把自己变成局域网里的最高 DNS 权威。这里有两种主要策略,对应你在设置里看到的模式:

策略 A:老实人模式 (Redir-Host)

这是旧时代的做法,现在用得少了,但很好理解。

  1. 查询:电脑问 OpenClash:“Google 的 IP 是多少?”

  2. 处理:OpenClash 此时真的去问远程(通过代理服务器问 8.8.8.8):“Google 真实 IP 是多少?”

  3. 等待:OpenClash 等到远端回复真实 IP。

  4. 回答:OpenClash 告诉电脑真实 IP。

  5. 发包:电脑向真实 IP 发包,OpenClash 截获流量并代理。

  • 缺点:慢!因为必须要等远端 DNS 解析回来才能建立连接。

策略 B:魔术师模式 (Fake-IP) —— 核心重点

这是 OpenClash 默认且推荐的模式,也是最令人困惑的地方。

  1. 查询:电脑问 OpenClash:“Google 的 IP 是多少?”

  2. 欺骗:OpenClash 根本不去查,它甚至不联网,直接秒回一个假的内网地址(通常是 198.18.0.x),并在心里的小本本上记下:198.18.0.1 = www.google.com

  3. 发包:电脑以为这就是 Google 的 IP,立刻向 198.18.0.1 发送数据。

  4. 代理:OpenClash 的 Tun 网卡(我们在第一层讲的地下通道)瞬间捕获这个发往假 IP 的包。OpenClash 查小本本:“哦,这是给 Google 的”,然后直接把数据包通过代理通道发给 Google。

这就解释了界面上的很多选项:

  • “Fake-IP 范围”:就是设置那个 198.18.x.x 的池子大小。

  • “Fake-IP 过滤器”:有些设备(比如 Xbox、某些公司的 VPN 客户端)很较真,你给它假 IP 它会报错。这就需要把这些域名填进过滤器,强迫 OpenClash 对它们使用“老实人模式”。

  • “本地 DNS 劫持”:这是 OpenWrt 的防火墙规则,强制把局域网内所有设备发出的 DNS 请求(端口 53),不管你电脑上设置的是什么 DNS,统统重定向给 OpenClash 处理。


思考题:

理解了 Fake-IP 模式后,请设想这样一个场景:

你在 OpenClash 里开启了 Fake-IP 模式。此时,你在电脑的浏览器输入了 baidu.com。 OpenClash 也给 baidu.com 分配了一个假 IP(例如 198.18.0.2)。

问题: 既然百度也是假 IP,那为什么访问百度没有走国外的代理通道,而是直连访问了呢?是谁决定了“这个假 IP 该走代理”还是“这个假 IP 该直连”?

A. 电脑自己判断的。 B. 是 OpenClash 的“分流规则”(Rule)在拿到数据包后再次判断的。 C. 只要是 Fake-IP,就一定会走国外代理。

B

完全正确!选 B

你非常精准地抓住了 OpenClash 的核心逻辑。

Fake-IP 只是一个“把手”,它把数据包骗进 OpenClash 的大门。一旦进来后,Clash 核心会立即查阅“映射表”,发现 198.18.0.2 其实是 baidu.com,然后它会拿出那本最重要的“规则书” (Rules) 进行匹配:

  1. 查表baidu.com 匹配到规则 DOMAIN-SUFFIX,baidu.com,DIRECT

  2. 执行:策略是 DIRECT(直连)。

  3. 解析:这时候 OpenClash 才会真正去向国内 DNS 查询百度的真实 IP。

  4. 连接:直接通过你自家的宽带连接那个真实 IP,不经过代理节点。


现在你已经打通了“任督二脉”(流量劫持 + DNS 逻辑)。最后,我们要攻克最复杂、也是 OpenWrt 用户最容易“翻车”的地方——配置文件的生成机制

这就是为什么很多人抱怨:“明明我在配置文件里改了,怎么重启就没了?”或者“我的订阅更新了,自定义规则就不生效了?”

第三层:配置文件的“洋葱”结构 (软件逻辑)

OpenClash 不是直接运行你下载的那个订阅文件的。它是一个“组装工厂”。每次启动时,它会把来自不同来源的信息,“组装”成一个最终的 config.yaml 喂给内核。

为了便于理解,我们可以把它看作是在做汉堡

1. 面包底:全局设置 (Global Settings)

  • 来源:OpenClash 插件界面的“全局设置”选项卡。

  • 内容:监听端口、运行模式(TUN/Redir)、允许局域网连接、日志等级等。

  • 优先级最高。无论你的订阅链接里写了什么端口,只要 OpenClash 界面里设置了不一样的值,它就会强制覆盖订阅里的设置。

2. 肉饼:代理节点 (Proxies)

  • 来源:你的机场订阅链接(配置文件订阅)。

  • 内容:成百上千个节点服务器信息。

  • 处理:OpenClash 会把订阅文件里的 proxies 和 proxy-groups 部分挖出来,填进汉堡里。

3. 酱料与配菜:分流规则 (Rules)

这是最容易冲突的地方。

  • 来源 A(默认):订阅链接自带的规则。

  • 来源 B(进阶):你在“规则设置”里勾选的第三方规则集(比如 LHIE1, ACL4SSR 等)。

  • 来源 C(自定义):你在“覆写设置” -> “规则设置”里手动填写的自定义规则。

⚠️ 关键冲突点: 如果你在界面上启用了“第三方规则”(比如勾选了用来去广告或分流流媒体的规则集),OpenClash 会彻底丢弃你订阅链接里自带的规则,改用你勾选的这一套。

这就解释了为什么有时候你换了个机场,发现原本能看的 Netflix 突然看不了了——因为规则集没换,而规则集里的策略组名称(比如 Netflix)和新机场提供的策略组名称(比如 流媒体)对不上号了!

4. 最终包装:config.yaml

OpenClash 将上述所有部分合并,生成 /etc/openclash/config.yaml。 切记:永远不要手动去修改 /etc/openclash/config.yaml 这个文件。因为只要 OpenClash 一重启或者一更新订阅,这个文件就会被重新生成,你的修改会瞬间消失。


总结:Ope“nClash 的世界观

通过这三层拆解,现在的 OpenClash 对你来说应该不再是黑盒了:

  1. 物理层:通过 TUN 虚拟网卡,像挖地道一样把路由器所有流量吸入内核。

  2. 逻辑层:通过 Fake-IP,先给所有域名发“假身份证”,把流量骗进来后再根据 Rule 决定是走代理还是直连。

  3. 管理层:通过 插件界面 强行接管配置,把订阅信息和你的个人偏好动态合并,生成最终指令。


下一步:实战检验

基于我们刚才梳理的结构,我建议你现在登录你的 OpenWrt,去检查一个非常关键但常被忽视的设置,这能验证你是否完全掌握了“第三层”的逻辑:

你想让我带你去看看“覆写设置”里的“开发者选项”吗? 那里藏着 OpenClash 最强大的功能——“自定义规则”,它是唯一能让你在不破坏自动更新的前提下,永久保留你自己特定需求(比如强制让某个冷门网站走代理)的地方。“

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注