splify2
splify2

splify2#

Управляющий слой для маршрутизатора OpenWrt поверх ядра steer: выбранные сервисы идут через туннель на всех устройствах сети, остальное — напрямую. Интерфейс — страница LuCI (Сервисы → splify2), бэкенд — объект rpcd на shell; сам трафик маршрутизирует ядро steer (nftables и таблицы маршрутизации ядра Linux), splify2 пишет ему спеку и показывает состояние.

Telegram Поддержать проект

Какое ядро нужно#

Эта версия пишет спеку формата v2 ядра steer (version: 2) и рассчитана на steer 2.0: пакет steer-core и модули по нужде (steer-vless, steer-hysteria2, steer-proxy, steer-xsteer, steer-obfs, steer-tgws). Ядро старее 2.0 спеку v2 не читает, и изменения на нём не применятся: главная страница узнаёт его по перечню умений в steer status (нет умения groups — оно есть только у 2.0), карточка ядра в «Настройки → Интерфейс» — по версии пакета (минимум 2.0.0), и обе говорят «Ядро устарело». Карточка ядра в «Настройки → Интерфейс» ставит и обновляет ядро 2.0: steer-core и модули одной транзакцией. При первой установке (и при переходе с ядра 1.x) модули выбираются галочками — по умолчанию VLESS, Hysteria2 и протоколы прокси; при переходе со steer-extended 1.x добавляются вшитые в него XSTEER, обфускатор и мост Telegram. Обновление берёт все стоящие модули и те, что нужны правилам и выходам. Рядом — карточка «Модули ядра»: каждый модуль со своим состоянием, «Поставить» и «Снять»; модуль, нужный выходам, снять нельзя — вместо кнопки названы эти выходы.

Если на роутере стоит steer-box-connector (sing-box для podkop и forkop на ядре steer), ядро ведёт он: splify2 пишет «Ядро занято: podkop» (или forkop; если нет ни того, ни другого — steer-box-connector), не запускает службу steer, не применяет настройки и не трогает пакеты ядра. Коннектором splify2 не управляет.

Прежняя спека v1 (schema, channels) читается: при первом открытии интерфейс переписывает её в v2, копию прежнего файла оставляя рядом (/etc/steer/spec.json.v1.bak).

Что нового в 26.10 Bode#

  • Спека ядра v2: правила, списки, клиенты и выходы отдельными разделами; прежняя переносится сама.
  • Группы выходов: первый живой, самый быстрый, выбор вручную, раздача по весам — случайно, сайт на одном выходе или сайт и устройство на одном выходе.
  • Туннели по подписке hysteria2 и прокси (Trojan, Shadowsocks, SOCKS, HTTP(S), VMess) наравне с VLESS; экран подписок называется «Подписки».
  • IPv6 через туннель WireGuard и подложка туннеля «через выход».
  • Модули ядра ставятся и снимаются из интерфейса: карточка «Модули ядра» в «Настройки → Интерфейс», а выходу без нужного модуля — кнопка «Поставить».
  • У туннеля по подписке: несколько узлов сразу с раздачей соединений и слежкой за узлами, «Не брать» по странам и словам в имени узла, «Не проверять сертификат узла».
  • Бейджи конфигурации у узлов и выходов; на главной — внешний адрес выхода подписки.
  • Раздел «DNS»: серверы DoH, DoT, DoQ и обычные, у правила — свой сервер; несколько серверов сразу или по очереди и свой сервер для сайтов вне правил.
  • «Диагностика» — свой раздел: проверки ядра, соединения в выходах, недавние имена резолвера, журнал.
  • При steer-box-connector (podkop, forkop) splify2 говорит «Ядро занято» и ядро не трогает.
  • Убраны настройка https-dns-proxy, обход DPI (Zapret) и отчёт о работе роутера: остался только отклик раз в 23 часа для счётчика на сайте.

Что умеет#

Правила. Правило — «что» + «кого касается» + «куда». «Что» — сервисы каталога и свои списки (домены и подсети, текстом, ссылкой или файлом), либо весь трафик. «Кого» — вся сеть либо выбранные устройства (по MAC из аренд DHCP или по адресу, подсети, диапазону a-b — IPv4 и IPv6); правило, созданное в прежней версии на одно устройство, остаётся старше глобальных. «Куда» — выход. Список читается сверху вниз, побеждает первое совпадение: исключение («Напрямую») должно стоять выше туннельных правил. Правило можно выключить, не удаляя; у правила с доменами выбираются режим (поддельные или настоящие адреса) и свой сервер DNS (из раздела «DNS» — сервер или несколько серверов — или адресом прямо в правиле), а в режиме поддельных адресов — порт назначения: соединения к этим доменам уходят на него вместо запрошенного.

