环境与安装
系统环境
Linux 发行版:Ubuntu 24.04.4 LTS
安装 Mihomo
Mihomo 官方项目是:
MetaCubeX/mihomo它本身是 Go 编译的二进制程序,不需要 Python 或 pip。
我的服务器是 linux amd64,安装的是:
Mihomo Meta v1.19.30通过 GitHub CLI 下载:
cd /tmp
gh release download v1.19.30 -R MetaCubeX/mihomo -p 'mihomo-linux-amd64-v1-v1.19.30.gz'下载完成后:
gunzip mihomo-linux-amd64-v1-v1.19.30.gz安装:
install -m 755 mihomo-linux-amd64-v1-v1.19.30 /usr/local/bin/mihomo检查:
mihomo -v我的输出:
Mihomo Meta v1.19.30 linux amd64 with go1.26.6 Sun Aug 16 10:02:19 UTC 2026Use tags: with_gvisor配置目录
统一将 Mihomo 数据放到:
/etc/mihomo创建:
mkdir -p /etc/mihomo主配置:
/etc/mihomo/config.yamlMihomo 启动时使用:
mihomo -d /etc/mihomoMihomo 配置
订阅管理
节点不直接写进主配置,而是通过 proxy-providers 管理:
proxy-providers: 机场订阅: type: http url: "你的订阅地址" path: ./sublinks/airport.yaml interval: 86400
health-check: enable: true url: https://www.gstatic.com/generate_204 interval: 300这样主配置负责规则,订阅负责节点。更新订阅后不需要重新生成整份配置。
我使用 Sublink 进行订阅聚合,所以这里目录命名为
sublinks/。
节点自动选择
- name: 自动选择 type: url-test use: - 机场订阅
exclude-filter: "(?i)套餐|到期|剩余|流量|重置|官网|文档|下载|通知"
url: https://www.gstatic.com/generate_204 interval: 300 tolerance: 50国外流量手动选择地区:
- name: 国外网站 type: select proxies: - 自动选择 - 日本 - 香港 - 新加坡 - 美国 - 全部节点 - DIRECT按地区自动筛选节点
不同国家和地区使用 url-test 进行选择节点。
例如日本:
- name: 日本 type: url-test
use: - 机场订阅
filter: "(?i)日本|东京|大阪|Japan|\\bJP\\b|🇯🇵"
exclude-filter: "(?i)套餐|到期|剩余|流量|重置|官网|文档|下载|香港|新加坡|台湾|美国"
url: https://www.gstatic.com/generate_204
interval: 300 tolerance: 20其他地区也是同样逻辑:
香港日本新加坡美国...DNS 与 Fake-IP
DNS 使用 Mihomo 自己管理:
dns: enable: true listen: 127.0.0.1:7874
ipv6: false prefer-h3: false
enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16
fake-ip-filter: - +.lan - +.local - time.*.com - ntp.*.com国内 DNS:
nameserver: - https://120.53.53.53/dns-query - https://223.5.5.5/dns-query并针对国内站点单独指定:
nameserver-policy: geosite:private: system
geosite:cn,steam@cn,category-games@cn,microsoft@cn,apple@cn: - 119.29.29.29 - 223.5.5.5 - 1.12.12.12 - 114.114.114.114服务器上把 DNS 监听限制为:
listen: 127.0.0.1:7874而不是:
listen: :7874这样可以避免无意间把 DNS 服务暴露出去。
服务分流
除了国内和国外流量,还可以对几个常用服务单独建立策略组。
例如 GitHub:
- name: GitHub type: select proxies: - 国外网站 - DIRECTGoogle:
- name: Google type: select proxies: - 被墙网站 - DIRECTOpenAI:
- name: openAi type: select proxies: - 全部节点 - 被墙网站 - DIRECT另外还可以对这些服务单独分流:
YouTubeNetflixTwitterTikTokFacebookDiscordOneDriveMicrosoftSteamCloudflare...Rule Provider
规则本身不全部写进 config.yaml,而是通过远程 Rule Provider 管理。
例如:
GitHub-rule: type: http interval: 86400 behavior: classical format: yaml
url: https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/GitHub/GitHub.yaml
path: ./ruleset/blackmatrix7/GitHub.yaml然后:
rules: - RULE-SET,GitHub-rule,GitHub广告:
- RULE-SET,广告拦截-rule,广告拦截最终的兜底逻辑:
- RULE-SET,cncidr,DIRECT,no-resolve- RULE-SET,direct,DIRECT
- GEOSITE,gfw,被墙网站- GEOIP,CN,国内网站
- MATCH,被墙网站整体逻辑大致是:
广告 ↓REJECT
国内网站 / CN IP ↓DIRECT
国外服务 ↓Proxy
无法识别的流量 ↓Proxy最后使用:
MATCH,被墙网站有一个实际好处:某个国外网站即使不在 GFWList 中,也不会因此意外走直连。
TUN 透明代理
TUN 配置
真正让 Mihomo 成为 Linux Server 系统代理核心的是 TUN。
我的配置:
tun: enable: true
stack: mixed
auto-route: true auto-redirect: false auto-detect-interface: true
dns-hijack: - any:53 - tcp://any:53
mtu: 1500 device: mihomo
strict-route: false其中:
stack: mixed在目前的 Mihomo 上比较通用。
auto-route 开启后,系统流量会自动进入 Mihomo TUN。
排除 Docker、Tailscale 和内网
route-exclude-address: - 10.0.0.0/8 - 100.64.0.0/10 - 169.254.0.0/16 - 172.16.0.0/12 - 192.168.0.0/16其中:
10.0.0.0/8172.16.0.0/12192.168.0.0/16是常见私有网络。
Docker 通常也处于:
172.16.0.0/12范围内。
Tailscale 使用的则是:
100.64.0.0/10所以将这些地址排除之后:
SSHDocker局域网Tailscale不会被 Mihomo TUN 改写路由。
整体结构变成:
flowchart TD A[Linux Server] --> B[LAN / Docker / Tailscale] B --> C[DIRECT] A --> D[Internet] D --> E[Mihomo TUN] E --> F[Rule Matching] F --> G[DIRECT] F --> H[Proxy]
Server 上的代理端口
我保留一个 Mixed Port:
mixed-port: 9870因为即使已经有 TUN,显式代理端口在测试、Docker 或某些程序中仍然很方便。
例如:
curl -x http://127.0.0.1:9870 https://github.com如果需要让 Docker 或局域网访问,则:
allow-lan: truebind-address: "*"但不要直接:
lan-allowed-ips: - 0.0.0.0/0否则公网服务器很容易不小心变成开放代理。
可以限制成:
lan-allowed-ips: - 127.0.0.0/8 - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16如果只有本机使用,则更加简单:
allow-lan: falsebind-address: 127.0.0.1服务管理
systemd 常驻
创建:
/etc/systemd/system/mihomo.service内容:
[Unit]Description=Mihomo Proxy ServiceAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=root
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failureRestartSec=3
LimitNOFILE=1048576
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICECapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE
NoNewPrivileges=true
[Install]WantedBy=multi-user.target加载:
systemctl daemon-reload启动:
systemctl enable --now mihomo查看状态:
systemctl status mihomo --no-pager查看实时日志:
journalctl -u mihomo -f重启:
systemctl restart mihomo配置检查与重启
mihomo -t -d /etc/mihomo通过以后再:
systemctl restart mihomoMetaCubeXD WebUI
Mihomo 本身提供 Controller API,但不自带传统意义上的管理页面。
这里使用 MetaCubeXD。
配置:
external-controller: 0.0.0.0:9090
external-ui: /etc/mihomo/ui
secret: "设置一个自己的密码"也可以让 Mihomo 自动下载:
external-ui: ui
external-ui-url: "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip"然后:
mihomo -t -d /etc/mihomosystemctl restart mihomo测试 API:
curl http://127.0.0.1:9090/version正常情况下会返回类似:
{ "meta": true, "version": "1.19.30"}测试 WebUI:
curl -I http://127.0.0.1:9090/ui/应该返回:
HTTP/1.1 200 OK如果希望通过 Tailscale 使用,可以:
external-controller: 0.0.0.0:9090最终网络结构
flowchart TD A[Ubuntu Server] A --> B[Private Network] B --> C[Docker / LAN] B --> D[Tailscale / SSH] C --> E[不进入 TUN] D --> E A --> F[Internet] F --> G[Mihomo TUN] G --> H[Rule Engine] H --> I[DIRECT] H --> J[Proxy] J --> K[自动选择节点]
管理面则是:
flowchart TD A[Mac] -->|Tailscale| B[Ubuntu Server] B --> C[SSH] B --> D[9090/ui/] D --> E[MetaCubeXD]
参考资料
- mihomo
- sublink pro
- Clash Verge的拓展脚本 (yaml 配置是通过这个脚本进行转写的,具体二开配置来源有点找不到了。)