Linux 透明代理服务套件。以系统服务方式常驻运行 mihomo / clash 内核,TUN 接管全局流量,DNS 劫持 + fake-ip 分流从源头防止 DNS 泄漏。
- 服务化常驻:自动识别 systemd / OpenRC / runit / SysVinit 并注册开机自启;容器与非 root 环境自动降级为用户进程模式
- TUN 透明代理:
mihoctl tun on一键接管本机全部 TCP / UDP 流量,无需为每个应用单独配置代理 - 端口代理模式:不开 TUN 时仅监听本地端口,可只代理指定域名清单、其余全部直连,与机器上已有代理互不干扰
- DNS 防泄漏:劫持所有发往 53 端口的查询;国内域名走国内 DNS 真实解析,其余域名返回 fake-ip、由代理服务端在远端解析——本机不向任何上游发出国外域名查询
- 指定域名解析:通过
nameserver-policy/hosts为任意域名指定解析上游或固定 IP(内网域名、防污染等场景) - 订阅管理:多订阅存储 / 切换 / 定时更新;非标准格式自动调用 subconverter 本地转换
- 配置分层:个人定制写在 mixin 层,与订阅深度合并生成运行配置,订阅更新永不丢失自定义
- 双内核:mihomo(推荐,完整特性)与 clash(DNS / TUN 配置自动降级兼容)
- Web 面板:内置 zashboard 本地面板,也可一键使用公共 metacubexd
应用查询 DNS ──> TUN dns-hijack 劫持 53 端口 ──> 内核内置 DNS
│
┌───────────────────────────┴──────────────┐
│ 命中 geosite:cn / private │ 其余域名
▼ ▼
国内 DNS 真实解析 立即返回 fake-ip
(直连流量不绕路) (本机不发出任何上游查询)
│
▼
代理连接携带原始域名交给服务端,
真实解析在远端完成
本机全程不产生国外域名的明文 DNS 查询,泄漏面为零。开启 TUN 后可自行验证:
dig +short google.com # 应返回 198.18.x.x(fake-ip)再到 ipleak.net 之类的检测站确认 DNS 服务器一栏只显示代理出口。
要求:Linux(amd64 / arm64 / armv7 / 386),已安装 curl 或 wget、tar、gzip、unzip。
git clone --depth 1 https://gh-proxy.org/https://github.com/Knaithe/clash4linux.git
cd clash4linux
sudo bash install.sh [订阅URL]- 命令中的 GitHub 加速前缀可在
.env的MIHOCTL_GH_PROXY中更换或留空 - root 安装:注册系统服务,默认开启 TUN 透明代理(
.env设MIHOCTL_TUN=off可关闭) - 非 root / 容器安装:以用户进程运行,配合环境变量代理使用(见下)
- 内核、数据目录、组件版本等均可安装前在
.env中调整
root 安装时按检测结果注册名为 mihoctl 的开机自启服务,服务进程就是内核本体(<内核> -d resources -f resources/runtime.yaml):
| 服务方式 | 注册位置 | 原生管理命令 |
|---|---|---|
| systemd | /etc/systemd/system/mihoctl.service |
systemctl status mihoctl |
| OpenRC | /etc/init.d/mihoctl |
rc-service mihoctl status |
| runit | /etc/sv/mihoctl |
sv status mihoctl |
| SysVinit | /etc/init.d/mihoctl |
service mihoctl status |
| nohup(非 root / 容器) | 不注册,用户进程 | mihoctl status |
日常无需直接使用原生命令:mihoctl on / off / restart / status / log 会按安装时记录的服务方式自动分发(普通用户终端下自动 sudo)。systemd 下内核日志由 journald 管理(mihoctl log 内部调用 journalctl),其余方式写入 logs/kernel.log。
数据目录默认 ~/.mihoctl(sudo 安装时归属原用户;安装前可在仓库 .env 的 MIHOCTL_BASE_DIR 更改):
~/.mihoctl/
├── .env # 运行配置:内核、服务方式、订阅 UA、公共面板地址、自动注入开关
├── bin/ # mihomo / clash、yq、subconverter 二进制
├── logs/
│ ├── kernel.log # 内核日志(systemd 方式下由 journald 管理)
│ └── subscription.log # 订阅更新记录
├── run/ # nohup 方式的 pid 文件
└── resources/
├── mixin.yaml # 自定义层 —— 手动修改的主要入口
├── subscription.yaml # 当前启用订阅的原始配置
├── runtime.yaml # mixin 与订阅的合并产物,内核实际加载
├── profiles.yaml # 订阅元数据
├── profiles/ # 各订阅存档
├── dist/ # 本地 Web 面板
├── geosite.dat # 域名分类数据(geosite:cn 等规则依赖)
└── Country.mmdb # GeoIP 数据
手动修改指引:
resources/mixin.yaml:端口、DNS、TUN、规则、自建节点等所有个性化配置都写这里。直接编辑后执行mihoctl restart重新合并生效;用mihoctl mixin edit编辑则自带校验、失败自动回滚.env:MIHOCTL_SUB_UA、MIHOCTL_PUBLIC_UI等可随时手改,下次执行 mihoctl 即生效;MIHOCTL_KERNEL、MIHOCTL_INIT是安装器的记录值,不要手改runtime.yaml/subscription.yaml:生成文件,手改会在下次合并或订阅更新时被覆盖,不要动
mihoctl <子命令> [参数]| 子命令 | 说明 |
|---|---|
on / off / restart |
启动 / 停止 / 重启服务 |
status |
内核运行状态 |
log [-f] |
查看 / 跟随内核日志 |
tun [on|off] |
透明代理开关(需 root) |
env [off] |
输出代理变量的 export / unset 行,供 eval 使用 |
ui |
输出面板访问地址(本机 / 局域网 / 公网 / 公共面板) |
sub add <url> |
添加订阅(首个订阅自动启用) |
sub ls / sub use <id> / sub del <id> |
订阅列表 / 切换 / 删除 |
sub update [id] [--auto|--auto off] |
更新订阅;--auto 注册每日定时更新 |
sub log |
订阅更新记录 |
mixin [edit] |
查看 / 编辑自定义配置(校验失败自动回滚) |
secret [new|<值>] |
查看 / 重新生成 / 指定面板 API 密钥 |
upgrade [core|ui|geo|all] |
在线升级内核 / 面板 / geo 数据(mihomo) |
completion |
输出 bash 补全脚本(安装时已自动配置) |
环境变量代理(非 TUN 场景,如非 root 安装):
eval "$(mihoctl env)" # 当前终端启用 http_proxy 等变量
eval "$(mihoctl env off)" # 当前终端取消
mihoctl env auto off # 关闭新终端自动注入编辑自定义层(保存后自动合并、校验、重启生效):
mihoctl mixin edit常用场景示例(文件内已附注释模板):
dns:
nameserver-policy:
'geosite:cn,private': # 默认:国内与内网域名真实解析
- 223.5.5.5
- 119.29.29.29
'+.corp.example.com': '10.0.0.53' # 公司内网域名走内网 DNS
'+.example.org': 'https://dns.google/dns-query' # 指定域名强制某上游
'geosite:category-ads-all': 'rcode://success' # 广告域名直接拒答
hosts: # 固定解析,优先级最高
'router.lan': 192.168.1.1
rules-prepend: # 插到订阅规则最前
- DOMAIN-SUFFIX,internal.example.com,DIRECT完整分流规则模板见 resources/rules-example.yaml:局域网直连 → 广告拦截 → AI 服务专属出口(OpenAI / Claude / Gemini / Grok / Perplexity 等域名清单)→ 国内直连 → 其余走代理,可整段或按需拷入 mixin。
只想让 AI 等特定域名走代理、其余流量一概不接管,或者机器上已有别的代理在跑时,可以不开 TUN,把 mihoctl 当纯本地端口代理用——只监听自己的 7890 / 9090 端口,不动路由表、不劫持 DNS、不占 53 端口,与任何现有代理零冲突。
-
保持 TUN 关闭:安装前在
.env设MIHOCTL_TUN=off;已开启则sudo mihoctl tun off -
规则只管目标域名:
mihoctl mixin edit,顶层写rules:(整体覆盖订阅规则),目标域名走出口、末行MATCH,DIRECT兜底直连:rules: - DOMAIN-SUFFIX,anthropic.com,你的组名 # 出口写订阅中实际的组名或节点名 # …… 更多域名 - MATCH,DIRECT # 其余流量原样直连
AI 域名清单不必手敲,在仓库目录一行生成后粘贴:
grep 'DOMAIN-SUFFIX.*,AI$' resources/rules-example.yaml | sed 's/,AI$/,你的组名/'
-
让目标程序指向代理端口,按影响范围三选一:
-
只配单个程序:例如 Claude Code,在
~/.claude/settings.json加env块,仅该进程走代理,shell 与其他程序不受影响:{ "env": { "HTTPS_PROXY": "http://127.0.0.1:7890", "HTTP_PROXY": "http://127.0.0.1:7890" } } -
当前终端:
eval "$(mihoctl env)"(大小写全套代理变量一并导出) -
所有新终端:安装时默认已自动注入,无需操作——规则兜底是 DIRECT,非目标域名照常直连。若机器上其它代理也依赖环境变量、会被注入顶掉,则
mihoctl env auto off关闭自动注入,退回前两种方式
-
该模式下走代理的域名同样没有 DNS 泄漏:连接把域名原样交给代理服务端在远端解析,本机不产生查询。两点提醒:为 CLI 配置了自定义 API 中转地址(如 ANTHROPIC_BASE_URL)时,中转域名不在清单内,需自行补一条规则;mihoctl ui 打开面板的连接页可实时查看每条连接命中的规则,便于发现并补充清单外的域名。
mihoctl sub add https://example.com/sub # 添加并存储;首个订阅自动启用
mihoctl sub ls # 列表(* 为当前启用)
mihoctl sub use 2 # 切换到 2 号订阅并重载
mihoctl sub update # 更新全部订阅
mihoctl sub update --auto # 每日凌晨自动更新订阅内容若不是标准 clash YAML(如 base64 节点列表),会自动启动本地 subconverter 转换后导入。
sudo mihoctl tun on # 接管全局流量 + DNS 劫持
sudo mihoctl tun off # 回退为普通代理端口模式
mihoctl tun # 查看当前状态- 需要 root 与内核 TUN 支持,普通容器内通常不可用
- 默认
strict-route严格路由防绕行,docker0/podman0网桥已排除,不影响容器互访 - 环境不支持
auto-redirect时自动降级重试,仍失败则回滚配置并保持原状态
cd clash4linux
sudo bash uninstall.sh # 非 root 安装则无需 sudo停止服务、注销开机自启、移除定时任务与 shell 注入、删除命令与数据目录。
- mihomo — 代理内核
- yq — YAML 处理器
- subconverter — 订阅格式转换
- zashboard — 本地 Web 面板
- metacubexd — 公共 Web 面板
本项目仅供学习交流与合法用途(如科研、跨境办公、开发调试)。使用者应遵守所在地法律法规,因使用本项目产生的一切后果由使用者自行承担。
MIT © 2026 Knaithe