Ставить клиент на каждое устройство утомительно, а телевизоры, проекторы и IoT-устройства этого вовсе не умеют. Разверните Mihomo на софт-роутере или NAS — и всё, что подключено к Wi-Fi, покрыто автоматически.
Три способа подключения
Основная линия этой статьи — боковой роутер плюс TProxy, самая практичная комбинация для дома.
1. Установка Mihomo
На примере софт-роутера или NAS с Linux amd64:
# скачать и распаковать (архитектуру подобрать по факту)
gunzip mihomo-linux-amd64-v1.19.29.gz
chmod +x mihomo-linux-amd64-v1.19.29
sudo mv mihomo-linux-amd64-v1.19.29 /usr/local/bin/mihomo
mihomo -v
# подготовить рабочий каталог
sudo mkdir -p /etc/mihomoУстройствам на ARM (Raspberry Pi, ARM-NAS) нужна сборка linux-arm64; uname -m с выводом aarch64 означает именно её.
2. Файл конфигурации
/etc/mihomo/config.yaml:
# ===== базовое =====
mixed-port: 7890
tproxy-port: 7895 # для TProxy
redir-port: 7892 # для REDIRECT (по желанию)
allow-lan: true
bind-address: "*"
mode: rule
log-level: info
ipv6: false
unified-delay: true
tcp-concurrent: true
external-controller: 0.0.0.0:9090
secret: "задайте достаточно длинный случайный пароль"
external-ui: /etc/mihomo/ui
# ===== DNS =====
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.home.arpa"
- "+.pool.ntp.org"
- "time.*.com"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "captive.apple.com"
default-nameserver: [223.5.5.5, 119.29.29.29]
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- https://1.1.1.1/dns-query
fallback-filter:
geoip: true
geoip-code: CN
# ===== откуда берутся узлы =====
proxy-providers:
main:
type: http
url: "адрес вашей подписки"
interval: 3600
path: ./providers/main.yaml
header:
User-Agent: ["clash.meta"]
exclude-filter: "(?i)remaining|expire|website|traffic"
health-check:
enable: true
url: http://www.gstatic.com/generate_204
interval: 300
lazy: true
# ===== группы политик =====
proxy-groups:
- name: "PROXY"
type: select
proxies: ["AUTO", "HK", "JP", "SG", DIRECT]
- name: "AUTO"
type: url-test
use: [main]
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
lazy: true
- name: "HK"
type: url-test
use: [main]
filter: "(?i)HK|Hong ?Kong"
interval: 300
tolerance: 50
- name: "JP"
type: url-test
use: [main]
filter: "(?i)JP|Japan"
interval: 300
tolerance: 50
- name: "SG"
type: url-test
use: [main]
filter: "(?i)SG|Singapore"
interval: 300
tolerance: 50
- name: "FINAL"
type: select
proxies: ["PROXY", DIRECT]
# ===== правила =====
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- DOMAIN-SUFFIX,lan,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
# маршрутизация по устройствам (примеры)
- SRC-IP-CIDR,192.168.1.50/32,DIRECT # телефон родственника остаётся прямым
- SRC-IP-CIDR,192.168.1.60/32,PROXY # телевизор всегда через прокси
# обычная маршрутизация
- GEOIP,CN,DIRECT
- MATCH,FINAL3. Служба systemd
/etc/systemd/system/mihomo.service:
[Unit]
Description=Mihomo Daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
LimitNOFILE=1000000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
Restart=always
RestartSec=5
ExecStartPre=/usr/local/bin/mihomo -t -d /etc/mihomo
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
[Install]
WantedBy=multi-user.target-t в ExecStartPre — это проверка конфигурации: сломанная конфигурация тогда просто не запускается, а не роняет работающую службу, и эта мелочь экономит уйму нервов.
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
sudo systemctl status mihomo
journalctl -u mihomo -f4. Подход А: указать шлюз вручную (начните с этого)
Не трогайте никакие правила брандмауэра; на устройствах, которым нужен прокси, поменяйте:
- Шлюз: на адрес софт-роутера (скажем,
192.168.1.2) - DNS: тоже
192.168.1.2
Сила этого подхода — отказоустойчивость: если Mihomo умрёт, пострадают только устройства, которые вы меняли, а остальные в доме ничего не заметят.
5. Подход Б: прозрачное проксирование через TProxy
Нулевая настройка устройств ценой правил брандмауэра на шлюзе.
Включить форвардинг в ядре
sudo tee /etc/sysctl.d/99-mihomo.conf > /dev/null <<'EOF'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
EOF
sudo sysctl --systemПравила iptables
#!/bin/bash
# /etc/mihomo/tproxy.sh
TPROXY_PORT=7895
ROUTE_TABLE=100
FWMARK=1
# политика маршрутизации: помеченные пакеты идут в локальную таблицу
ip rule add fwmark $FWMARK table $ROUTE_TABLE 2>/dev/null
ip route add local default dev lo table $ROUTE_TABLE 2>/dev/null
# собственная цепочка
iptables -t mangle -N MIHOMO 2>/dev/null
iptables -t mangle -F MIHOMO
# приватные и зарезервированные диапазоны пропускаем нетронутыми
for net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \
172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do
iptables -t mangle -A MIHOMO -d $net -j RETURN
done
# всё остальное помечаем и отдаём порту TProxy
iptables -t mangle -A MIHOMO -p tcp -j TPROXY --on-port $TPROXY_PORT --tproxy-mark $FWMARK
iptables -t mangle -A MIHOMO -p udp -j TPROXY --on-port $TPROXY_PORT --tproxy-mark $FWMARK
# применяем к пересылаемому трафику (от других устройств)
iptables -t mangle -A PREROUTING -j MIHOMO
# перехват DNS: перенаправляем запросы на порт 53 в Mihomo
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 1053
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 1053Скрипт очистки:
#!/bin/bash
# /etc/mihomo/tproxy-clear.sh
iptables -t mangle -D PREROUTING -j MIHOMO 2>/dev/null
iptables -t mangle -F MIHOMO 2>/dev/null
iptables -t mangle -X MIHOMO 2>/dev/null
iptables -t nat -F PREROUTING 2>/dev/null
ip rule del fwmark 1 table 100 2>/dev/null
ip route del local default dev lo table 100 2>/dev/nullПривяжите правила к systemd, чтобы они появлялись и исчезали вместе со службой:
[Service]
ExecStartPost=/etc/mihomo/tproxy.sh
ExecStopPost=/etc/mihomo/tproxy-clear.shКак заставить устройства этим пользоваться
В настройках DHCP основного роутера укажите шлюзом по умолчанию и DNS-сервером адрес софт-роутера. Устройства подхватят это после переподключения к Wi-Fi.
6. Отказоустойчивость: не злите домашних
Самый важный раздел для домашнего развёртывания.
Безопасный скрипт обновления подписки
#!/bin/bash
# /usr/local/bin/update-mihomo.sh
set -euo pipefail
CONF=/etc/mihomo/config.yaml
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
curl -fsSL --max-time 30 -A "clash.meta" -o "$TMP" "адрес вашей подписки"
# базовая проверка вменяемости
grep -q "^proxies:\|^proxy-providers:" "$TMP" || { echo "содержимое подписки выглядит неверно"; exit 1; }
# пусть mihomo тоже проверит
cp "$CONF" "${CONF}.bak"
cp "$TMP" "$CONF"
if mihomo -t -d /etc/mihomo; then
systemctl restart mihomo
echo "обновлено"
else
cp "${CONF}.bak" "$CONF"
echo "проверка не прошла, откатились"
exit 1
fiДобавьте в cron:
0 4 * * * /usr/local/bin/update-mihomo.sh >> /var/log/mihomo-update.log 2>&1С proxy-provider этот скрипт вам, по сути, не нужен — ядро само подтягивает узлы по расписанию, а основная конфигурация не меняется никогда. Это важная причина предпочесть провайдер целой подписке.
7. Веб-панель
external-ui: /etc/mihomo/ui
external-ui-name: metacubexdПоложите файлы панели в /etc/mihomo/ui, затем откройте в браузере http://ip-роутера:9090/ui, введите secret — и можно переключать узлы, смотреть соединения и читать логи с веб-страницы.
Остальные домашние тоже смогут переключать узлы через эту страницу, не обращаясь к вам.
8. Производительность и ресурсы
В каком порядке оптимизировать, когда производительности не хватает:
- Проредить наборы правил (выбросить стриминговые и рекламные списки, которыми вы не пользуетесь)
- Перевести наборы правил в бинарный формат mrs
- Поставить
log-levelвwarning, ни в коем случае неdebug - Снизить частоту
health-check - TProxy расходует меньше ресурсов, чем TUN, — предпочитайте TProxy
9. Диагностика
# состояние службы
systemctl status mihomo
journalctl -u mihomo -n 100 --no-pager
# что слушает
ss -tulnp | grep mihomo
# отвечает ли API
curl -H "Authorization: Bearer ваш-secret" http://127.0.0.1:9090/version
# проверить прокси-порт с другого устройства
curl -x http://192.168.1.2:7890 -I https://www.google.com
# счётчики срабатываний правил iptables
iptables -t mangle -L MIHOMO -v -nКоротко
- Сначала добейтесь работы связки «боковой роутер плюс ручной шлюз», и только когда всё стабильно, переходите к TProxy
- secret обязателен;
0.0.0.0:9090открыт всей вашей локальной сети - Берите proxy-provider, а не целую подписку, чтобы ядро обновлялось само, а основная конфигурация не двигалась
- Добавьте
-tв ExecStartPre, чтобы сломанная конфигурация не вытеснила работающую службу - Дайте важным устройствам прямое правило SRC-IP-CIDR, чтобы домашние не пострадали
- Прежде чем трогать TProxy, запланируйте автоматическую очистку — оставьте себе путь назад
Смотрите также: управляющий API и веб-панели и управление несколькими подписками.
Смежные документы
127.0.0.1 внутри контейнера — это не хост. Настройка для всех трёх сценариев Docker (загрузка образов демоном, сборка, запуск) плюс два подхода для разных режимов сети WSL2.
Справочная таблица, которую стоит сохранить. Команда для каждого инструмента, где лежит его файл настроек, как всё отменить и почему часть инструментов игнорирует переменные окружения.
Полный RESTful API, который открывает external-controller: переключение узлов, просмотр соединений, перезагрузка конфигурации, развёртывание веб-панели и несколько практичных скриптов.