Правило = что перенаправляем + кого касается + куда. Читается сверху вниз, побеждает первое совпадение

Выходы (раздел «VPN»): - свой интерфейс роутера (WireGuard, AmneziaWG, что угодно), в том числе WireGuard поверх поддельного TCP (обфускатор, модуль steer-obfs); - туннель по подписке: VLESS (модуль steer-vless) или hysteria2 (steer-hysteria2); узлы берутся из подписки, выбираются списком по порядку предпочтения или «любой рабочий», проверяются по задержке; для VLESS можно ограничить транспорт узлов (tcp, ws, httpupgrade, grpc, xhttp); сам туннель может идти через другой выход («через выход»); - туннель прокси (модуль steer-proxy): trojan, shadowsocks (в том числе 2022), socks4/5, HTTP(S) CONNECT и vmess — узлы из подписки, выбираются и проверяются так же; у vless, trojan, vmess и http в «Дополнительно» есть «Не проверять сертификат узла» — с ним в перечне редактора видны и выбираются узлы подписки, у которых проверка сертификата выключена в самой ссылке (allowInsecure), без него ядро их не берёт; - у туннеля по подписке любого протокола — «Не брать»: страны (флажки по странам узлов подписок; страна узла — флаг в его имени) и слова в имени узла. Такие узлы ядро не берёт ни «любой рабочей», ни выбранными, в том числе новые узлы этих стран после обновления подписки; в перечне они приглушены с пометкой «не берётся». Выбор есть, когда установленное ядро steer это умеет; уже записанное видно и снимается всегда; - у туннеля по подписке VLESS и прокси — «Сколько узлов работают сразу»: работают первые ответившие узлы по порядку предпочтения, сколько задано, и новые соединения делятся между ними — «каждое соединение — на любой узел», «сайт — на одном узле» или «сайт и устройство — на одном узле»; соединение остаётся на своём узле, пока тот жив. Задать больше, чем взято узлов (у «любой рабочей» — чем узлов подписки, которые ядро может взять), нельзя. Узел перестал отвечать — его соединения сбрасываются, приложение переподключается на живой узел, а на место мёртвого ядро берёт следующий по порядку, не трогая соединения остальных. Какие узлы работают сейчас, видно на главной, в «Выходах» и в редакторе выхода; работает меньше заданного — там же предупреждение. В «Дополнительно» — слежка за узлами, у всех протоколов (у hysteria2 — только она): как часто проверять каждый работающий узел (по умолчанию раз в 60 с) и через сколько секунд молчания узла под живым соединением считать его мёртвым (по умолчанию 20 с, у hysteria2 30 с; 0 — выключено, кроме hysteria2). Выбор есть, когда установленное ядро steer это умеет; уже записанное видно и снимается всегда; - несколько подписок (экран «Подписки»): ссылкой на подписку либо ссылками узлов через пробел — vless://, hysteria2://, trojan://, ss://, socks://, vmess://; прокси http(s)://адрес:порт — своим полем; у подписки по ссылке остаток трафика и автообновление; - интерфейсы xsteer; - пул — выход из нескольких строк (устройства и локации подписок) по порядку предпочтения, при желании «самый быстрый» с допуском, интервалом и адресом замера и паузой замера без трафика; - группа — выход из других выходов с одним из четырёх способов выбора: первый живой, самый быстрый, выбор вручную (кнопка «Выбрать», без применения), раздача новых соединений по весам; группы могут входить друг в друга; у раздачи по весам — режим: «случайно по весам» (каждое новое соединение само по себе), «сайт — на одном выходе» (все соединения к сайту через один выход, у любого устройства) или «сайт и устройство — на одном выходе» (у каждого устройства сайт через свой постоянный выход); упал выход — его сайты расходятся по живым, а сайты остальных выходов остаются на месте; установленное соединение остаётся на своём выходе в любом режиме; у «самого быстрого» — те же допуск, интервал, адрес и пауза замера, у любой группы — «не пропускать IPv6»; - IPv6 от хоста за туннелем WireGuard: префикс хоста, один адрес или выключен. Раздачу IPv6 в сети роутера splify2 не настраивает — чего не хватает, говорит диагностика ядра; - что делать, когда упало всё: остановить трафик (по умолчанию) или пустить напрямую.

