文章

Linux 服务器代理配置记录:mihomo 后台运行与按需代理

记录在无桌面 Linux 服务器上配置 mihomo 的过程:安装、配置、前台验证、systemd 托管、命令行代理、Dashboard 访问和排错。

服务器上经常会遇到一个问题:平时跑服务没事,一到下载 GitHub Release、拉依赖、访问外部文档,网络就不稳定。

我不想接管整台机器的网络,也不想把代理端口暴露出去。最后的方案是:服务器本机运行 mihomo,只监听 127.0.0.1,命令行需要时再临时走代理。

目标

这次不做透明代理,也不做全局代理。目标只有三个:

  1. curlgitpnpm 等命令按需走代理。
  2. mihomosystemd 后台运行,开机自启。
  3. 代理端口和控制接口只监听本机。

链路大概是这样:

Linux 服务器代理链路

命令行工具只连接 127.0.0.1:7890。节点、规则、订阅这些交给 mihomo

执行顺序

从新服务器开始,我会按这个顺序做:

确认系统架构
  -> 安装 mihomo 二进制
  -> 准备 /etc/mihomo/config.yaml
  -> 前台启动测试
  -> curl 验证代理端口
  -> 写 systemd 服务
  -> 配置 proxy_on / proxy_off
  -> 按需配置 Git 代理和 Dashboard

流程图:

mihomo 配置流程

建议先前台启动测试,再交给 systemd。程序能运行、配置能解析、节点能出站,这是三件事。

环境和目录

下面命令以 Debian / Ubuntu 为例。

先确认架构:

uname -m

常见对应关系:

x86_64  -> amd64
aarch64 -> arm64

文件放在这几个位置:

/usr/local/bin/mihomo       # 程序本体
/etc/mihomo/config.yaml     # 配置文件
/var/log/mihomo/            # 日志目录,按需使用

创建目录:

sudo mkdir -p /etc/mihomo
sudo mkdir -p /var/log/mihomo

安装 mihomo

mihomo Release 页面下载对应架构的 Linux 包。服务器访问慢的话,可以本地下载后 scp 上传。

以 amd64 压缩包为例:

gzip -d mihomo-linux-amd64-*.gz
chmod +x mihomo-linux-amd64-*
sudo mv mihomo-linux-amd64-* /usr/local/bin/mihomo
mihomo -v

能看到版本号,说明二进制没问题。

准备配置

如果已有 Clash / Mihomo 订阅链接,可以下载成配置文件:

sudo curl -L "你的订阅地址" -o /etc/mihomo/config.yaml

订阅地址不要提交到 Git,也不要放到公开文档里。

打开配置:

sudo nano /etc/mihomo/config.yaml

重点检查这些字段:

mixed-port: 7890
socks-port: 7891
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
secret: "换成一个足够长的随机字符串"

说明:

  • mixed-port:HTTP / SOCKS 混合端口,命令行最常用。
  • socks-port:给只支持 SOCKS 的工具使用。
  • allow-lan: false:不允许局域网设备连接。
  • bind-address: 127.0.0.1:只监听本机。
  • external-controller:控制接口也绑定本机。
  • secret:控制接口认证。

服务器上最需要注意的是监听地址。代理端口不要变成 0.0.0.0

前台验证

先前台启动:

sudo mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml

如果 YAML 缩进、订阅内容、端口占用有问题,这里会直接报错。

另开一个终端测试:

curl -I --proxy http://127.0.0.1:7890 https://www.google.com/generate_204

看出口 IP:

curl --proxy http://127.0.0.1:7890 https://ipinfo.io/ip

这一步通过后,再写服务文件。

systemd 托管

创建服务文件:

sudo nano /etc/systemd/system/mihomo.service

写入:

[Unit]
Description=mihomo proxy service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5s
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
sudo systemctl status mihomo

看日志:

journalctl -u mihomo -f

改配置后重启:

sudo systemctl restart mihomo

命令行按需代理

我没有写全局代理,而是在 shell 里放两个函数。

Bash 编辑:

nano ~/.bashrc

Zsh 编辑:

nano ~/.zshrc

加入:

proxy_on() {
  export http_proxy="http://127.0.0.1:7890"
  export https_proxy="http://127.0.0.1:7890"
  export all_proxy="socks5://127.0.0.1:7891"
  export no_proxy="localhost,127.0.0.1,::1,.local"
}

proxy_off() {
  unset http_proxy
  unset https_proxy
  unset all_proxy
  unset no_proxy
}

让配置生效:

source ~/.bashrc

或:

source ~/.zshrc

使用:

proxy_on
curl https://github.com
proxy_off

这样只影响当前 shell,不会影响系统里的其他服务。

Git 单独配置

如果只想让 Git 走代理:

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

取消:

git config --global --unset http.proxy
git config --global --unset https.proxy

临时 clone 仓库时,我更倾向于 proxy_on,用完 proxy_off。全局 Git 代理适合长期需要的机器。

Dashboard 和控制接口

如果启用了:

external-controller: 127.0.0.1:9090
secret: "你的 secret"

不要开放服务器的 9090 端口。需要看控制面时,用 SSH 隧道:

ssh -L 9090:127.0.0.1:9090 user@your-server

本地访问:

http://127.0.0.1:9090

注意:external-controller 是控制接口,不一定自带 Dashboard。如果没有配置 external-ui,就在本地 Dashboard 里填 API 地址 http://127.0.0.1:9090secret

验收

看服务状态:

sudo systemctl status mihomo

确认只监听本机:

ss -lntp | grep -E "7890|7891|9090"

期望看到:

127.0.0.1:7890
127.0.0.1:7891
127.0.0.1:9090

测试代理出站:

curl --proxy http://127.0.0.1:7890 https://ipinfo.io/ip

测试 shell 函数:

proxy_on
curl -I https://github.com
proxy_off

这些都正常,就可以日常使用了。

排错

1. 端口监听到了公网

检查:

ss -lntp | grep -E "7890|7891|9090"

如果看到 0.0.0.0:7890,优先检查:

allow-lan: false
bind-address: 127.0.0.1

2. systemd 启动失败

看最近日志:

journalctl -u mihomo -n 100 --no-pager

重点看 ExecStart 路径、配置文件路径、端口占用。

3. curl 能走,Git 不走

先看你用的是哪种方式。

环境变量方式:

proxy_on

Git 全局配置方式:

git config --global --get http.proxy
git config --global --get https.proxy

不同工具读取代理配置的方式不一样,不要混着排查。

4. systemd 服务不继承 shell 代理

proxy_on 只影响当前 shell 和它启动的子进程。已经由 systemd 管理的服务不会自动继承。

如果某个服务也要走代理,在它自己的 service 文件里配置 Environment=

5. Dashboard 连不上

先确认 SSH 隧道还在:

ssh -L 9090:127.0.0.1:9090 user@your-server

再确认控制接口监听:

ss -lntp | grep 9090

如果提示未授权,检查 secret

小结

这套配置的重点是边界清楚:

  • mihomo 后台常驻。
  • 代理端口只监听本机。
  • 命令行按需开启代理。
  • Git 可以单独配置。
  • 控制接口通过 SSH 隧道访问。

这样能解决服务器访问外部资源的问题,也不会把整台机器的网络行为改得不可控。以后换服务器时,把二进制、配置文件、service 文件和 shell 函数照着恢复即可。