Перейти к содержимому
RU

Главная / Блог / Развёртывание

Mihomo как домашний шлюз — прозрачное проксирование на софт-роутере или NAS

Развёртывание2026-06-051632 слов4 мин чтения
Mihomo как домашний шлюз — прозрачное проксирование на софт-роутере или NAS

Ставить клиент на каждое устройство утомительно, а телевизоры, проекторы и IoT-устройства этого вовсе не умеют. Разверните Mihomo на софт-роутере или NAS — и всё, что подключено к Wi-Fi, покрыто автоматически.

Три способа подключения

КомпромиссыБоковой роутер с ручным шлюзомменяете шлнаименьший риск, сбой затрагивает только это устройствокаждое устройство настраивается отдельнорекомендуется для первой попыткиПрозрачное проксирование TProxyперенаправнулевая настройка устройствсложно, и ошибка уводит весь дом в офлайнTUN с auto-routeвключаете просто настраиваетсявыше накладные расходы, процессор софт-роутера может не потянуть
Сначала добейтесь работы с вручную указанным боковым роутером, а потом решайте, нужен ли прозрачный прокси

Основная линия этой статьи — боковой роутер плюс 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,FINAL

3. Служба 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 -f

4. Подход А: указать шлюз вручную (начните с этого)

Не трогайте никакие правила брандмауэра; на устройствах, которым нужен прокси, поменяйте:

  • Шлюз: на адрес софт-роутера (скажем, 192.168.1.2)
  • DNS: тоже 192.168.1.2
Где стоит боковой роутерУстройствошлюз указывает на боковой роутерБоковой роутер с Mihomoобрабатывает по правиламОсновной роутерподнимает соединение с интернетомИнтернетУстройства, которые вы не трогали, идут прежним путём и не затрагиваются
Главный плюс: когда что-то ломается, всё остальное продолжает работать

Сила этого подхода — отказоустойчивость: если 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. Отказоустойчивость: не злите домашних

Самый важный раздел для домашнего развёртывания.

Меры, которые не опциональныПоставьте Restart=always в systemd, чтобы умерший процесс возвращалсяИспользуйте -t в ExecStartPre, чтобы сломанная конфигурация никогда не стартовалаПусть скрипт обновления подписки качает во временный файл, проверяет и только потом заменяетДержите одно устройство, не проходящее через боковой роутер, чтобы было где искать решение при поломкеПропишите в DHCP основного роутера два DNS: боковой роутер плюс публичный резолвер как запаснойДайте важным устройствам (телефону родственника, рабочему ноутбуку) правило SRC-IP-CIDR со значением DIRECT

Безопасный скрипт обновления подписки

#!/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. Производительность и ресурсы

Примерная ёмкость разного железа (ориентировочно)Raspberry Pi 4Bпорядка 100 МбитСофт-роутер на J4125фактически насыщает гигабитСофт-роутер на N100гигабит без усилийСтарые одноядерные устройствазаметно страдают на больших наборах правилРеальная ёмкость зависит от размера наборов правил, числа соединений и протокола; воспринимайте это только как ориентир при выборе

В каком порядке оптимизировать, когда производительности не хватает:

  1. Проредить наборы правил (выбросить стриминговые и рекламные списки, которыми вы не пользуетесь)
  2. Перевести наборы правил в бинарный формат mrs
  3. Поставить log-level в warning, ни в коем случае не debug
  4. Снизить частоту health-check
  5. 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 и веб-панели и управление несколькими подписками.


Смежные документы

Как подключить Docker и WSL2 к Clash на хосте
Развёртывание Как подключить Docker и WSL2 к Clash на хосте

127.0.0.1 внутри контейнера — это не хост. Настройка для всех трёх сценариев Docker (загрузка образов демоном, сборка, запуск) плюс два подхода для разных режимов сети WSL2.

2026-06-141187 слов3 мин чтения
Шпаргалка по прокси для разработчика — Git, npm, pip, Go, Maven и SSH
Развёртывание Шпаргалка по прокси для разработчика — Git, npm, pip, Go, Maven и SSH

Справочная таблица, которую стоит сохранить. Команда для каждого инструмента, где лежит его файл настроек, как всё отменить и почему часть инструментов игнорирует переменные окружения.

2026-06-101206 слов3 мин чтения
Управляющий API Clash целиком — эндпойнты, панели и скрипты автоматизации
Развёртывание Управляющий API Clash целиком — эндпойнты, панели и скрипты автоматизации

Полный RESTful API, который открывает external-controller: переключение узлов, просмотр соединений, перезагрузка конфигурации, развёртывание веб-панели и несколько практичных скриптов.

2026-06-011194 слов3 мин чтения