У каждого узла в редакторе выхода, у строки выхода в «Выходах» и у выхода на главной стоят бейджи конфигурации — протокол (VLESS, Hysteria2, Trojan, Shadowsocks, VMess, SOCKS, HTTP, xsteer, WireGuard, AmneziaWG), транспорт (TCP, gRPC, XHTTP с режимом, WebSocket, HTTPUpgrade), защита (Reality, TLS, «без шифрования»), особенности (Vision, «постквантовое», Salamander/Gecko, «смена портов», BBR или Brutal, «сертификат закреплён», «2022» и шифр shadowsocks, шифр VMess, кроме auto, — если ядро их сообщает; «поддельный TCP» у WireGuard поверх обфускатора) и предупреждение «сертификат не проверяется» — у выхода с «Не проверять сертификат узла» и у узла, у которого проверка выключена в самой ссылке. Отпечаток браузера узла (chrome, firefox…) — подсказкой при наведении на TLS или Reality. У «любой рабочей» и у выхода с несколькими узлами — то, что общее у всех узлов, которые он может взять (исключённые «Не брать» не в счёт); у hysteria2 под клиентом — то, что сообщает клиент.

Если выходу не хватает модуля ядра steer, в списке выходов стоит «нужен пакет steer-…», а под списком — «Нужен модуль: …» с кнопкой «Поставить».

DNS (раздел «DNS»). Серверы встроенного резолвера ядра: DoH, DoT, DoQ и обычный DNS (по UDP или TCP), для каждого выход, через который уходит запрос, адреса сервера и серверы для разрешения его имени; кэш ответов и сроки хранения в нём, режим доменных правил; состояние серверов и кэша берётся из журнала резолвера.

«Для имён под правилами» и «Для остальных сайтов» выбирается одно из трёх: DNS роутера, один сервер или несколько из уже добавленных. Несколько серверов спрашиваются «по очереди» — следующий, когда предыдущий отказал или молчит полторы секунды; отказавший на время уходит в конец и потом проверяется снова, — или «сразу все», и ответ берётся первый годный. Порядок серверов задаётся стрелками; видно, кого спросят первым и кто сейчас не отвечает. Сайты вне правил без выбора спрашиваются у DNS роутера, как раньше; с выбранным сервером имена своей сети (имена устройств, .lan, обратные зоны) всё равно остаются у DNS роутера, а если сервер не отвечает, ответ даёт DNS роутера — интернет не пропадает. «Несколько» и «Для остальных сайтов» появляются, когда их умеет установленное ядро steer; уже записанное в настройке видно и снимается и на ядре без них. В правиле сервер DNS выбирается и из групп нескольких серверов.

Серверы, настроенные на самом роутере (dnsmasq, https-dns-proxy), splify2 не создаёт, не читает и не меняет.

Каталог и списки. Каталог сервисов приходит ссылкой (по умолчанию splify2-lists) и обновляется без переустановки; свои списки добавляются текстом, ссылкой или файлом; списки обновляются раз в сутки, большие адресные наборы ужимаются под память роутера.

