Hiddify через mihomo - настройка цепочки#
Типичный сценарий: Hiddify стоит на ноде в стране A, но клиентам нужен выход через ноду в стране B. Решение - поднять рядом mihomo с SOCKS-инбаундом, в котором настроена цепочка через зарубежный сервер, и направить outbound singbox/xray на этот локальный SOCKS.
Что нужно#
hiddify-managerуже работает в/opt/hiddify-manager/.mihomoподнят и слушает SOCKS на127.0.0.1:7890(или7891). Проверка:ss -tlnp | grep -E ':7890|:7891'. Готовый настроенный mihomo (установка, конфиг, цепочка) можно взять из проекта mihomo-cascade.- IPv6 отключен через sysctl (см. Отключение IPv6 на Debian/Ubuntu) - mihomo сам это распознает и не пытается включить TUN auto-route.
Шаги#
Шаг 1. Бэкап#
cp /opt/hiddify-manager/singbox/configs/06_outbounds.json{,.bak}
cp /opt/hiddify-manager/singbox/configs/06_outbounds.json.j2{,.bak}
cp /opt/hiddify-manager/xray/configs/06_outbounds.json{,.bak}
cp /opt/hiddify-manager/xray/configs/06_outbounds.json.j2{,.bak}
Шаг 2. Переписать singbox-outbounds#
В 06_outbounds.json заменить блок freedom на SOCKS к mihomo:
{
"tag": "freedom",
"type": "socks",
"version": "5",
"server": "127.0.0.1",
"server_port": 7890,
"udp_over_tcp": false
}
Шаблон .j2 править параллельно - иначе следующий рендер затрет .json.
Шаг 3. Переписать xray-outbounds#
В 06_outbounds.json старый freedom ("protocol": "freedom") переименовать в direct, а на его место поставить SOCKS:
{
"tag": "freedom",
"protocol": "socks",
"settings": {
"servers": [{ "address": "127.0.0.1", "port": 7890 }]
}
}
Шаблон .j2 править параллельно.
Шаг 4. Перезапуск#
Проверка#
Четыре проверки, каждая ловит свою категорию ошибок.
# 1. Hiddify подключен к mihomo
ss -tnp | grep ':7890' | grep -E 'hiddify-core|xray'
# 2. Реальный IP сервера
curl -s --max-time 8 https://api.ipify.org
# 3. IP через mihomo напрямую
curl -s --max-time 12 --socks5-hostname 127.0.0.1:7890 https://api.ipify.org
# 4. IP через hiddify-инбаунд (главная проверка)
# найти локальный socks-инбаунд hiddify
ss -tlnp | grep -E 'hiddify-core|xray'
# дальше курлить через него
curl -s --max-time 12 --socks5-hostname 127.0.0.1:<port> https://api.ipify.org
Ожидание: IP из шага 4 совпадает с IP из шага 3 (это exit mihomo) и НЕ совпадает с шагом 2 (реальный IP сервера).
Чтобы убедиться, что exit-IP цепочки действительно в нужной стране, пробейте его по гео - см. Как проверить, из какой страны реально выходит нода.
Почему правки сбрасываются#
Самый частый симптом: "настроил цепочку через mihomo, все работало, а через время отвалилось". Клиенты снова получают реальный IP сервера вместо exit'а mihomo, AI-сервисы возвращают ошибки доступа, мобильный Telegram (особенно звонки по UDP) перестает работать. Это не сетевой сбой - это hiddify-panel перерендерил конфиг из шаблона и затер вашу правку.
Механика: hiddify-panel периодически рендерит шаблоны *.json.j2 -> *.json. Итоговый 06_outbounds.json для движка - это результат рендера, а не первоисточник. Если поправить только .json, при следующем рендере (плановом, при apply_configs, при обновлении Hiddify) он будет перезаписан содержимым из .json.j2 - и правка исчезнет.
Поэтому всегда правится пара файлов:
- singbox:
/opt/hiddify-manager/singbox/configs/06_outbounds.jsonи06_outbounds.json.j2 - xray:
/opt/hiddify-manager/xray/configs/06_outbounds.jsonи06_outbounds.json.j2
Та же логика - в шагах 2 и 3 выше: править .json, не трогая .json.j2, бессмысленно, такая конфигурация живет только до ближайшего рендера.
Отдельный нюанс: если выход клиентов раньше шел через TUN auto-route на уровне ядра, неправильный 06_outbounds.json мог быть "не виден" - TUN перехватывал весь outbound до того, как singbox/xray доходили до своего outbound-этапа. Пара .json + .json.j2 при этом тоже не правилась, потому что от рендера нечего было защищать. После отключения TUN 06_outbounds.json становится критичным, и обновления Hiddify начинают периодически сбрасывать его в дефолт (freedom: direct). Вывод: при любом изменении режима mihomo первым делом проверяйте текущее содержимое 06_outbounds.json (cat ...), а не полагайтесь только на ss -tnp | grep :7890 - при TUN-режиме ESTAB-сокеты на 7890 могут отсутствовать, и это нормально. Надежная проверка - exit-IP через клиентские инбаунды (шаг 4 в разделе "Проверка").
Источники#
На основе опыта автора hiddify-faq.
Не помогло или есть уточняющий вопрос - заходите в русское сообщество @hiddify_rus.