Re:HomeProxy на OpenWrt: обход блокировок и гибкая маршрутизация: различия между версиями

Материал из wolfram
Перейти к навигации Перейти к поиску
Все команды разбиты на однострочные
Упрощён раздел установки, добавлены скриншоты
 
Строка 1: Строка 1:
= Re:HomeProxy на OpenWrt: обход блокировок и гибкая маршрутизация =
= Re:HomeProxy на OpenWrt: обход блокировок и гибкая маршрутизация =
Подробная пошаговая инструкция по развёртыванию '''Re:HomeProxy''' на чистом роутере с OpenWrt — от установки пакета до работающей выборочной маршрутизации. Рассчитана на пользователя, который умеет работать в терминале, но не знаком с внутренним устройством роутерных систем.
Пошаговая инструкция по установке '''Re:HomeProxy''' на роутер с OpenWrt — от чистой системы до работающего обхода блокировок. Рассчитана на пользователя, который умеет подключаться к роутеру по SSH.


Проверено на '''Xiaomi Redmi Router AX6000''' (<code>aarch64_cortex-a53</code>, mediatek/filogic) с '''OpenWrt 24.10.0'''. Подходит для любого устройства с OpenWrt 24.10 (opkg) или 25.12+ (apk).
Проверено на '''Xiaomi Redmi Router AX6000''' (<code>aarch64_cortex-a53</code>) с '''OpenWrt 24.10.0'''.


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Как читать команды в этой инструкции:''' каждая команда приведена '''отдельной строкой''' и выполняется самостоятельно — копируйте и вставляйте их по одной, дожидаясь завершения предыдущей. Ни одна команда не разбита переносами и не требует правки перед запуском, кроме тех, где явно указано, что нужно подставить своё значение.
'''Как читать команды:''' каждая команда приведена '''отдельной строкой''' и выполняется самостоятельно — копируйте и вставляйте их по одной, дожидаясь завершения предыдущей. Ничего править перед запуском не нужно, кроме мест, где это указано явно.
</div>
</div>


Строка 11: Строка 11:


== Что мы построим ==
== Что мы построим ==
Одна панель в LuCI, которая управляет всем стеком обхода блокировок: туннелем, списками маршрутизации и обходом DPI без VPN.
Одна панель в LuCI, которая управляет всем: туннелем, списками заблокированных ресурсов и обходом DPI.


{| class="wikitable"
{| class="wikitable"
Строка 17: Строка 17:
!Назначение
!Назначение
|-
|-
|'''Re:HomeProxy''' (<code>luci-app-re-homeproxy</code>)
|'''Re:HomeProxy'''
|Веб-панель в LuCI. Форк ImmortalWrt HomeProxy. Управляет узлами, списками маршрутизации, правилами доступа и обходом DPI. Сама по себе трафик не обрабатывает — генерирует конфигурацию для ядра и правила nftables.
|Веб-панель в LuCI. Управляет узлами, маршрутизацией и обходом DPI.
|-
|-
|'''sing-box-extended'''
|'''sing-box-extended'''
|Ядро (движок). Форк sing-box с расширенным набором протоколов: VLESS (в т.ч. REALITY, XHTTP), Hysteria2, Trojan, Shadowsocks, ShadowTLS, AnyTLS, WireGuard, AmneziaWG, '''Mieru''', '''NaïveProxy''', SSH и др.
|Ядро. Поддерживает VLESS (REALITY, XHTTP), Hysteria2, Trojan, Shadowsocks, AnyTLS, WireGuard, AmneziaWG, Mieru, NaïveProxy и др.
|-
|-
|'''Списки маршрутизации'''
|'''Списки маршрутизации'''
|Готовые наборы доменов и IP (Re-filter, Russia Inside, точечные по сервисам). Скачиваются ядром автоматически и обновляются раз в сутки.
|Готовые наборы доменов и IP (Re-filter, Russia Inside, отдельные сервисы). Обновляются автоматически раз в сутки.
|-
|-
|'''Zapret 2''' (<code>nfqws2</code>)
|'''Zapret 2'''
|Обход DPI без туннеля: искажает TLS-рукопожатие «на лету» через NFQUEUE. Подходит для замедленных, но не заблокированных сервисов — трафик идёт напрямую, минуя VPS.
|Обход DPI без туннеля для сервисов, которые не заблокированы, а замедлены (например, видеохостинги). Трафик идёт напрямую, не нагружая VPS.
|-
|'''ByeDPI''' (<code>ciadpi</code>)
|Альтернативный движок обхода DPI, работает как локальный SOCKS5-прокси. 47 пресетов стратегий и встроенный тестер.
|}
|}


=== Принцип работы ===
'''Принцип простой:''' списки решают, ''какой'' трафик особенный, а узел или Zapret ''через что'' его пустить. Всё, что не попало ни в один список, идёт напрямую.
В основе — разделение на две независимые оси:
 
* '''Списки''' решают, ''какой'' трафик особенный.
* '''Узел / Zapret / ByeDPI''' решают, ''через что'' его пустить.
 
Они комбинируются: каждое правило — это пара «список → способ доставки». Например, заблокированные РКН сайты идут через туннель, а замедленный YouTube — напрямую с лечением DPI, не нагружая VPS.


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
== Что понадобится ==
'''Примечание:''' Весь трафик LAN перехватывается через nftables (<code>redirect</code> для TCP, <code>tproxy</code> для UDP) и передаётся ядру. Ядро определяет домен по SNI из TLS-рукопожатия либо по DNS-ответу, сверяет со списками и выбирает маршрут. Всё, что не попало ни в один список, идёт напрямую.
</div>
 
----
 
== Требования ==
{| class="wikitable"
{| class="wikitable"
!Требование
!Требование
Строка 53: Строка 38:
|-
|-
|'''Роутер'''
|'''Роутер'''
|OpenWrt / ImmortalWrt '''24.10''' и новее (менеджер пакетов <code>opkg</code>) либо '''25.12''' и новее (<code>apk</code>). Для 23.05 в разделе Releases есть legacy-сборка с суффиксом <code>_all-legacy.ipk</code>.
|OpenWrt / ImmortalWrt '''24.10''' и новее (<code>opkg</code>) либо '''25.12''' и новее (<code>apk</code>)
|-
|'''Свободное место'''
|Минимум '''40 МБ''' на overlay при сжимающей файловой системе (ubifs/jffs2), либо '''90 МБ''' на несжимающей (ext4/f2fs). Основной объём — ядро.
|-
|'''Оперативная память'''
|От '''256 МБ'''. Ядро — крупное Go-приложение.
|-
|'''Архитектура'''
|Любая, для которой собран пакет ядра: aarch64 (cortex-a53/a72/a76, generic), x86_64, arm, mips/mipsel.
|-
|-
|'''Доступ'''
|'''Доступ'''
|Веб-интерфейс LuCI и SSH-доступ к роутеру.
|Веб-интерфейс LuCI и SSH к роутеру
|-
|-
|'''Узел (опционально)'''
|'''Узел'''
|Сервер с VLESS / Hysteria2 / Trojan / Mieru / NaïveProxy и т.п. Нужен только для туннеля — обход DPI через Zapret и ByeDPI работает и без него.
|Ссылка на ваш сервер: <code>vless://</code>, <code>hysteria2://</code>, <code>naive+https://</code>, <code>ss://</code> и т.п.
|}
|}
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
'''Внимание — как правильно оценить свободное место.''' Команда <code>df -h</code> показывает несколько разделов, и легко перепутать. Ориентироваться нужно '''только''' на строку с точкой монтирования <code>/overlay</code> (или <code>/</code>). Раздел <code>tmpfs</code>, смонтированный в <code>/tmp</code> — это '''оперативная память''' (обычно половина от объёма ОЗУ), а не хранилище: он очищается при перезагрузке и для установки не годится, хотя его размер часто выглядит самым внушительным в выводе.
</div>
=== Проверка перед установкой ===
Подключитесь к роутеру по SSH и выполните команды по очереди.
Версия OpenWrt и архитектура устройства:
<syntaxhighlight lang="bash">
cat /etc/openwrt_release
</syntaxhighlight>
Свободное место — смотреть строку с <code>/overlay</code> или <code>/</code>:
<syntaxhighlight lang="bash">
df -h
</syntaxhighlight>
Тип файловой системы overlay (<code>ubifs</code> и <code>jffs2</code> сжимают файлы, <code>ext4</code> и <code>f2fs</code> — нет):
<syntaxhighlight lang="bash">
mount | grep /overlay
</syntaxhighlight>
Объём оперативной памяти:
<syntaxhighlight lang="bash">
free -m
</syntaxhighlight>
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Уточнение про сжатие.''' На '''ubifs''' и '''jffs2''' файлы сжимаются прозрачно, и крупный бинарник ядра занимает примерно в 2–3 раза меньше своего номинального размера. Проверять реальный расход нужно по <code>df</code> '''до и после''' установки: команда <code>du</code> на этих ФС показывает логический размер файла, а не занятое место.
</div>