Состояние. Главная: работает ли маршрутизация — по проверкам ядра и по выходам правил: выход правила не отвечает — заголовок «Выход не отвечает» и чей трафик остановлен или идёт напрямую; правила с трафиком, выходы с откликом и страной, остаток подписки, «Куда пойдёт запрос» (ответ ядра steer по живым правилам ядра Linux). Для групп — какой член несёт трафик. У выхода подписки — внешний адрес: IPv4, которым выход ходит наружу (по ответу https://1.1.1.1/cdn-cgi/trace, запрошенному через сам выход; по нему же страна). Адрес закрыт размытием и открывается значком глаза. Раздел «Диагностика» печатает приговоры ядра дословно, рядом соединения, которые ядро повело в выходы (кто, куда, через какой выход и по какому правилу, с поиском), недавние имена резолвера ядра (какое правило и выход достались имени или что оно идёт мимо правил) и журнал ядра с поиском.

Обслуживание. Архив настроек (выгрузить и восстановить), самообновление интерфейса, остановка всей маршрутизации одной кнопкой, splify2-purge (убрать следы), настройки переживают sysupgrade.

Упал узел — трафик на следующий; упали все — трафик останавливается, а не утекает мимо туннеля

Чего splify2 больше не делает#

  • Обход DPI (Zapret). Вкладка, стратегии, автоподбор, выход zapret как цель правила и «напрямую через zapret» убраны. Ядро вид kind: zapret сохранило; уже стоящий в спеке такой выход читается и записывается обратно как есть. Установленные Zapret и Zapret Manager не снимаются и не читаются.
  • Настройка https-dns-proxy. Пакет больше не зависимость и не настраивается; шифрованный DNS делает резолвер ядра. Уже установленный https-dns-proxy и его файл остаются как есть.
  • Отчёт о работе роутера. Почасовой отчёт убран; остался только отклик для счётчика на сайте (ниже).

Установка#

wget -O /tmp/splify2-install.sh https://gitlab.com/xyzmean/splify2/-/raw/main/install.sh && sh /tmp/splify2-install.sh

Скрипт определяет архитектуру и менеджер пакетов (apk — OpenWrt 25.12 и новее, opkg — 24.10 и старше), ставит ядро steer 2.0 и интерфейс. Ядро — пакет steer-core и модули одной транзакцией; с терминалом скрипт спрашивает, какие модули поставить (без ответа и без терминала — vless hysteria2 proxy: пакеты 2.0.0 этих трёх вместе — 120–240 КБ в зависимости от архитектуры, steer-core — около 1,1 МБ). Остальные модули ставятся потом из интерфейса. Если ядро 2.0 уже стоит, скрипт его не трогает — обновляется оно из интерфейса. Прежнее ядро 1.x (steer или steer-extended) заменяется ядром 2.0 в той же транзакции, с модулями, вшитыми в steer-extended (VLESS, XSTEER, обфускатор, мост Telegram); /etc/steer остаётся на месте. Если стабильный выпуск ядра старше 2.0, берётся предварительный 2.0 из перечня выпусков, а без него скрипт отказывает словами. При steer-box-connector ядро не ставится и служба steer не включается. Пустая спека, если её нет, — формата v2. Требования к прошивке и месту — требования пакетов steer и luci-app-splify2 выбранного выпуска. Пакет интерфейса зависит от luci-base, ip-full и curl (страна, внешний адрес и отклик выходов).

Последние версии и адреса пакетов установщик берёт из перечня выпусков splify2/releases (version.json с raw.githubusercontent.com, jsDelivr или splify2.github.io) и сверяет скачанный пакет с его sha256, если на роутере есть sha256sum. Тем же перечнем пользуется обновление ядра и интерфейса со страницы splify2. Перечень не ответил — версии спрашиваются у релизов GitHub, как раньше.

Если githubusercontent.com закрыт, установщик и всё, что роутер берёт из интернета, ходит сначала прямым адресом, затем зеркалом на GitLab, затем хостами GitHub; чужие зеркала не используются. Сразу через туннель: Настройки → Общее → Скачивать списки и обновления через туннель.

Если на роутере стоит splify первой версии, установщик находит её и говорит об этом до установки; сам он из первой версии ничего не удаляет и не переносит.

Полное удаление#

splify2-purge без ключей только показывает, что будет сделано; splify2-purge --yes убирает настройки, списки, правила фаервола, записи расписания и следы прежних версий (splify2-purge --yes --keep-config оставляет настройки). Чужое — зона фаервола, настройка https-dns-proxy, интерфейсы с протоколом xsteer — остаётся, о каждом случае печатается строка. Пакеты команда не снимает, а называет команду пакетного менеджера.

Счётчик на сайте#

Раз в 23 часа роутер отзывается счётчику сайта splify2.github.io, и это включено по умолчанию. Отклик уходит на https://splify2-telemetry-panel.vercel.app/api/ping, в нём только идентификатор роутера ({"v":1,"id":"sp-…"}); страну и город сайт определяет сам по соединению, адрес роутера не хранит. На сайте видно число роутеров, отозвавшихся за последние 24 часа. Выключить: Настройки → Интерфейс, карточка «Счётчик на сайте». Подробно — docs/TELEMETRY.md.

Ссылки#