splify2#
Управляющий слой для маршрутизатора OpenWrt поверх ядра steer: выбранные сервисы идут через туннель на всех устройствах сети, остальное — напрямую. Интерфейс — страница LuCI (Сервисы → splify2), бэкенд — объект rpcd на shell; сам трафик маршрутизирует ядро steer (nftables и таблицы маршрутизации ядра Linux), splify2 пишет ему спеку и показывает состояние.
Какое ядро нужно#
Эта версия пишет спеку формата 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.
Ссылки#
- Ядро steer — маршрутизация, клиенты туннелей, резолвер
- Каталог списков
- docs/rpcd-api.md — методы бэкенда, вход и выход
- docs/TELEMETRY.md — счётчик роутеров на сайте: что уходит и как выключить
- ui/README.md — устройство интерфейса
- Вопросы и баги — чат; поддержать проект — Cloudtips