----
----


= Этап 1. Установка панели =
= Установка =


== 1.1. Зависимости ==
== Шаг 1. Установить панель ==
Панели требуются четыре пакета: <code>libc</code>, <code>firewall4</code>, <code>kmod-nft-tproxy</code>, <code>ucode-mod-digest</code>. В типовой сборке OpenWrt 24.10 первые три уже присутствуют.
Подключитесь к роутеру по SSH и выполните команды по очереди.


Обновить список пакетов:
Обновить список пакетов:
Строка 114: Строка 59:
</syntaxhighlight>
</syntaxhighlight>


Установить недостающее:
Установить зависимости:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
opkg install ucode-mod-digest kmod-nft-tproxy kmod-tun
opkg install ucode-mod-digest kmod-nft-tproxy kmod-tun
</syntaxhighlight>
</syntaxhighlight>
<code>kmod-tun</code> нужен, если планируется режим TUN; для базового режима <code>Redirect + TProxy</code> достаточно <code>kmod-nft-tproxy</code>.
== 1.2. Установка пакета ==
Пакет ставится не из штатных репозиториев, а из релизов проекта. Актуальную версию можно посмотреть на [https://github.com/1andrevich/homeproxy-hiddify/releases странице релизов] — в командах ниже она указана как <code>2026.06.29-r1</code>, при необходимости подставьте свою.


Перейти в каталог для загрузок:
Перейти в каталог для загрузок:
Строка 129: Строка 69:
</syntaxhighlight>
</syntaxhighlight>


Скачать пакет панели:
Скачать панель:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wget -O rhp.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-app-re-homeproxy_2026.06.29-r1_all.ipk
wget -O rhp.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-app-re-homeproxy_2026.06.29-r1_all.ipk
Строка 139: Строка 79:
</syntaxhighlight>
</syntaxhighlight>


Скачать русскую локализацию интерфейса:
Скачать русский язык интерфейса:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wget -O rhp-ru.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-i18n-homeproxy-ru_2026.06.29-r1_all.ipk
wget -O rhp-ru.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-i18n-homeproxy-ru_2026.06.29-r1_all.ipk
</syntaxhighlight>
</syntaxhighlight>


Установить локализацию:
Установить язык:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
opkg install /tmp/rhp-ru.ipk
opkg install /tmp/rhp-ru.ipk
Строка 150: Строка 90:


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Для OpenWrt 25.12 и новее''' в тех же ссылках замените расширение <code>.ipk</code> на <code>.apk</code>, а команду установки — на <code>apk add --allow-untrusted /tmp/rhp.apk</code>.
'''Актуальную версию''' пакета смотрите на [https://github.com/1andrevich/homeproxy-hiddify/releases странице релизов] — в командах указана <code>2026.06.29-r1</code>. Для OpenWrt 25.12 и новее замените в ссылках <code>.ipk</code> на <code>.apk</code>, а команду установки — на <code>apk add --allow-untrusted /tmp/rhp.apk</code>.
</div>
 
Сам пакет панели весит около '''650 КБ''' — основное место займёт ядро на следующем этапе.
 
== 1.3. Проверка ==
<syntaxhighlight lang="bash">
opkg list-installed | grep homeproxy
</syntaxhighlight>
 
После установки в LuCI появится раздел '''Сервисы → Re:HomeProxy'''. Если пункт меню не виден — обновите страницу с очисткой кэша (<code>Ctrl+F5</code>).
 
----
 
= Этап 2. Установка ядра =
Панель без ядра не работает: на её странице будет висеть красная надпись '''NOT RUNNING''', а в журнале — <code>No supported core found</code>.
 
== 2.1. Выбор ядра ==
{| class="wikitable"
!Ядро
!Особенности
|-
|'''hiddify-core'''
|Вариант по умолчанию. Ставится в один клик, есть компактная (UPX) сборка для устройств с малым объёмом флеш-памяти.
|-
|'''sing-box-extended'''
|Самый широкий набор протоколов: AmneziaWG / WARP, Mieru, NaïveProxy, TrustTunnel, MASQUE, Snell, MTProxy. '''Рекомендуется''', если нужны эти протоколы.
|}
 
== 2.2. Установка в один клик ==
В панели: '''Core & Tools''' (в русской локализации — '''Ядро и службы''') → выбрать ядро → '''Установить'''. Панель сама определит архитектуру, проверит свободное место, скачает и установит пакет.
 
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
'''Внимание — в OpenWrt-сборке sing-box-extended нет NaïveProxy.''' Пакет для OpenWrt собирается без флага <code>with_naive_outbound</code>, поэтому пункт '''NaïveProxy''' в списке типов узлов не появится, а попытка использовать такой узел даст ошибку <code>naive outbound is not included in this build</code>. Если NaïveProxy нужен — устанавливайте ядро вручную по инструкции ниже. Mieru в OpenWrt-сборке присутствует.
</div>
</div>


== 2.3. Ручная установка ядра с поддержкой NaïveProxy ==
== Шаг 2. Установить ядро ==
Вместо пакета для OpenWrt берётся ассет <code>linux-<арх>-musl</code> из того же релиза. Он собран с флагами <code>with_naive_outbound</code> и <code>with_musl</code>, библиотека cronet влинкована статически, поэтому дополнительных файлов не требуется. OpenWrt тоже построен на musl, и бинарник запускается как есть.
Ядро <code>sing-box-extended</code> ставится вручную — сборка из репозитория OpenWrt собрана без поддержки '''NaïveProxy''', поэтому берём универсальную musl-сборку, где есть все протоколы.
 
Актуальную версию и список файлов смотрите на [https://github.com/shtorm-7/sing-box-extended/releases странице релизов ядра]. В командах ниже используется версия <code>1.13.18-extended-2.6.5</code> и архитектура <code>arm64</code> — подставьте свои значения.
 
Перейти в каталог для загрузок (это оперативная память, флеш не расходуется):
<syntaxhighlight lang="bash">
cd /tmp
</syntaxhighlight>


Скачать musl-сборку ядра:
Скачать ядро:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wget -O sb.tar.gz https://github.com/shtorm-7/sing-box-extended/releases/download/v1.13.18-extended-2.6.5/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl.tar.gz
wget -O sb.tar.gz https://github.com/shtorm-7/sing-box-extended/releases/download/v1.13.18-extended-2.6.5/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl.tar.gz
</syntaxhighlight>
</syntaxhighlight>


Распаковать архив:
Распаковать:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
tar xzf sb.tar.gz
tar xzf sb.tar.gz
</syntaxhighlight>
</syntaxhighlight>


Перейти в распакованный каталог:
Установить:
<syntaxhighlight lang="bash">
cd /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl
</syntaxhighlight>
 
Сделать файл исполняемым:
<syntaxhighlight lang="bash">
chmod +x sing-box
</syntaxhighlight>
 
Проверить флаги сборки '''до''' установки:
<syntaxhighlight lang="bash">
./sing-box version
</syntaxhighlight>
 
В строке <code>Tags:</code> должны присутствовать <code>with_naive_outbound</code> (для NaïveProxy) и <code>with_quic</code> (для Mieru и Hysteria2).
 
Записать свободное место, чтобы потом сравнить:
<syntaxhighlight lang="bash">
df -h /
</syntaxhighlight>
 
Установить ядро:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
cp sing-box /usr/bin/sing-box
cp /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl/sing-box /usr/bin/sing-box
</syntaxhighlight>
</syntaxhighlight>


Строка 238: Строка 116:
</syntaxhighlight>
</syntaxhighlight>


Сбросить кэш записи на флеш:
Убрать временные файлы:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sync
rm -rf /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl /tmp/sb.tar.gz
</syntaxhighlight>
</syntaxhighlight>


Оценить реальный расход места:
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
<syntaxhighlight lang="bash">
'''Внимание — архитектура и путь.''' В ссылке указана архитектура <code>arm64</code>; если у вас другая, возьмите подходящий файл <code>linux-<арх>-musl</code> на [https://github.com/shtorm-7/sing-box-extended/releases странице релизов ядра]. Копировать ядро нужно строго в <code>/usr/bin/sing-box</code> — по другому пути служба его не запустит.
df -h /
</div>
</syntaxhighlight>


Проверить, что установленное ядро запускается:
== Шаг 3. Запустить службу ==
Включить автозапуск:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
/usr/bin/sing-box version
/etc/init.d/homeproxy enable
</syntaxhighlight>
</syntaxhighlight>


Убрать временные файлы:
Запустить:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
rm -rf /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl /tmp/sb.tar.gz
/etc/init.d/homeproxy start
</syntaxhighlight>
</syntaxhighlight>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
Дальше вся настройка — в веб-интерфейсе: '''Сервисы → Re:HomeProxy'''. Если пункт меню не появился, обновите страницу с очисткой кэша (<code>Ctrl+F5</code>).
'''Внимание — путь строго <code>/usr/bin/sing-box</code>.''' В конфигурации есть параметры <code>custom_core_path</code> и <code>custom_core_type</code>, но стартовый скрипт <code>/etc/init.d/homeproxy</code> их не читает — в нём жёстко задано <code>PROG_SINGBOX="/usr/bin/sing-box"</code>. Ядро, положенное в произвольный каталог, панель в статусе покажет, но сервис с ним не запустится.
</div>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
== Шаг 4. Добавить узел ==
'''Внимание — не сжимайте ядро упаковщиком UPX.''' Сжатый бинарник распаковывается в оперативную память '''при каждом запуске процесса''', а панель вызывает <code>sing-box version</code> при каждой отрисовке своих страниц (так она определяет доступные протоколы по флагам сборки). В результате интерфейс становится непригодным для работы: замер на aarch64 даёт '''3,1 с''' против '''0,05 с''' на каждый вызов — разница в шестьдесят раз. На скорость трафика это не влияет (ядро стартует один раз), страдает только отзывчивость панели. Экономия при этом невелика: на сжимающей файловой системе выигрыш составляет около 19 МБ.
Откройте вкладку '''Настройки узлов'''. Список пока пуст.
</div>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
[[Файл:Rehomeproxy-nodes-empty.png|центр|мини|900x900пкс|Вкладка «Настройки узлов» до добавления сервера.]]
'''Совет — как проверить ядро, ничего не устанавливая.''' Каталог <code>/tmp</code> на OpenWrt находится в оперативной памяти. Скачанный туда бинарник можно запускать прямо на месте — командами <code>./sing-box version</code> и <code>./sing-box check -c конфиг.json</code>. Так проверяются и флаги сборки, и совместимость конфигурации, и живой трафик, а флеш-память роутера при этом не затрагивается.
</div>


== 2.4. Проверка, что панель видит ядро ==
Нажмите '''Импортировать ссылку-конфигурацию для подключения''' и вставьте ссылку на ваш сервер.
<syntaxhighlight lang="bash">
ubus call luci.homeproxy singbox_get_features
</syntaxhighlight>


В ответе должны быть <code>"core_type": "singbox"</code>, версия и набор флагов. Ключевые:
[[Файл:Rehomeproxy-import-link.png|центр|мини|600x600пкс|Окно импорта. Поддерживаются Amnezia (vpn://), Hysteria, Mieru, NaïveProxy (naive://), Shadowsocks (ss://), SSH, Trojan, v2rayN (VMess), WireGuard и VLESS (vless://).]]


{| class="wikitable"
После нажатия '''Импорт''' узел появится в списке.
!Флаг
!Что даёт
|-
|<code>with_naive_outbound</code>
|Пункт '''NaïveProxy''' в списке типов узлов
|-
|<code>with_quic</code>
|'''Mieru''', '''Hysteria''', '''Hysteria2''', '''TUIC'''
|-
|<code>hp_has_tproxy</code>
|Режим '''TProxy''' для UDP
|-
|<code>hp_has_tun</code>
|Режим '''TUN'''
|}


----
[[Файл:Rehomeproxy-node-added.png|центр|мини|900x900пкс|Узел добавлен: видны его тип, адрес и порт.]]


= Этап 3. Запуск и добавление узла =
Нажмите '''Применить'''.


== 3.1. Запуск службы ==
== Шаг 5. Выбрать основной узел ==
Включить автозапуск:
Перейдите на вкладку '''Настройки клиента → Настройки маршрутизации''' и выберите добавленный сервер в поле '''Основной узел'''.
<syntaxhighlight lang="bash">
/etc/init.d/homeproxy enable
</syntaxhighlight>


Запустить:
[[Файл:Rehomeproxy-routing-settings.png|центр|мини|900x900пкс|Основной узел выбран. Остальные параметры можно оставить по умолчанию.]]
<syntaxhighlight lang="bash">
/etc/init.d/homeproxy start
</syntaxhighlight>


Проверить состояние:
Остальные поля менять не нужно — значения по умолчанию подходят для большинства случаев. Нажмите '''Применить'''.
<syntaxhighlight lang="bash">
/etc/init.d/homeproxy status
</syntaxhighlight>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d4edda; border-left: 4px solid #28a745; border-radius: 4px;">
'''Примечание:''' Статус <code>active with no instances</code> и запись <code>no main_node configured, skipping config generation</code> в журнале это '''нормальное''' состояние до того, как задан основной узел. Ядро запускается только при выбранном узле. Пока узел не задан, трафик не перехватывается и сеть работает как обычно.
'''Проверка:''' в заголовке страницы надпись должна смениться на зелёную — '''Re:HomeProxy (sing-box ...) РАБОТАЕТ'''. Если она красная и написано '''NOT RUNNING''' — вернитесь к шагу 2, ядро не установлено или лежит не по тому пути.
</div>
</div>


== 3.2. Добавление узла ==
== Шаг 6. Установить Zapret ==
'''Node Settings''' '''Добавить'''. Поддерживаются два пути:
Zapret нужен для сервисов, которые замедляют, а не блокируют — их не обязательно гнать через сервер.
 
Откройте '''Настройки узлов → Zapret''' и нажмите '''Установить'''. Панель скачает и установит всё сама.


* '''Импорт ссылки или подписки''' — вставить <code>vless://</code>, <code>hysteria2://</code>, <code>naive+https://</code>, <code>ss://</code> и т.п., либо URL подписки (sing-box JSON / Hiddify, base64, обычные share-ссылки, конфигурации Xray/V2Ray).
== Шаг 7. Настроить правила ==
* '''Ручное заполнение''' — выбрать тип и заполнить поля.
Это главный шаг: здесь вы указываете, что и через что пускать. Откройте '''Настройки клиента → Правила прокси''' и кнопкой '''Добавить''' создайте нужные строки.


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
[[Файл:Rehomeproxy-proxy-rules.png|центр|мини|900x900пкс|Три типовых правила: Telegram через основной узел, YouTube и Discord через Zapret.]]
'''Уточнение по Mieru:''' диапазон портов в поле '''Port range''' записывается '''через дефис''' — <code>2012-2022</code>. Форматы <code>2012:2022</code> и одиночное значение в поле диапазона дают ошибку <code>invalid server_ports format</code>. Одиночный порт без диапазона задаётся в обычном поле порта.
 
</div>
В каждой строке заполняются три поля: '''Включить''' (галочка), '''Отправитель''' (какой список) и '''Узел''' (через что пускать).


== 3.3. Основные параметры ==
Рекомендуемый набор для начала:
'''Client Settings → Routing Settings''':


{| class="wikitable"
{| class="wikitable"
!Параметр
!Отправитель
!Рекомендация
!Узел
!Зачем
|-
|-
|'''Main node'''
|'''Re-filter'''
|Созданный узел. Значение '''Отключить''' оставляет всю маршрутизацию прямой.
|Как основной узел
|Всё, что заблокировано в России (60000+ доменов и 25000+ IP)
|-
|-
|'''Routing mode'''
|'''Telegram'''
|'''Russia (Proxy Banned)''' — по умолчанию всё идёт напрямую, через туннель — только попавшее в списки.
|Как основной узел
|Мессенджер подключается к серверам по IP, поэтому нужен именно список сервиса
|-
|-
|'''Proxy mode'''
|'''YouTube'''
|'''Redirect TCP + TProxy UDP''' — базовый режим, не требует TUN.
|Zapret
|Видео идёт напрямую и не расходует трафик сервера
|-
|-
|'''Russia DNS server'''
|'''Discord'''
|Быстрый российский резолвер для доменов, идущих напрямую.
|Zapret
|-
|То же самое; для голосовой связи надёжнее выбрать основной узел
|'''Secure DNS server'''
|DoH/DoT-резолвер для проксируемых доменов — провайдер не видит, какие сайты запрашиваются.
|-
|'''Do not proxify torrents'''
|Включить: торренты пойдут напрямую и не будут нагружать туннель.
|}
|}


После изменений — '''Применить'''.
Нажмите '''Применить'''. Списки скачаются автоматически и дальше будут обновляться раз в сутки — вручную их вести не нужно.


----
== Шаг 8. Добавить cloudflare-ech.com ==
Откройте '''Настройки клиента → Контроль доступа → Список доменов для проксирования''' и добавьте одну строку:


= Этап 4. Списки маршрутизации =
<syntaxhighlight lang="text">
Списки определяют, какой трафик считать особенным. Есть два механизма, и они дополняют друг друга.
cloudflare-ech.com
</syntaxhighlight>


== 4.1. Автообновляемые списки (основной способ) ==
[[Файл:Rehomeproxy-domain-list.png|центр|мини|900x900пкс|Список доменов для проксирования. Сюда же можно дописывать свои сайты, по одному в строке.]]
'''Client Settings → Proxy Rules → Добавить'''. Каждое правило — строка из трёх полей:


{| class="wikitable"
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
!Поле
'''Внимание — без этой строки часть сайтов не откроется в браузере.''' Современные браузеры скрывают имя сайта в защищённом соединении (технология ECH), и панель не может определить, что за сайт запрошен. В результате он идёт напрямую и блокируется. Эта строка возвращает такие соединения в туннель. Подробности — в разделе «Почему нужен cloudflare-ech.com» ниже.
!Значение
</div>
|-
|'''Enable'''
|галочка
|-
|'''Source ⤵️'''
|источник списка
|-
|'''Node 🔗'''
|способ доставки: '''Same as main node''', '''Separate URLTest''', конкретный узел, '''ByeDPI''' или '''Zapret'''
|}


Доступные источники:
Нажмите '''Применить'''.


{| class="wikitable"
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d4edda; border-left: 4px solid #28a745; border-radius: 4px;">
!Источник
'''Готово.''' Обход работает для всех устройств в сети — телефонов, телевизоров, компьютеров. Ничего настраивать на них не нужно.
!Содержимое
|-
|'''Re-filter'''
|Более 60000 доменов и 25000 IP — сводный перечень ресурсов, заблокированных в России
|-
|'''Russia Inside'''
|Свыше 1000 записей: базовый набор сервисов, которым в России нужен туннель
|-
|'''Точечные'''
|YouTube, Discord, Telegram, Meta, TikTok, Twitter/X, Roblox, HDRezka, Google AI, Google Play, Cloudflare, CloudFront, Hetzner, OVH, DigitalOcean, аниме-стриминги, новостные сайты и др.
|}
 
Такие списки ядро скачивает само и '''обновляет раз в сутки''' (<code>update_interval: 1d</code>) — поддерживать их вручную не нужно.
 
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Примечание про приоритет:''' порядок правил задавать не нужно, панель расставляет их сама: сначала точечные списки по сервисам, затем Russia Inside, последним — самый широкий Re-filter. Благодаря этому частное правило всегда выигрывает у общего, и, например, YouTube можно отправить через Zapret, а всё остальное из Re-filter — через туннель.
</div>
</div>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
----
'''Уточнение — почему списки по сервисам важнее ручных доменов.''' Многие приложения подключаются к своим серверам '''по IP-адресам, без доменного имени''' — так работают мессенджеры, игровые клиенты и часть мобильных приложений. Доменные правила на такие соединения не действуют в принципе: ядру нечего сопоставлять со списком. Готовые списки по сервисам содержат, помимо доменов, ещё и IP-подсети, поэтому закрывают оба случая. Показательный пример — Telegram: список включает домены (<code>t.me</code>, <code>telegra.ph</code>, <code>telesco.pe</code>) и подсети дата-центров (<code>149.154.160.0/20</code>, <code>91.108.4.0/22</code>, <code>91.108.56.0/22</code> и другие). Без подсетей веб-версия откроется, а сам мессенджер подключиться не сможет.
</div>


== 4.2. Ручной список доменов ==
= Дополнения и тонкости =
'''Access Control → Proxy Domain List''' произвольный перечень доменов, по одному в строке. Имеет смысл для того, чего нет в готовых списках.
Этот раздел не нужен для базовой установки читайте по мере необходимости.


== Как применить изменения списка доменов ==
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
'''Внимание — правка только списков не перезапускает ядро.''' Поле ручного списка не связано с конфигурацией UCI: оно записывает файл напрямую. LuCI отслеживает изменения именно в UCI, поэтому после правки одного лишь списка панель отвечает, что изменений нет, и ядро продолжает работать со старой конфигурацией. Применить изменения можно двумя способами: перейти на вкладку '''Диагностика''' и нажать '''Перезапустить службу''', либо изменить список вместе с любой настройкой на других вкладках — тогда сработает обычная кнопка '''Применить'''.
'''Внимание:''' если вы изменили '''только''' список доменов и ничего больше, кнопка '''Применить''' может сообщить, что изменений нет, — и ядро продолжит работать со старым списком. Так устроено поле списка: оно сохраняет файл отдельно от остальных настроек.
</div>
</div>


== 4.3. Обязательный пункт: ECH ==
Чтобы изменения вступили в силу, откройте вкладку '''Диагностика''' и нажмите '''Перезапустить службу'''. Либо меняйте список вместе с любой другой настройкой — тогда обычная кнопка '''Применить''' сработает как обычно.
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
'''Внимание — без этой записи проксирование не работает в браузерах.''' Добавьте в '''Proxy Domain List''' отдельной строкой: <code>cloudflare-ech.com</code>
</div>


'''Суть проблемы.''' Сайты за Cloudflare публикуют DNS-запись типа HTTPS (RR 65) с параметром <code>ech=</code>. Получив её, современный браузер применяет '''ECH (Encrypted Client Hello)''' и '''шифрует имя сервера (SNI)''' в TLS-рукопожатии. Ядро определяет домен именно по SNI, поэтому распознать сайт не может, не находит его в списках и отправляет соединение напрямую — где его и обрывает DPI.
== Почему нужен cloudflare-ech.com ==
Сайты, работающие через Cloudflare, публикуют специальную DNS-запись, после которой браузер включает '''ECH (Encrypted Client Hello)''' и '''шифрует имя запрашиваемого сайта''' внутри защищённого соединения. Панель определяет сайт именно по этому имени, поэтому распознать его не может, не находит в списках и отправляет соединение напрямую — где его и обрывает провайдер.


Характерная картина: сайт есть в списке, но в браузере выдаёт ошибку установления защищённого соединения (в Firefox — <code>PR_END_OF_FILE_ERROR</code>), тогда как <code>curl</code> с того же устройства на тот же адрес работает и корректно уходит через туннель. Расхождение объясняется просто: <code>curl</code> не поддерживает ECH и отправляет открытый SNI.
Характерный признак: сайт есть в списке, но в браузере выдаёт ошибку защищённого соединения (в Firefox — <code>PR_END_OF_FILE_ERROR</code>), при этом проверка через <code>curl</code> с того же компьютера проходит успешно. Так происходит потому, что <code>curl</code> технологию ECH не использует и передаёт имя сайта открыто.


'''Почему помогает одна строка.''' При ECH шифруется только внутреннее имя, а внешнее остаётся видимым и для всех сайтов за Cloudflare оно равно <code>cloudflare-ech.com</code>. Ядро видит его, находит в списке и отправляет соединение в туннель. Решение действует на '''любого клиента сети''' независимо от браузера и его настроек DNS — настраивать устройства пользователей не требуется.
При включённом ECH скрывается только внутреннее имя, а внешнее остаётся видимым, и у всех сайтов за Cloudflare оно одинаковое — <code>cloudflare-ech.com</code>. Добавив его в список, вы возвращаете такие соединения в туннель. Решение работает для '''любого устройства в сети''' независимо от браузера и его настроек.


Проверить, использует ли конкретный домен ECH, можно с любой машины (подставьте нужный домен вместо <code>example.com</code>):
Проверить, использует ли конкретный сайт ECH (подставьте нужный адрес вместо <code>example.com</code>):
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
curl -s 'https://cloudflare-dns.com/dns-query?name=example.com&type=HTTPS' -H 'accept: application/dns-json'
curl -s 'https://cloudflare-dns.com/dns-query?name=example.com&type=HTTPS' -H 'accept: application/dns-json'
</syntaxhighlight>
</syntaxhighlight>
Наличие <code>ech=</code> в ответе означает, что у этого домена SNI будет скрыт.
Если в ответе есть <code>ech=</code>, имя сайта будет скрыто.
 
----


= Этап 5. Обход DPI без туннеля =
== Почему списки сервисов важнее ручных доменов ==
Для сервисов, которые не заблокированы, а '''замедлены''' (характерный пример — видеохостинги), туннель избыточен: он тратит трафик VPS и режет скорость. Достаточно исказить рукопожатие так, чтобы DPI не смог его разобрать.
Многие приложения — мессенджеры, игры, часть мобильных программ — подключаются к своим серверам '''по IP-адресам, без имени сайта'''. Правила по доменам на такие соединения не действуют в принципе: панели нечего сопоставлять со списком.


{| class="wikitable"
Готовые списки сервисов содержат не только домены, но и IP-подсети, поэтому закрывают оба случая. Показательный пример — Telegram: помимо доменов (<code>t.me</code>, <code>telegra.ph</code>, <code>telesco.pe</code>) список включает подсети серверов (<code>149.154.160.0/20</code>, <code>91.108.4.0/22</code>, <code>91.108.56.0/22</code> и другие). Без них веб-версия откроется, а сам мессенджер подключиться не сможет.
!Движок
!Как встроен
!Особенности
|-
|'''Zapret 2''' (<code>nfqws2</code>)
|Исходящее соединение помечается меткой маршрутизации, nftables отправляет первые пакеты в NFQUEUE, где <code>nfqws2</code> искажает рукопожатие
|Работает с QUIC; трафик идёт напрямую и не шифруется
|-
|'''ByeDPI''' (<code>ciadpi</code>)
|Локальный SOCKS5-прокси на <code>127.0.0.1:5335</code>, подключается как обычный узел типа socks
|47 пресетов стратегий, не требует NFQUEUE
|}


== 5.1. Установка ==
Поэтому для мессенджеров и приложений всегда добавляйте '''готовое правило сервиса''' в «Правила прокси», а не отдельные домены в список.
На вкладке '''Client Settings''' включите '''Enable Zapret''' или '''Enable ByeDPI''' — панель предложит установить недостающий пакет и сделает это сама. Пакеты небольшие.


== 5.2. Обязательный шаг: назначить трафик ==
== Zapret не работает сам по себе ==
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #fff3cd; border-left: 4px solid #ffc107; border-radius: 4px;">
'''Внимание сама по себе галочка ничего не обходит.''' В этой панели <code>nfqws2</code> запускается '''без собственных хостлистов''' и обрабатывает только то, что ему явным образом направят. Какие соединения попадут в очередь, решает ядро — по правилам из '''Proxy Rules'''. Пока ни одно правило не указывает на '''Zapret''', демон работает вхолостую, а счётчик его цепочки nftables остаётся нулевым.
'''Внимание:''' установка Zapret ничего не обходит сама по себе. Он обрабатывает только тот трафик, который вы явно на него направили правилом в '''Правилах прокси'''. Пока ни одно правило не указывает на '''Zapret''', он просто запущен и бездействует.
</div>
</div>
Правильный порядок: '''Proxy Rules → Добавить''' → '''Source''' = нужный сервис (например, YouTube) → '''Node''' = '''Zapret'''. После этого — '''Применить''' и перезапуск службы.


Проверить, что трафик действительно пошёл в обработку:
Проверить, что трафик действительно пошёл в обработку:
Строка 463: Строка 264:
Ненулевые счётчики пакетов в строках правил означают, что механизм работает.
Ненулевые счётчики пакетов в строках правил означают, что механизм работает.


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
Стратегия обхода по умолчанию рассчитана на типовые ограничения российских провайдеров. Если сервис всё равно не открывается — на вкладке '''Zapret''' есть тестер стратегий: он проверяет разные варианты и показывает, какие работают у вашего провайдера.
'''Примечание:''' В очередь попадают только первые 1–12 пакетов каждого соединения, то есть само рукопожатие, а не весь поток. Нагрузка на процессор роутера при этом минимальна.
</div>
 
== 5.3. Подбор стратегии ==
Стратегия по умолчанию рассчитана на типовые ограничения российских провайдеров и работает без настройки в большинстве случаев. Если сервис не открывается — на вкладке движка есть '''тестер стратегий''': он прогоняет пресеты по нескольким сайтам и показывает, какие из них держатся у конкретного провайдера.
 
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Совет — что выбрать для голосовой связи.''' Голосовые звонки (Discord, мессенджеры) идут по UDP и плохо переносят искажение пакетов. Такие сервисы надёжнее направлять через туннель ('''Node''' = основной узел), а не через Zapret. Если всё же нужен Zapret — включите в настройках опцию проксирования голосовых портов, иначе звонки могут не устанавливаться.
</div>
 
----
 
= Эксплуатация =
 
== Как применяются изменения ==
{| class="wikitable"
!Что изменено
!Как применить
|-
|Настройки на вкладках (узел, режим, DNS, правила)
|кнопка '''Применить'''
|-
|'''Только''' списки доменов в Access Control
|'''Диагностика''' → '''Перезапустить службу''' (кнопка '''Применить''' изменений не увидит)
|-
|Из командной строки
|<code>/etc/init.d/homeproxy reload</code>
|}


== Диагностика ==
== Диагностика ==
Вкладка '''Диагностика''' показывает состояние ядра, версию, PID, запущенные движки обхода DPI, занятые порты и позволяет проверить доступность контрольных сайтов.
Вкладка '''Диагностика''' показывает состояние ядра, версию, запущенные службы, занятые порты и позволяет проверить доступность контрольных сайтов.


Из командной строки — состояние службы:
Из командной строки — состояние службы:
Строка 501: Строка 274:
</syntaxhighlight>
</syntaxhighlight>


Какие процессы запущены:
Журнал событий:
<syntaxhighlight lang="bash">
ps w | grep -E 'sing-box|nfqws|ciadpi'
</syntaxhighlight>
 
Журнал событий службы:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
tail -30 /var/run/homeproxy/homeproxy.log
tail -30 /var/run/homeproxy/homeproxy.log
</syntaxhighlight>
</syntaxhighlight>


Журнал самого ядра:
Журнал ядра:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
tail -30 /var/run/homeproxy/hiddify-c.log
tail -30 /var/run/homeproxy/hiddify-c.log
</syntaxhighlight>
Проверка сгенерированной конфигурации:
<syntaxhighlight lang="bash">
/usr/bin/sing-box check -c /var/run/homeproxy/hiddify-c.json
</syntaxhighlight>
</syntaxhighlight>


<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Уточнение по чтению журнала ядра.''' Обилие строк <code>connection refused</code> и <code>i/o timeout</code> для соединений через <code>direct-out</code> на портах <code>6881</code>, <code>51413</code> и произвольных высоких портах — это, как правило, торрент-трафик: клиент перебирает пиров, часть которых недоступна. К работе туннеля такие записи отношения не имеют.
'''Уточнение:''' множество строк <code>connection refused</code> и <code>i/o timeout</code> на портах <code>6881</code>, <code>51413</code> и произвольных высоких портах — это обычно торренты: клиент перебирает источники, часть которых недоступна. К работе туннеля отношения не имеет.
</div>
</div>


=== Как определить, каким маршрутом ушло соединение ===
=== Как узнать, каким путём ушло соединение ===
Временно повысьте подробность журнала (в панели '''Log level''' <code>info</code>), выполните запрос с клиентского устройства и посмотрите записи вида:
Временно переключите '''Уровень журнала''' на <code>info</code>, откройте сайт с любого устройства и посмотрите записи вида:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
inbound/redirect[redirect-in]: inbound connection to 172.67.182.196:443
outbound/vless[main-out]: outbound connection to 172.67.182.196:443
outbound/vless[main-out]: outbound connection to 172.67.182.196:443
</syntaxhighlight>
</syntaxhighlight>
Тег в квадратных скобках показывает выбранный маршрут: <code>main-out</code> — через основной узел, <code>direct-out</code> — напрямую, <code>zapret-out</code> — с обработкой DPI. После диагностики верните уровень <code>warn</code>, иначе журнал быстро заполняется.
Обозначение в скобках показывает путь: <code>main-out</code> — через ваш сервер, <code>direct-out</code> — напрямую, <code>zapret-out</code> — с обходом DPI. После проверки верните уровень <code>warn</code>, иначе журнал быстро разрастается.


== Проверка через клиентское устройство ==
=== Проверка с устройства в сети ===
Проверять маршрутизацию нужно '''с обычного устройства в сети''', а не с самого роутера: собственный трафик роутера обрабатывается отдельной цепочкой правил и ведёт себя иначе.
Проверять нужно с обычного компьютера или телефона, а не с самого роутера — его собственный трафик обрабатывается иначе.


Какой адрес видит внешний мир (для непроксируемого ресурса это будет адрес провайдера):
Какой адрес видит внешний мир:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
curl -s https://api.ipify.org
curl -s https://api.ipify.org
</syntaxhighlight>
</syntaxhighlight>


Доступность конкретного сайта с кодом ответа и временем (подставьте нужный адрес):
Доступность сайта (подставьте нужный адрес):
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
curl -s -o /dev/null -m 15 -w 'HTTP %{http_code} за %{time_total}s\n' https://example.com
curl -s -o /dev/null -m 15 -w 'HTTP %{http_code} за %{time_total}s\n' https://example.com
</syntaxhighlight>
</syntaxhighlight>
<div style="padding: 10px 15px; margin: 10px 0; background-color: #d1ecf1; border-left: 4px solid #17a2b8; border-radius: 4px;">
'''Уточнение:''' в выводе <code>curl</code> поле <code>%{remote_ip}</code> — это адрес '''запрошенного сайта''', а не собственный внешний адрес. Чтобы понять, ушло ли соединение через туннель, используйте сервис определения IP (<code>api.ipify.org</code>, <code>ifconfig.me</code>) либо смотрите тег маршрута в журнале ядра.
</div>


----
----
Строка 557: Строка 315:
!Причина и решение
!Причина и решение
|-
|-
|Панель показывает '''NOT RUNNING''', в журнале <code>No supported core found</code>
|В заголовке панели красное '''NOT RUNNING'''
|Ядро не установлено или лежит не по пути <code>/usr/bin/sing-box</code> — см. Этап 2
|Ядро не установлено или лежит не по пути <code>/usr/bin/sing-box</code> — см. Шаг 2
|-
|-
|Служба запущена, но статус <code>active with no instances</code>
|Служба запущена, но ничего не проксируется
|Не задан '''Main node'''. Это ожидаемое поведение, а не ошибка
|Не выбран '''Основной узел''' — см. Шаг 5
|-
|-
|Сайт из списка не открывается '''в браузере''', но <code>curl</code> работает
|Сайт из списка не открывается '''в браузере''', хотя <code>curl</code> работает
|ECH скрывает SNI. Добавить <code>cloudflare-ech.com</code> в Proxy Domain List — см. раздел 4.3
|Не добавлен <code>cloudflare-ech.com</code> — см. Шаг 8
|-
|-
|Изменил список доменов ничего не изменилось, панель пишет, что изменений нет
|Изменил список доменов, ничего не поменялось
|Правка списка не перезапускает ядро. '''Диагностика → Перезапустить службу'''
|'''Диагностика → Перезапустить службу'''
|-
|-
|Мессенджер не подключается, хотя его сайт открывается
|Мессенджер не подключается, хотя его сайт открывается
|Приложение ходит на серверы по IP. Нужен готовый список по сервису, содержащий IP-подсети — см. раздел 4.1
|Нужно готовое правило сервиса с IP-подсетями, а не домены
|-
|-
|Zapret включён, но сервис по-прежнему замедлен
|Zapret включён, но сервис по-прежнему замедлен
|Нет правила с назначением '''Zapret'''. Счётчик очереди нулевой — см. раздел 5.2
|Нет правила, направляющего трафик на Zapret
|-
|-
|Пункт '''NaïveProxy''' отсутствует в списке типов узлов
|'''NaïveProxy''' отсутствует в списке типов узлов
|В OpenWrt-сборке ядра нет соответствующего флага. Установить musl-сборку — см. раздел 2.3
|Ядро установлено из репозитория OpenWrt. Нужна musl-сборка — см. Шаг 2
|-
|-
|Интерфейс панели открывается по несколько секунд
|Панель открывается по несколько секунд
|Ядро сжато UPX. Заменить на несжатый бинарник — см. предупреждение в разделе 2.3
|Ядро сжато упаковщиком UPX — замените на обычный файл
|-
|-
|Страницы «висят» по 30 секунд, затем открываются
|Страницы «висят» по 30 секунд, потом открываются
|Браузер уходит в QUIC (UDP/443) мимо перехвата. Заблокировать UDP/443 действием '''REJECT''' (не DROP — при DROP браузер ждёт таймаута)
|Браузер уходит в QUIC мимо перехвата. Заблокируйте UDP/443 действием '''REJECT''' (не DROP)
|}
|}


