前言
我主要是因为需要搭建一个代理服务的环境,用来配置代理服务进行科学上网。现在有很多clash的客户端,但是他们都需要在设备上安装软件,而我期望的方式是直接设置代理服务即可,无需在每台设备上安装clash的客户端,所以要部署在内网服务器作为代理网关。这样所有设备只需要配置代理地址,就能使用统一的代理服务。
目标
- 使用订阅连接自动更新路由配置,需要定期更新,并且支持简单快捷的切换订阅连接地址
- 带ui控制台,方便管理
- 部署在内网服务器,无需公开订阅连接,客户端只需要设置代理地址,配置账号密码即可使用代理
- 在linux服务器上使用命令行部署,通过docker容器化运行
部署
clash、clash meta和mihomo简介
Clash 是一款用 Go 编写的基于规则的代理工具,最初由 Dreamacro 开发。它支持多种代理协议,包括 Shadowsocks、VMess、Trojan 等。
Clash Meta(现更名为 Mihomo)是基于 Clash 开源项目的二次开发版本。它继承了 Clash 的核心功能并增加了一些独特的特性,包括部分原 Clash Premium 核心的功能。相比于 Clash,Clash Meta/Mihomo 引入了更多协议支持(如 VLESS XTLS、Trojan XTLS、Hysteria 等)和更丰富的规则控制。
在 2023 年经历了 Clash for Windows 删库事件之后,原 Clash 项目停止更新,于是开发者将 Clash Meta 改名为 Mihomo,继续进行维护和更新。
环境准备
首先我们需要准备部署环境和创建工作目录:
# 创建工作目录
mkdir -p ~/workspace/mihomo/config
cd ~/workspace/mihomo
docker compose部署
创建 docker-compose.yml 文件:
services:
# 主体服务
mihomo:
container_name: mihomo
image: metacubex/mihomo
restart: always
ports:
- "7890:7890"
- "7891:7891"
- "9090:9090"
volumes:
- ./config:/root/.config/mihomo
# ui站点
metacubexd:
container_name: metacubexd
image: ghcr.io/metacubex/metacubexd
restart: always
ports:
- "9097:80"
配置文件准备
创建基础配置文件 config/config.yaml。
现在的配置托管地址通常都是包含完整的clash配置文件,因此我们只需要从订阅地址直接下载:
$> curl -s -H "User-Agent: clash" "https://clash.example.top/subscribe" -o ./config/config.yaml
注意:有些服务的订阅地址,会根据User-Agent的请求头来决定返回的内容,比如我用的订阅服务,默认情况下只返回节点列表的base64结果,而加上User-Agent: clash请求头则可以返回完整的clash配置。
更新订阅脚本
创建订阅更新脚本 update.sh:
#! /bin/bash
export converter_url="https://clash.example.top/subscribe"
curl -H "User-Agent: clash" $converter_url > ~/workspace/mihomo/config/config.yaml
echo "secret: Pass@word123" >> ~/workspace/mihomo/config/config.yaml
sed -i 's/127.0.0.1:9090/0.0.0.0:9090/' ~/workspace/mihomo/config/config.yaml
sed -i 's/port: 7890/port: 0/' ~/workspace/mihomo/config/config.yaml
sed -i 's/socks-port: 7891/socks-port: 0/' ~/workspace/mihomo/config/config.yaml
sed -i 's/mixed-port: 0/mixed-port: 7890/' ~/workspace/mihomo/config/config.yaml
echo "authentication: " >> ~/workspace/mihomo/config/config.yaml
echo '- "admin:pass@word"' >> ~/workspace/mihomo/config/config.yaml
curl -ik -s -X PUT "http://127.0.0.1:9090/configs" -H "Content-Type: application/json" -H "Authorization: Bearer Pass@word123" -d '{"path": "/root/.config/mihomo/config.yaml"}'
这里的订阅更新脚本做了几件事:
- 从订阅链接下载新的订阅配置
- 在配置中加入secret配置,指定管理密钥
- 将外部控制绑定地址从127.0.0.1:9090改为0.0.0.0:9090
- 将代理端口从7890改为0,socks-port端口从7891改为0,mixed-port端口改为7890,这几个端口分别是http代理端口,socks5代理端口,以及混合代理端口
- 设置代理认证账号密码,客户端需要使用账号密码才能使用代理,不会随便被人使用
- 触发mihomo的核心服务更新配置
设置定时任务
为了让配置自动更新,我们需要添加一个cron任务。
执行cron命令:
$> crontab -e
进入cron任务编辑,输入如下cron表达式:
0 2 * * * ~/workspace/mihomo/update.sh
这个表达式表示每天凌晨2点定期执行~/workspace/mihomo/update.sh脚本,这样就可以通过脚本定期更新配置文件和刷新核心服务配置了。
启动服务
现在只需要在~/workspace/mihomo目录下,执行如下命令即可启动mihomo:
docker compose up -d
使用
Web UI管理
首先通过web ui查看服务的情况。
在浏览器输入地址:
http://127.0.0.1:9097
即可看到如下界面:

输入后端地址:http://127.0.0.1:9090,密钥Pass@word123即可链接核心服务:

Chrome插件
chrome的插件Zero Omega可以非常方便的配置和切换代理。
安装地址Zero Omega。
安装后进入选项页:

添加一个profile:

选择Proxy Profile:

输入代理地址:

点击应用即可:

如果你的服务端跟我一样设置了密码,那在输入代理的时候,还需要点击代理地址右边的小锁头图标,输入账号密码才能使用。
设置完成后,只需要在chrome的插件图标中点击Zero Omega,选择mihomo的代理即可让浏览器使用代理上网了。
电脑系统代理
如果希望在整个电脑级别使用代理,可以将mihomo设置为系统代理,不同操作系统设置系统代理的方式不一样,这里以mac为例。
打开设置 -> 网络 -> 详情(当前网络下):

选择代理菜单:

保存即可。
其他操作系统原理是一样的,自行搜索如何设置即可。
手机设置
如果你使用手机连接家里的wifi,则可以在手机的wifi设置代理即可,具体的设置方法可以执行百度。