Впервые (на самом деле не совсем) пишу статью одновременно как пользователь и разработчик продукта:
Это HomeProxy-hiddify - форк проекта ImmortalWRT - HomeProxy, но использующий ядро hiddify-core вместо sing-box
Результат моей работы - графическая надстройка для hiddify-core позволяющая настроить подключение к NaiveProxy, Mieru, ShadowTLS, Hysteria2, XRay, VLESS (XHTTP), VMESS, Trojan, TUIC и иным протоколам которые поддерживает Hiddify App в т.ч. с помощью подписок (subscription). Основное отличие hiddify-core на сегодняшний день это поддержка дополнительных протоколов прокси и функций клиента Hiddify App вроде фрагментации TLS. Также сделан полный перевод на русский язык.
Отвечая на вопрос "А зачем это всё? Есть же тот же Podkop? V2RayA? оригинальный HomeProxy в конце концов":
в Подкопе мне очень не хватило подписок, т.к. в основном пользуюсь сервисами и серверами (вроде Hiddify Manager) механизм распространения доступа которых - ссылка subscription
V2RayA хоть и достаточно надежен ограничен xray-core, и одним активным подключением к прокси - в условиях активных блокировок рассчитывать только на одно подключение становится недостаточно
HomeProxy в целом хорош, но UI довольно ограничен, не имеет возможности использовать текстовую конфигурацию, а при использовании только sing-box нужен отдельный которая будет перенаправлять в него трафик
Зная о существовании hiddify-core (он же Hiddify-cli) возникло желание совместить хорошую оболочку с перспективным ядром (к сожалению имеющим довольно скудную документацию), заодно пришлось решить проблему с ipk/apk пакетами, так как сам hiddify выпускает только бинарные файлы и так получился HomeProxy-hiddify
В данной статье будет рассматриваться установка пакетов luci-app-homeproxy-hiddify и hiddify-core на примере OpenWRT 24.10.5 (поддерживаются версии 24.10, 25.12 и выше, экспериментально - до 23.05).
Также настроим раздельную маршрутизацию на примере списков Re:filter, но могут использоваться любые .srs, .json и текстовые списки . Конфигурация одна из самых простых, но проверенных мной на практике
Можно использовать как чистую версию OpenWRT так и от проекта ImmortalWRT.
Потребуется роутер со свободными 70 Мб памяти и минимум 256 Мб ОЗУ (Работающий HomeProxy-hiddify занимает от 70Мб ОЗУ).
Оглавление:
Предисловие
1. Установка luci-app-homeproxy-hiddify
2. Настройка homeproxy-hiddify
3. Дополнительные настройки Homeproxy
4. Пользовательский JSON
1. Установка hiddify-core и luci-app-homeproxy-hiddify
Для начала необходимо установить сам hiddify-core достаточно установить ipk файл, для версий с OPKG ( до OpenWRT 24.10 включительно):
wget -O /tmp/hiddify-core.ipk "https://github.com/1andrevich/hiddify-core/releases/latest/download/hiddify-core_$(. /etc/os-release; echo "$OPENWRT_ARCH").ipk" opkg update opkg install /tmp/hiddify-core.ipk
После чего устанавливаем luci-app-homeproxy-hiddify вместе с языковым пакетом:
wget -O /tmp/luci-app-homeproxy-hiddify.ipk "$(wget -qO- 'https://api.github.com/repos/1andrevich/homeproxy-hiddify/releases' | grep -o 'https://github\.com/[^"]*luci-app-homeproxy-hiddify[^"]*\.ipk' | head -1)" wget -O /tmp/luci-i18n-homeproxy-ru.ipk "$(wget -qO- 'https://api.github.com/repos/1andrevich/homeproxy-hiddify/releases' | grep -o 'https://github\.com/[^"]*luci-i18n-homeproxy-ru[^"]*\.ipk' | head -1)" opkg install /tmp/luci-app-homeproxy-hiddify.ipk opkg install /tmp/luci-i18n-homeproxy-ru.ipk

После установки рекомендую запустить команду:
/etc/init.d/rpcd restart
Для версий с Alpine APK ( OpenWRT 25.12 и выше):
wget -O /tmp/homeproxy-hiddify.pub https://github.com/1andrevich/homeproxy-hiddify/releases/latest/download/homeproxy-hiddify.pub cp /tmp/homeproxy-hiddify.pub /etc/apk/keys/ wget -O /tmp/hiddify-core.apk "https://github.com/1andrevich/hiddify-core/releases/latest/download/hiddify-core_$(. /etc/os-release; echo "$OPENWRT_ARCH").apk" apk update apk add /tmp/hiddify-core.apk
Далее luci-app-homeproxy-hiddify вместе с языковым пакетом:
wget -O /tmp/homeproxy-hiddify.pub https://github.com/1andrevich/homeproxy-hiddify/releases/latest/download/homeproxy-hiddify.pub cp /tmp/homeproxy-hiddify.pub /etc/apk/keys/ wget -O /tmp/luci-app-homeproxy-hiddify.apk "$(wget -qO- 'https://api.github.com/repos/1andrevich/homeproxy-hiddify/releases' | grep -o 'https://github\.com/[^"]*luci-app-homeproxy-hiddify[^"]*\.apk' | head -1)" wget -O /tmp/luci-i18n-homeproxy-ru.apk "$(wget -qO- 'https://api.github.com/repos/1andrevich/homeproxy-hiddify/releases' | grep -o 'https://github\.com/[^"]*luci-i18n-homeproxy-ru[^"]*\.apk' | head -1)" apk add /tmp/luci-app-homeproxy-hiddify.apk apk add /tmp/luci-i18n-homeproxy-ru.apk
После установки:
/etc/init.d/rpcd restart
Если вы обладатель мощного устройства с ограниченным объёмом памяти без возможности расширения, вроде Mercusys MR90X, то можете воспользоваться релизом с пакетами со сжатыми бинарными файлами (16Мб против 26Мб у обычного), но возможны неожиданные баги при их использовании.
Если используете версию OpenWRT 23.05 то устанавливайте ipk версию hiddify-core и legacy версию luci-app-homeproxy-hiddify
Если установка прошла успешно, переходим к настройке.
2. Настройка Homeproxy-hiddify
На примере русскоязычного интерфейса
Переходим в раздел Службы - Homeproxy-Hiddify

Откроется страница по умолчанию:

Сперва нужно добавить сервер, для этого переходим во вкладку Настройки узлов - Узлы

Нажимаем Импортировать ссылки для совместного использования для добавления
статичной конфигурации VLESS, Trojan или иной:

После добавления нажимаем Импорт

Применяем изменения.
Для добавления подписки (Subscription) открываем вкладку Подписки

Обновить через прокси - Обновление подписок через прокси (Включать только после настройки HomeProxy-Hiddify)
Фильтровать узлы - Режим черного списка - исключаются только ссылки из фильтра, остальные добавляются, при необходимости меняется на Режим белого списка
Перед скачиванием списка прокси из подписки нажимаем Сохранить текущие настройки - для применения изменений
После чего обновляем подписки - Обновить N подписок

После этого убеждаемся что количество нод из подписки отобразилось внизу страницы:

Если по какой-то причине обновление подписок не происходит, запустите консольную команду и обновите страницу
uc /etc/homeproxy/scripts/update_subscriptions.uc
Далее переходим к настройкам подключения:
Для раздельного туннелирования выбираем режим Режим маршрутизации — Пользовательская маршрутизация - проксирование подключений согласно правилам (hiddify, Sing-box Rule-set).


Для направления всего трафика через Главный узел можно выбрать Глобальный режим (большой расход трафика и шанс быстрее засветить подключение), также я добавил режим Пользовательский JSON, о нём расскажу в конце статьи.
upd 22.05.26 Порты маршрутизации — Все порты - тогда HomeProxy сможет использовать правила для управления трафиком портов, при выборе Общие порты - в правила nft будут прописаны только они и HomeProxy не сможет управлять другими портами, не указанными в списке, например VoIP - 50000-65535
Общие порты - 22,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418
их можно изменить в /etc/config/homeproxy
Режим прокси — Перенаправление TCP + TProxy UDP - оставляем параметр по умолчанию
Перенаправление TCP (перенаправление только TCP трафика, согласно правилам Homeproxy, а не основного firewall).
При установке ip-full и kmod-tun также доступны:
Перенаправление TCP + Tun UDP как Перенаправление TCP + TProxy UDP, но UDP трафик идёт через интерфейс singtun0 и регулируется основными правилами firewall.
Tun TCP/UDP — весь трафик идёт через интерфейс singtun регулируется правилами firewall
Поддержка IPv6 - рекомендую выключить т.к. большинство списков, включая Re:filter, пока не включают адресов IPv6
outbound по умолчанию - Напрямую - весь трафик не направленный правилами в прокси будет идти через шлюз по умолчанию
outbound DNS по умолчанию - DNS по умолчанию (от WAN) - используется для трафика не направляемого в прокси если нет иных правил DNS (при использовании MultiWAN лучше указывать конкретный DNS сервер из выпадающего списка)
Далее - Применяем изменения и переходим во вкладку Узлы маршрутизации

Внизу страницы добавляем новый элемент, можно назвать его proxy и нажимаем Добавить
само название не принципиально, но оно должно быть уникальным

Далее по параметрам:
Узел - URLTest
Узлы URLTest - выбираем нужные из выпадающего списка (ранее добавляли через Subscriptions и статичные конфигурации)
URL для теста - это страница для тестирования подключения к прокси, я использую эти captive portal:
http://captive.apple.com/hotspot-detect.html
http://www.gstatic.com/generate_204
Но можно использовать любой Captive Portal
можно использовать настройки по умолчанию:
Test interval - 180 сек - каждая нода через заданный промежуток (180 сек) будет протестирована на доступность и величину задержки
Test tolerance - 50 мс - разница в задержке прокси при которой будет произведено переключение, например у активного прокси 327 мс, если у другого задержка будет ниже 277 мс - hiddify-core сделает активным его
Idle timeout - 1800 сек - если не было сетевой активности на прокси в течении заданного промежутка, проверка нод приостановится (для снижения нагрузки) до возобновления активности
Сохраняем - Применяем изменения
Переходим во вкладку Набор правил

На примере Re:filter
Добавляем 1ый набор правил - ipsum:

Тип - Удаленный - регулярное скачивание списка по ссылке, альтернативно можно использовать Локальный
Формат - Бинарный файл - использование формата srs, также можно использовать json при выборе Исходный файл
URL набора правил - https://github.com/1andrevich/Re-filter-lists/releases/latest/download/ruleset-ip-refilter_ipsum.srs - srs список заблокированных подсетей refilter_ipsum
Outbound - proxy - скачивание списков через выбранный outbound - прокси
Интервал обновления - 1d - для регулярного скачивания списков, например 1 день , ставьте по вашему усмотрению
Сохраняем и добавляем 2ой набор правил - domains:

Аналогично:
Тип - Удаленный - регулярное скачивание списка по ссылке, альтернативно можно использовать Локальный
Формат - Бинарный файл - использование формата srs, также можно использовать json при выборе Исходный файл
URL набора правил - https://github.com/1andrevich/Re-filter-lists/releases/latest/download/ruleset-domain-refilter_domains.srs - srs список заблокированных доменов refilter_domains
Outbound - proxy - скачивание списков через выбранный outbound - прокси
Интервал обновления - 1d - для регулярного скачивания списков, например 1 день , ставьте по вашему усмотрению

Сохраняем - Применяем изменения
Переходим к Правилам маршрутизации:

Добавляем первое правило - refilter_ipsum (Направление IP адресов из списка в прокси):

Версия IP - IPv4
Набор правил - ipsum - выбираем из выпадающего списка
Outbound - proxy
Сохранить
Добавляем второе правило - refilter_domains (Направление доменов из списка в прокси):


Протокол - (из списка) HTTP, QUIC, TLS, STUN
Набор правил - domains
Outbound - proxy
Сохранить - Применить изменения
После применения изменений раздельная маршрутизация уже должна работать, но для полноценной работы VoIP трафика (Telegram, WhatsApp, Discord, Viber) нужны дополнительные правила для портов и настройка DNS для избежания утечки DNS


Сперва добавляем правило для UDP портов:


Метка - Calls UDP - может быть любая, не обязательно совпадает с названием правила
Сеть - UDP
Outbound - proxy
Далее переходим во вкладку - Поля портов

Порт - 1400 и 8443
Диапазон портов - 50000:65535 596:599 3478:3497 16384:16387 16393:16402 - каждый диапазон через двоеточие, это диапазоны для работы звонков Whatsapp, Viber, Facetime, Telegram и Discord, ранее писал об этом в статье по V2RayA
Сохраняем и создаём ещё одно правило для TCP+UDP портов:


Метка - TCP+UDP Ports
Outbound - proxy
Далее переходим во вкладку - Поля портов

Порт - 4244 7985 5222 5223 5242 5243 - Для работы WhatsApp и Viber
Сохраняем - Применяем изменения

Альтернативным способом создания правил является редактирование файла настроек - можно вставить этот набор правил в конец файла, главное проверить совпадение названия outbound, если вы вдруг назвали его не "proxy" или имеете несколько outbound для прокси
/etc/config/homeproxy:
config routing_rule 'refilter_ipsum' option label 'refilter_ipsum' option enabled '1' option mode 'default' option ip_version '4' list rule_set 'ipsum' option outbound 'proxy' config routing_rule 'refilter_domains' option label 'refilter_domains' option enabled '1' option mode 'default' list protocol 'http' list protocol 'quic' list protocol 'tls' list rule_set 'domains' option outbound 'proxy' config routing_rule 'udp' option label 'Calls UDP' option enabled '1' option mode 'default' option network 'udp' option outbound 'proxy' list port '1400' list port '8443' list port_range '50000:65530' list port_range '596:599' list port_range '3478:3497' list port_range '16384:16387' list port_range '16393:16402' config routing_rule 'tcp_udp' option label 'TCP+UDP Ports' option enabled '1' option mode 'default' option outbound 'proxy' list port '4244' list port '7985' list port '5222' list port '5223' list port '5242' list port '5243'
Теперь к настройке DNS:
без прописанных DNS-правил HomeProxy использует DNS-outbound по умолчанию, для избежания утечки DNS и подмен укажем сначала два DNS сервера, для proxy и для работы напрямую

Добавим сначала Яндекс DNS сервера с названием dns_direct во вкладке DNS-серверы:


Тип - UDP - Также доступны варианты UDP, TCP, QUIC, HTTP/3, TLS
Адрес - 77.88.8.1 (можно также указать например провайдерский DNS сервер)
Порт - авто
Резолвер адресов - Отсутствует (т.к. указан IP адрес)
Outbound - Напрямую
Теперь добавим Google DNS сервер с названием dns_proxy:


Тип - HTTPS - Также доступны варианты UDP, TCP, QUIC, HTTP/3, TLS
Адрес - dns.google
Порт - авто
Path -/dns-query
Резолвер адресов - dns_direct (для избежания потенциальных проблем с настройкой DNS и доступен к сторонним DNS серверам в т.ч. на белых списках)
Стратегия адресации - Предпочитать IPv4
Outbound - proxy
Применяем изменения
Теперь добавим правило dns_out для проксируемых доменов во вкладке DNS-правила:


Действие - Маршрут
Сервер - dns_proxy
Стратегия доменов - Предпочитать IPv4
Сохранить

Это правило будет выполняться для доменов из списка domains из набора правил, для прочих укажем правило по умолчанию на вкладке Настройки DNS:

Стратегия DNS по умолчанию - Предпочитать IPv4
DNS-сервер по умолчанию - dns_direct
Сохранить и применить изменения
На вкладке Статус службы можно посмотреть логи HomeProxy и hiddify-core, выбрать степень логгирования (log level)


3. Дополнительные настройки Homeproxy
в меню Контроль доступа есть вкладки:
Управление интерфейсами - Здесь настраивается входной и выходной интерфейс, по умолчанию остаётся пустым и определяется автоматически
О решении проблем с Multi-WAN здесь

в Политике IP для LAN:

Режим фильтрации прокси — имеет опции:
Проксировать только указанные — проксирует трафик только для IP/MAC из списка.
Проксировать всё кроме указанных — проксирует трафик для всех, кроме IP/MAC из списка.
Также можно указать IPv4, IPv6 и MAC адреса локальных устройства для игрового режима - для них не будет проксироваться UDP трафик
Также в Homeproxy есть возможность указать дополнительные inbound на вкладке Настройки сервера:


Можно выбрать протокол, адрес и порт на котором сервер будет слушать подключения, в зависимости от протокола - логин и пароль для подключения, в качестве примера смешанный HTTP/SOCKS5 прокси на 127.0.0.1 и порту 20170

Если вы выбрали Tun TCP/UDP необходимо перейти в раздел Сеть - Межсетевой Экран -

Добавить новый интерфейс.

Выбрать Протокол неуправляемый, из списка устройств singtun0, присвоить название, например Proxy и Создать интерфейс.
После чего перейти в настройки интерфейса singtun0 (Изменить)

Настройки межсетевого экрана — wan (или нужный вам вариант).
4. Пользовательский JSON
Это новый режим, которого нет в оригинальном HomeProxy, если вы хотите использовать текстовую конфигурацию, вы можете разместить его в /etc/homeproxy/hiddify-c.json и выбрать Пользовательский JSON в Режимах Маршрутизации
Если вы хотите направлять пользовательский трафик через Redirect и TProxy используя правила межсетевого экрана HomeProxy, то нужно будет добавить в конфигурацию следующие параметры:
"inbounds": [ { "type": "direct", "tag": "dns-in", "listen": "::", "listen_port": 5333 }, { "type": "mixed", "tag": "mixed-in", "listen": "::", "listen_port": 5330, "udp_timeout": "300s", "sniff": true, "sniff_override_destination": true, "set_system_proxy": false }, { "type": "redirect", "tag": "redirect-in", "listen": "::", "listen_port": 5331, "sniff": true, "sniff_override_destination": true }, { "type": "tproxy", "tag": "tproxy-in", "listen": "::", "listen_port": 5332, "network": "udp", "udp_timeout": "300s", "sniff": true, "sniff_override_destination": true } ]
Также нужно добавить меткуdefault_mark в секции route для предотвращения петель маршрутизации tproxy. Без него собственный исходящий трафик hiddify-core перехватывается правилами nftables и снова направляется в прокси. Значение должно совпадать с self_mark в /etc/config/homeproxy (по умолчанию: 100):
"route": { "default_mark": 100, ... }
В отличии от sing-box, hiddify-core по неизвестной причине не поддерживает routing_mark для каждого outbound
Информация о HomeProxy-Hiddify также есть в вики проекта
Спасибо всем кто дочитал до конца, надеюсь этот проект будет вам полезен
Завёл также, с опозданием на много лет, телеграм канал Telegram: View @one_andrevich