本系列介绍clash,特别是在openwrt中安装的openclash程序的内在结构。在实际使用过程中,软件里有大量选项,需要了解他们的实际功能。
要真正理解 OpenClash 里的那些繁杂选项,我们确实不能只看表面,而必须深入到它的架构设计和数据流向中去。
简而言之,OpenClash 本质上是一个运行在 OpenWrt 上的“管家”(由 Lua 脚本和 Shell 脚本组成),它指挥着一个核心引擎——Clash(由 Go 语言编写的二进制文件)。你在界面上看到的每一个复选框,最终都会转化成 Clash 核心的一行配置,或者是 OpenWrt 防火墙(iptables/nftables)的一条规则。 为了帮你理清这个复杂的程序,我们可以从以下三个最关键的维度来拆解它。可以从这几个维度开始
流量“绑架”机制 (核心原理)
- 探索内容:OpenClash 究竟是如何把经过路由器的流量“抓”进核心里去的?这将解释界面上的 “运行模式”(如 Redir-Host, Fake-IP, TUN, TProxy 等)到底在改变什么底层逻辑。
DNS 的解析与流向 (最容易出错的地方)
- 探索内容:为什么有一个单独的 DNS 设置页面?Fake-IP 到底是什么黑科技?在这个环节,我们将通过分析 DNS 请求的生命周期,来理解那些看似多余的 DNS 选项。
配置文件的“洋葱”结构 (软件逻辑)
- 探索内容:你填入的订阅链接、自定义规则、和界面上的勾选,是如何一层层合并成最终的
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)
这是旧时代的做法,现在用得少了,但很好理解。
查询:电脑问 OpenClash:“Google 的 IP 是多少?”
处理:OpenClash 此时真的去问远程(通过代理服务器问 8.8.8.8):“Google 真实 IP 是多少?”
等待:OpenClash 等到远端回复真实 IP。
回答:OpenClash 告诉电脑真实 IP。
发包:电脑向真实 IP 发包,OpenClash 截获流量并代理。
- 缺点:慢!因为必须要等远端 DNS 解析回来才能建立连接。
策略 B:魔术师模式 (Fake-IP) —— 核心重点
这是 OpenClash 默认且推荐的模式,也是最令人困惑的地方。
查询:电脑问 OpenClash:“Google 的 IP 是多少?”
欺骗:OpenClash 根本不去查,它甚至不联网,直接秒回一个假的内网地址(通常是
198.18.0.x),并在心里的小本本上记下:198.18.0.1=www.google.com。发包:电脑以为这就是 Google 的 IP,立刻向
198.18.0.1发送数据。代理: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) 进行匹配:
查表:
baidu.com匹配到规则DOMAIN-SUFFIX,baidu.com,DIRECT。执行:策略是
DIRECT(直连)。解析:这时候 OpenClash 才会真正去向国内 DNS 查询百度的真实 IP。
连接:直接通过你自家的宽带连接那个真实 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 对你来说应该不再是黑盒了:
物理层:通过 TUN 虚拟网卡,像挖地道一样把路由器所有流量吸入内核。
逻辑层:通过 Fake-IP,先给所有域名发“假身份证”,把流量骗进来后再根据 Rule 决定是走代理还是直连。
管理层:通过 插件界面 强行接管配置,把订阅信息和你的个人偏好动态合并,生成最终指令。
下一步:实战检验
基于我们刚才梳理的结构,我建议你现在登录你的 OpenWrt,去检查一个非常关键但常被忽视的设置,这能验证你是否完全掌握了“第三层”的逻辑:
你想让我带你去看看“覆写设置”里的“开发者选项”吗? 那里藏着 OpenClash 最强大的功能——“自定义规则”,它是唯一能让你在不破坏自动更新的前提下,永久保留你自己特定需求(比如强制让某个冷门网站走代理)的地方。“