Строка 598: Строка 356:
</syntaxhighlight>
</syntaxhighlight>


Удалить панель и локализацию:
Удалить панель:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
opkg remove luci-app-re-homeproxy luci-i18n-homeproxy-ru
opkg remove luci-app-re-homeproxy luci-i18n-homeproxy-ru
</syntaxhighlight>
</syntaxhighlight>


Удалить ядро, если оно ставилось пакетом:
Удалить ядро:
<syntaxhighlight lang="bash">
opkg remove sing-box-extended
</syntaxhighlight>
 
Удалить ядро, если бинарник копировался вручную:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
rm -f /usr/bin/sing-box
rm -f /usr/bin/sing-box
</syntaxhighlight>
</syntaxhighlight>


Удалить конфигурацию и списки:
Удалить настройки и списки:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
rm -rf /etc/homeproxy /etc/config/homeproxy
rm -rf /etc/homeproxy /etc/config/homeproxy
</syntaxhighlight>
</syntaxhighlight>


Правила nftables снимаются автоматически при остановке службы. Настройки межсетевого экрана, проброс портов и прочая конфигурация роутера не затрагиваются.
Правила межсетевого экрана снимаются автоматически при остановке службы. Проброс портов и остальные настройки роутера не затрагиваются.


----
----
Строка 625: Строка 378:
* [https://github.com/1andrevich/homeproxy-hiddify Re:HomeProxy — исходный код и релизы]
* [https://github.com/1andrevich/homeproxy-hiddify Re:HomeProxy — исходный код и релизы]
* [https://github.com/shtorm-7/sing-box-extended sing-box-extended — ядро]
* [https://github.com/shtorm-7/sing-box-extended sing-box-extended — ядро]
* [https://github.com/1andrevich/Re-filter-lists Re-filter — списки заблокированных ресурсов]
* [https://github.com/1andrevich/Re-filter-lists Re-filter — список заблокированных ресурсов]
* [https://github.com/itdoginfo/allow-domains itdoginfo/allow-domains — списки по сервисам]
* [https://github.com/itdoginfo/allow-domains itdoginfo/allow-domains — списки по сервисам]
* [https://github.com/bol-van/zapret2 Zapret 2 (nfqws2)]
* [https://github.com/bol-van/zapret2 Zapret 2]
* [https://github.com/hufrea/byedpi ByeDPI]
* [https://github.com/hufrea/byedpi ByeDPI]



Текущая версия от 11:59, 14 августа 2026

Re:HomeProxy на OpenWrt: обход блокировок и гибкая маршрутизация

Пошаговая инструкция по установке Re:HomeProxy на роутер с OpenWrt — от чистой системы до работающего обхода блокировок. Рассчитана на пользователя, который умеет подключаться к роутеру по SSH.

Проверено на Xiaomi Redmi Router AX6000 (aarch64_cortex-a53) с OpenWrt 24.10.0.

Как читать команды: каждая команда приведена отдельной строкой и выполняется самостоятельно — копируйте и вставляйте их по одной, дожидаясь завершения предыдущей. Ничего править перед запуском не нужно, кроме мест, где это указано явно.


Что мы построим

Одна панель в LuCI, которая управляет всем: туннелем, списками заблокированных ресурсов и обходом DPI.

Компонент Назначение
Re:HomeProxy Веб-панель в LuCI. Управляет узлами, маршрутизацией и обходом DPI.
sing-box-extended Ядро. Поддерживает VLESS (REALITY, XHTTP), Hysteria2, Trojan, Shadowsocks, AnyTLS, WireGuard, AmneziaWG, Mieru, NaïveProxy и др.
Списки маршрутизации Готовые наборы доменов и IP (Re-filter, Russia Inside, отдельные сервисы). Обновляются автоматически раз в сутки.
Zapret 2 Обход DPI без туннеля — для сервисов, которые не заблокированы, а замедлены (например, видеохостинги). Трафик идёт напрямую, не нагружая VPS.

Принцип простой: списки решают, какой трафик особенный, а узел или Zapret — через что его пустить. Всё, что не попало ни в один список, идёт напрямую.

Что понадобится

Требование Описание
Роутер OpenWrt / ImmortalWrt 24.10 и новее (opkg) либо 25.12 и новее (apk)
Доступ Веб-интерфейс LuCI и SSH к роутеру
Узел Ссылка на ваш сервер: vless://, hysteria2://, naive+https://, ss:// и т.п.

Установка

Шаг 1. Установить панель

Подключитесь к роутеру по SSH и выполните команды по очереди.

Обновить список пакетов:

opkg update

Установить зависимости:

opkg install ucode-mod-digest kmod-nft-tproxy kmod-tun

Перейти в каталог для загрузок:

cd /tmp

Скачать панель:

wget -O rhp.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-app-re-homeproxy_2026.06.29-r1_all.ipk

Установить:

opkg install /tmp/rhp.ipk

Скачать русский язык интерфейса:

wget -O rhp-ru.ipk https://github.com/1andrevich/homeproxy-hiddify/releases/download/2026.06.29-r1/luci-i18n-homeproxy-ru_2026.06.29-r1_all.ipk

Установить язык:

opkg install /tmp/rhp-ru.ipk

Актуальную версию пакета смотрите на странице релизов — в командах указана 2026.06.29-r1. Для OpenWrt 25.12 и новее замените в ссылках .ipk на .apk, а команду установки — на apk add --allow-untrusted /tmp/rhp.apk.

Шаг 2. Установить ядро

Ядро sing-box-extended ставится вручную — сборка из репозитория OpenWrt собрана без поддержки NaïveProxy, поэтому берём универсальную musl-сборку, где есть все протоколы.

Скачать ядро:

wget -O sb.tar.gz https://github.com/shtorm-7/sing-box-extended/releases/download/v1.13.18-extended-2.6.5/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl.tar.gz

Распаковать:

tar xzf sb.tar.gz

Установить:

cp /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl/sing-box /usr/bin/sing-box

Сделать исполняемым:

chmod +x /usr/bin/sing-box

Убрать временные файлы:

rm -rf /tmp/sing-box-1.13.18-extended-2.6.5-linux-arm64-musl /tmp/sb.tar.gz

Внимание — архитектура и путь. В ссылке указана архитектура arm64; если у вас другая, возьмите подходящий файл linux-<арх>-musl на странице релизов ядра. Копировать ядро нужно строго в /usr/bin/sing-box — по другому пути служба его не запустит.

Шаг 3. Запустить службу

Включить автозапуск:

/etc/init.d/homeproxy enable

Запустить:

/etc/init.d/homeproxy start

Дальше вся настройка — в веб-интерфейсе: Сервисы → Re:HomeProxy. Если пункт меню не появился, обновите страницу с очисткой кэша (Ctrl+F5).

Шаг 4. Добавить узел

Откройте вкладку Настройки узлов. Список пока пуст.

Вкладка «Настройки узлов» до добавления сервера.

Нажмите Импортировать ссылку-конфигурацию для подключения и вставьте ссылку на ваш сервер.

Окно импорта. Поддерживаются Amnezia (vpn://), Hysteria, Mieru, NaïveProxy (naive://), Shadowsocks (ss://), SSH, Trojan, v2rayN (VMess), WireGuard и VLESS (vless://).

После нажатия Импорт узел появится в списке.

Узел добавлен: видны его тип, адрес и порт.

Нажмите Применить.

Шаг 5. Выбрать основной узел

Перейдите на вкладку Настройки клиента → Настройки маршрутизации и выберите добавленный сервер в поле Основной узел.

Основной узел выбран. Остальные параметры можно оставить по умолчанию.

Остальные поля менять не нужно — значения по умолчанию подходят для большинства случаев. Нажмите Применить.

Проверка: в заголовке страницы надпись должна смениться на зелёную — Re:HomeProxy (sing-box ...) РАБОТАЕТ. Если она красная и написано NOT RUNNING — вернитесь к шагу 2, ядро не установлено или лежит не по тому пути.

Шаг 6. Установить Zapret

Zapret нужен для сервисов, которые замедляют, а не блокируют — их не обязательно гнать через сервер.

Откройте Настройки узлов → Zapret и нажмите Установить. Панель скачает и установит всё сама.

Шаг 7. Настроить правила

Это главный шаг: здесь вы указываете, что и через что пускать. Откройте Настройки клиента → Правила прокси и кнопкой Добавить создайте нужные строки.

Три типовых правила: Telegram через основной узел, YouTube и Discord через Zapret.

В каждой строке заполняются три поля: Включить (галочка), Отправитель (какой список) и Узел (через что пускать).

Рекомендуемый набор для начала:

Отправитель Узел Зачем
Re-filter Как основной узел Всё, что заблокировано в России (60000+ доменов и 25000+ IP)
Telegram Как основной узел Мессенджер подключается к серверам по IP, поэтому нужен именно список сервиса
YouTube Zapret Видео идёт напрямую и не расходует трафик сервера
Discord Zapret То же самое; для голосовой связи надёжнее выбрать основной узел

Нажмите Применить. Списки скачаются автоматически и дальше будут обновляться раз в сутки — вручную их вести не нужно.

Шаг 8. Добавить cloudflare-ech.com

Откройте Настройки клиента → Контроль доступа → Список доменов для проксирования и добавьте одну строку:

cloudflare-ech.com
Список доменов для проксирования. Сюда же можно дописывать свои сайты, по одному в строке.

Внимание — без этой строки часть сайтов не откроется в браузере. Современные браузеры скрывают имя сайта в защищённом соединении (технология ECH), и панель не может определить, что за сайт запрошен. В результате он идёт напрямую и блокируется. Эта строка возвращает такие соединения в туннель. Подробности — в разделе «Почему нужен cloudflare-ech.com» ниже.

Нажмите Применить.

Готово. Обход работает для всех устройств в сети — телефонов, телевизоров, компьютеров. Ничего настраивать на них не нужно.


Дополнения и тонкости

Этот раздел не нужен для базовой установки — читайте по мере необходимости.

Как применить изменения списка доменов

Внимание: если вы изменили только список доменов и ничего больше, кнопка Применить может сообщить, что изменений нет, — и ядро продолжит работать со старым списком. Так устроено поле списка: оно сохраняет файл отдельно от остальных настроек.

Чтобы изменения вступили в силу, откройте вкладку Диагностика и нажмите Перезапустить службу. Либо меняйте список вместе с любой другой настройкой — тогда обычная кнопка Применить сработает как обычно.

Почему нужен cloudflare-ech.com

Сайты, работающие через Cloudflare, публикуют специальную DNS-запись, после которой браузер включает ECH (Encrypted Client Hello) и шифрует имя запрашиваемого сайта внутри защищённого соединения. Панель определяет сайт именно по этому имени, поэтому распознать его не может, не находит в списках и отправляет соединение напрямую — где его и обрывает провайдер.

Характерный признак: сайт есть в списке, но в браузере выдаёт ошибку защищённого соединения (в Firefox — PR_END_OF_FILE_ERROR), при этом проверка через curl с того же компьютера проходит успешно. Так происходит потому, что curl технологию ECH не использует и передаёт имя сайта открыто.

При включённом ECH скрывается только внутреннее имя, а внешнее остаётся видимым, и у всех сайтов за Cloudflare оно одинаковое — cloudflare-ech.com. Добавив его в список, вы возвращаете такие соединения в туннель. Решение работает для любого устройства в сети независимо от браузера и его настроек.

Проверить, использует ли конкретный сайт ECH (подставьте нужный адрес вместо example.com):

curl -s 'https://cloudflare-dns.com/dns-query?name=example.com&type=HTTPS' -H 'accept: application/dns-json'

Если в ответе есть ech=, имя сайта будет скрыто.

Почему списки сервисов важнее ручных доменов

Многие приложения — мессенджеры, игры, часть мобильных программ — подключаются к своим серверам по IP-адресам, без имени сайта. Правила по доменам на такие соединения не действуют в принципе: панели нечего сопоставлять со списком.

Готовые списки сервисов содержат не только домены, но и IP-подсети, поэтому закрывают оба случая. Показательный пример — Telegram: помимо доменов (t.me, telegra.ph, telesco.pe) список включает подсети серверов (149.154.160.0/20, 91.108.4.0/22, 91.108.56.0/22 и другие). Без них веб-версия откроется, а сам мессенджер подключиться не сможет.

Поэтому для мессенджеров и приложений всегда добавляйте готовое правило сервиса в «Правила прокси», а не отдельные домены в список.

Zapret не работает сам по себе

Внимание: установка Zapret ничего не обходит сама по себе. Он обрабатывает только тот трафик, который вы явно на него направили правилом в Правилах прокси. Пока ни одно правило не указывает на Zapret, он просто запущен и бездействует.

Проверить, что трафик действительно пошёл в обработку:

nft list chain inet fw4 homeproxy_zapret_queue

Ненулевые счётчики пакетов в строках правил означают, что механизм работает.

Стратегия обхода по умолчанию рассчитана на типовые ограничения российских провайдеров. Если сервис всё равно не открывается — на вкладке Zapret есть тестер стратегий: он проверяет разные варианты и показывает, какие работают у вашего провайдера.

Диагностика

Вкладка Диагностика показывает состояние ядра, версию, запущенные службы, занятые порты и позволяет проверить доступность контрольных сайтов.

Из командной строки — состояние службы:

/etc/init.d/homeproxy status

Журнал событий:

tail -30 /var/run/homeproxy/homeproxy.log

Журнал ядра:

tail -30 /var/run/homeproxy/hiddify-c.log

Уточнение: множество строк connection refused и i/o timeout на портах 6881, 51413 и произвольных высоких портах — это обычно торренты: клиент перебирает источники, часть которых недоступна. К работе туннеля отношения не имеет.

Как узнать, каким путём ушло соединение

Временно переключите Уровень журнала на info, откройте сайт с любого устройства и посмотрите записи вида:

outbound/vless[main-out]: outbound connection to 172.67.182.196:443

Обозначение в скобках показывает путь: main-out — через ваш сервер, direct-out — напрямую, zapret-out — с обходом DPI. После проверки верните уровень warn, иначе журнал быстро разрастается.

Проверка с устройства в сети

Проверять нужно с обычного компьютера или телефона, а не с самого роутера — его собственный трафик обрабатывается иначе.

Какой адрес видит внешний мир:

curl -s https://api.ipify.org

Доступность сайта (подставьте нужный адрес):

curl -s -o /dev/null -m 15 -w 'HTTP %{http_code} за %{time_total}s\n' https://example.com

Типовые неполадки

Симптом Причина и решение
В заголовке панели красное NOT RUNNING Ядро не установлено или лежит не по пути /usr/bin/sing-box — см. Шаг 2
Служба запущена, но ничего не проксируется Не выбран Основной узел — см. Шаг 5
Сайт из списка не открывается в браузере, хотя curl работает Не добавлен cloudflare-ech.com — см. Шаг 8
Изменил список доменов, ничего не поменялось Диагностика → Перезапустить службу
Мессенджер не подключается, хотя его сайт открывается Нужно готовое правило сервиса с IP-подсетями, а не домены
Zapret включён, но сервис по-прежнему замедлен Нет правила, направляющего трафик на Zapret
NaïveProxy отсутствует в списке типов узлов Ядро установлено из репозитория OpenWrt. Нужна musl-сборка — см. Шаг 2
Панель открывается по несколько секунд Ядро сжато упаковщиком UPX — замените на обычный файл
Страницы «висят» по 30 секунд, потом открываются Браузер уходит в QUIC мимо перехвата. Заблокируйте UDP/443 действием REJECT (не DROP)

Удаление

Остановить службу:

/etc/init.d/homeproxy stop

Убрать из автозапуска:

/etc/init.d/homeproxy disable

Удалить панель:

opkg remove luci-app-re-homeproxy luci-i18n-homeproxy-ru

Удалить ядро:

rm -f /usr/bin/sing-box

Удалить настройки и списки:

rm -rf /etc/homeproxy /etc/config/homeproxy

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


Ссылки