Clash for Linux:一键部署 Mihomo 代理环境,clashctl CLI 管理

2026-06-08

前两天在一台新的 Linux 服务器上配代理,想起了我在另一台机器上用的那套一键部署方案。这个项目叫 clash-for-linux-install,GitHub 上 13.2k Star,纯 Shell 实现,官方支持两种内核:mihomo(原 Clash Meta)和 clash。

装完用了一段时间,发现有些东西文档里写得不够细。把我遇到的问题和最终方案整理一下。

这是什么

clash-for-linux-install 是一套用 Shell 脚本实现的 Clash/Mihomo 代理环境安装和管理工具。它把整个流程压缩成了一步:

git clone --branch master --depth 1 https://gh-proxy.org/https://github.com/nelvko/clash-for-linux-install.git \
  && cd clash-for-linux-install \
  && bash install.sh

安装后,所有文件放在 /root/clashctl/ 下,主要包含:

  • mihomo 内核 — 负责实际的代理转发
  • subconverter — 本地订阅转换,不用把订阅信息提交到第三方网站
  • yq — YAML 处理工具,用来合并配置
  • clashctl — CLI 管理入口

日常用到的是几个 shell 命令,安装脚本会写入 ~/.bashrc

命令 作用
clashon / clashoff 开/关代理
clashctl status 查看内核运行状态
clashui 浏览器打开 Web 控制台
clashmixin 编辑叠加配置
clashtun on/off 开关 Tun 模式
clashctl sub 管理订阅

安装后第一件事是配订阅和密码:

# 设置 Web 控制台密码
clashctl secret your-password-here
# 导入订阅链接
clashctl sub add https://your-subscription-link
# 检查状态
clashctl status

为什么用脚本而不是 Docker

很多人的第一反应是”用 Docker 跑一个 proxy container 不就行了”。这取决于场景。

Docker 方案的好处是隔离性好、迁移方便,适合用 docker-compose 管理的场景:

services:
  mihomo:
    image: metacubex/mihomo
    container_name: mihomo
    network_mode: host
    volumes:
      - ./config.yaml:/root/.config/mihomo/config.yaml
    restart: always

但直接装在本机上有几个 Docker 做不到的事:

  • Tun 模式接管所有容器流量,不用每个容器单独设代理
  • 开机自启直接和系统 init 系统绑定,不用等 Docker daemon 启动
  • 资源开销更低,没有容器化额外层

我自己因为机器上本来就跑着各种服务、Docker 环境也比较老,所以选了本机安装。如果你从零开始搭新环境,docker-compose 也不失为一个干净的选择——两种方案各有适用场景。

Mixin 配置 — 最容易被忽略的功能

代理订阅商会定期更新配置文件。如果你直接改 /root/clashctl/resources/config.yaml,下次 clashctl sub 一刷,改的东西全没了。

这个项目提供了一层叫 Mixin(叠加配置)的机制来解决这个问题。它的逻辑是:你在 mixin.yaml 里写自定义规则,运行时和订阅配置深度合并,且 mixin 的优先级最高。

这是我的配置参考:

# /root/clashctl/resources/mixin.yaml
mixed-port: 7890
external-controller: "0.0.0.0:9090"
secret: your-password-here
allow-lan: false

rules:
  prefix:
    - DOMAIN,api64.ipify.org,DIRECT

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53

dns:
  enable: true
  enhanced-mode: fake-ip
  default-nameserver: [223.5.5.5, 119.29.29.29]
  proxy-server-nameserver: [223.5.5.5, 119.29.29.29, 1.1.1.1, 8.8.8.8]
  nameserver: [114.114.114.114, 8.8.8.8]

clashmixin -e 编辑,保存后自动重启生效。

踩坑记录

1. 装完找不到 clashon 命令

安装脚本把命令定义写进了 ~/.bashrc,但需要你重新加载。source ~/.bashrc 或者重开一个终端会话。如果用的是非交互式 SSH,记得加 -i 参数登入。

2. ping 不通外网

Clash 默认只代理 TCP 流量。ping 用的是 ICMP 协议,不走代理。Tun 模式可以解决这个问题:

clashtun on

Tun 模式会在系统创建一个虚拟网卡,所有流量经过它转发,包括 ICMP、UDP 和未配置代理的进程。

3. Docker 容器连不上外网

容器默认不走宿主机的系统代理。方案有两个:

  • 开 Tun 模式 — 容器流量自动被虚拟网卡接管,不需要每个容器配环境变量
  • 配容器代理 — 在 dockerd 配置里设置环境变量,或者每个容器启动时加 -e HTTP_PROXY=http://host:7890

Tun 模式更省事,但要注意在 mixin 里排除 Docker 网桥接口,避免路由环路:

interface-name: eth0
tun:
  exclude-interface:
    - docker0
    - podman0

4. Web UI 只能本机访问

默认 external-controller 绑定 127.0.0.1:9090,只能本机用。改成 0.0.0.0:9090 就能从局域网访问了。但这意味着 9090 端口暴露在网络上,配合 secret 设置密码是必要的。

5. 订阅更新覆盖手动配置

前面讲过了,用 clashmixin 管理自定义配置,不要直接改 config.yaml

6. 内核升级被网络问题卡住

clashctl upgrade 要从 GitHub 下载内核二进制。如果你的服务器本身就在代理环境里,需要在 mixin 里加一条规则让 GitHub 走代理:

rules:
  prefix:
    - DOMAIN-KEYWORD,github,PROXY

或者绕路用 Gitee 镜像、代理加速链接。

7. 一键安装脚本里的加速前缀失效

安装命令用了 gh-proxy.org 这个加速前缀。这种第三方加速随时可能失效。如果装不上,试试换成其他可用的 GitHub 加速源,或者手动下载安装包部署。

总结

clash-for-linux-install 把一个本机配置代理的繁琐过程封装成了几条命令。Tun 模式和 Mixin 叠加配置是它最有价值的设计——前者解决了所有流量问题,后者保证了自定义配置不会被订阅更新覆盖。

对于需要在 Linux 上长期稳定使用代理的人来说,这套方案够轻量、够直接,13.2k Star 确实不虚。