Releases: Dushnilin/tachyon
Release list
1.3.30
Commit: e4a4f06
What's Changed
- feat: unified exec engine and job lifecycle (P0 foundation) by @Dushnilin in #62
Full Changelog: 1.3.29...1.3.30
1.3.29
🚀 Tachyon v1.3.29
В релизе v1.3.29 реализована поддержка UDP over TCP (XUDP) для стабильной работы real-time UDP-протоколов через TCP-туннель, добавлена расшифровка подписок Happ Crypt4 со сдвоенными HWID-заголовками, полностью переписана транзакционная система установки/обновления/отката компонентов, добавлен слой контент-хеширования и снапшотов для защиты пользовательских настроек DNS и удалённых списков, а также курируемый набор из 41 DPI-пресета, унифицированный DNS leak checker и новая диагностика DPI-провайдеров.
🌐 UDP over TCP (XUDP): новый режим кодирования пакетов
- Новая опция секции
packet_encoding(только приaction=connection): значения""(авто из ссылки сервера),xudp,packetaddr,disabled. - Инкапсуляция UDP в TCP-туннель сохраняет целостность UDP-датаграмм (фрагментация, идентификаторы потоков) без потерь — критично для QUIC, голосовых протоколов и STUN, которые ломаются при обычном TCP-проксировании.
- Генерация для sing-box: для VLESS/VMess создаётся/удаляется
packet_encoding; для Shadowsocks —udp_over_tcp: true. - Парсинг ссылок и подписок: VLESS/VMess читают алиасы
packetEncoding/packet_encoding/packet-encoding/packetencoding; в Clash-подпискахrecord.uot/udp_over_tcp/udp-over-tcpдля Shadowsocks превращается вudp_over_tcp. - Жёсткое значение по умолчанию GeoIP:
geoip_country_modeпереведён сincludeнаexclude; legacy-значениеnon-ruавтоматически мигрирует вexclude. - Новый регрессионный тест
tests/packet_encoding_uot.sh.
🔐 Расшифровка подписок Happ Crypt4 и сдвоенные HWID-заголовки
- Новый криптографический модуль
subscription/crypt4.uc: распознаётhapp://crypt4/...иcrypt4/..., извлекает payload (base64 → первые 16 байт = IV), расшифровывает AES-256-CBC (основной) и AES-128-CBC (fallback) с двухуровневым движком:opensslCLI, затем встроенная реализация AES на чистом ucode. - Перебор ключей: HWID пользователя, системный HWID (MD5 от MAC
eth0/br-lanили/etc/machine-id), встроенная сольHappDefaultSalt; ключ выводится как SHA-256. - Скачивание без HTTP-запроса:
download_subscriptionприis_crypt4(url)расшифровывает payload напрямую, а зашифрованное тело ответа расшифровывается перед атомарной записью (tmp + move). - Сдвоенные HWID-заголовки: клиент одновременно передаёт
X-HWIDиHWIDс одним значением. - Интеграция в парсер: crypt4-строки распознаются как share-link'и, рекурсивно нормализуются и корректно отличаются от списков URI.
- Новый тест
tests/subscription_happ_crypt4.sh(устойчив к отсутствиюopensslCLI).
🛠️ Транзакционная система установки/обновления/отката компонентов (components/action.uc)
- Единый слой
pkg_tx_*: все операции переведены на транзакции с жёсткими таймаутами (PKG_TX_INDEX_TIMEOUT=60,PKG_TX_DEPS_TIMEOUT=90,PKG_TX_REMOVE_TIMEOUT=90,PKG_TX_INSTALL_TIMEOUT=180,PKG_TX_SELF_UPDATE_TIMEOUT=420), стриминговым выводом логов и heartbeat. - Удалён опасный fallback: убраны
apk extractиtar -zxOf ... | tar -zx -C /изpkg_install_files_command— прямое распаковывание обходило package DB и maintainer-скрипты. - Проверки перед транзакцией:
preflight_storage_check()(место в/tmp) иpreflight_backup_space_check()(место под бэкап). - Стриминговые логи:
stream_command_output()заменяет буферизованное чтение; heartbeat каждые 5 секунд;normalize_stream_exit()корректно расшифровывает коды выхода. - Безопасная работа с APK-локом:
detect_apk_lock()/diagnose_apk_lock_holder()(поиск держателя через/proc/*/fd),pkg_tx_run_with_lock()ждёт до 60 с и использует compound timeout по неактивности. - Верификация после установки:
verify_package_post_install()иverify_binary_post_install(). - Защита от зависания:
run_logged()всегда ограничен таймаутом,bounded_command()используетtimeout -k 5либо shell-фолбэк; безопасная перезагрузкаflock-safeснимает зависшие держатели лока. - Фазы job'а в UI:
update_job_phase()/job_heartbeat(); фронтенд показывает бейдж фазы (package_index,waiting_package_lock,package_transaction,downloading,extracting,backup,verify). - Удаление legacy-пакетов:
install.shтеперь удаляетforkop/podkopдо установки APK (иначе APK отказывает поconflicts: tachyon).
🛡️ Защита пользовательских настроек: снапшоты dnsmasq, provenance PID sing-box, контент-хеши
- dnsmasq conflict-aware rollback (
dns/apply.uc): JSON-снапшот управляемых полей (server,noresolv,cachesize) сохраняется в/var/run/tachyon/dnsmasq-snapshot.json; при откате внешние изменения не затираются, а логируетсяDNS rollback conflict: ... preserving external value. - PID provenance sing-box (
service/state.uc): после запуска записывается{pid, start_ticks, launched_at}в/var/run/tachyon/sing-box.provenance; перед остановкой проверяетсяsing_box_is_foreign(), чтобы не убить чужой процесс sing-box. - Per-list content hash (
components/updates.uc): SHA-256 каждого скачанного списка сравнивается с сохранённым — неизменённые списки пропускаются. - Кэширование remote-списков секций:
import_remote_lists_from_all_sections()при включённомdownload_all_presetsкэшируетremote_domain_lists/remote_subnet_listsиз всех секций (plain-text, JSON, SRS).
🔍 Единый DNS Leak checker (diagnostics/leak_check.uc)
- Единая точка входа
run_leak_check_stages():check_ip_leak,check_dns_leakиrun_leak_checkсведены в один конвейер с хелперамиprobe_ip_paths,analyse_resolvers,ip_stage_result. - Точная классификация резолверов:
is_public_dns_resolverзаменена наclassify_resolverс точным lookup поKNOWN_PUBLIC_DNS_IPSи токен-матчингом ASN. - Исправлен
is_tcp_port_listening(): учитываются только loopback/wildcard-листенеры — корректно отражает связь с inbound sing-box. - Шесть вердиктов:
unavailable,service_unreachable,no_data,leaked,inconclusive,secure. proxy_onlineв DNS-контексте теперь означает реально прошедший DNS-запрос (query_ok), а не факт выдачи токена.
🎯 Курируемые DPI-пресеты сообщества (dpi-presets.json)
- 41 пресет: 19 для Zapret2, 16 для Zapret v1, 6 для ByeDPI из проектов
zapret4rocketиhomeproxy-hiddify, плюсtachyon-builtin. - Пользовательские пресеты: подключаются через
/etc/tachyon/dpi-presets-user.json. - Проверка blob-файлов: пресеты с
requires_blobsдоступны только при наличии fake-файлов. - CLI: команды
presets_infoиupdate_presets(поиск обновлений по зеркалам). - UI: фильтр по источнику и бейдж источника в Strategy Fuzzer.
- Новый тест
tests/dpi_presets.sh.
🩺 Диагностика: AI Doctor, шесть DPI-провайдеров, схлопывание симптомов
- Quick fix
restart_providers: перезапускает рантаймы WDTT, OLCRTC и FPTN одной командой. - Все шесть провайдеров в отчёте: Zapret, Zapret2, ByeDPI, WDTT, OLCRTC, FPTN всегда выводятся со статусом (включая
not installed/installed, not configured). - Все fix-коды в AI-промптах: системные промпты ИИ перечисляют полный список кодов авто-исправления.
- Схлопывание каскадных симптомов: при аварии WAN/sing-box зависимые сбои прикрепляются как симптомы к первопричине, а не как отдельные причины.
📋 Дашборд: скрытие N/A-серверов, память Tachyon, чистые статусы
- Новая опция
dashboard_hide_na_servers: скрывает серверы, настроенные, но отсутствующие в рантайме sing-box. - Потребление памяти Tachyon: виджет показывает суммарный RSS watchdog и telegram-бота.
- Мониторинг dnsmasq: память процесса и расчётный размер локального кэша.
- Чистые статусы:
Running/Stoppedзаменены на✓/✗; баннер обновления показывает переведённое сообщение вместо сырого лога. - Гармонизация AWG (AmneziaWG): унифицированная сворачиваемая карточка соединения со статусом и задержкой.
- Клонирование секций: кнопка Clone с суффиксом
(Copy). - Модальные окна: исправлена ширина на десктопе (
min(96vw, 1200px)).
🛡️ Изоляция маршрутизации и DNS провайдеров (FPTN, Tailscale)
- FPTN Command Shims: изолированный каталог
bin/с обёрткамиip,sed,iptables,ip6tables,resolvectl,chattr,systemctl— нейтрализуют подмену шлюза и DNS;PATHклиента подменяется при запуске. sanitize_system(): восстанавливаетresolv.conf, чистит паразитные DROP-правила iptables и «угнанный» default-маршрут в таблицеmain.- Таблица маршрутизации 4249 для трафика FPTN.
- Исправлено само-завершение супервизора FPTN: собственный PID сверяется с
supervisor.pid; авто-лечение маршрутов вstatus_json. - Tailscale: netfilter-изоляция tailnet (
100.64.0.0/10,fd7a:115c:a1e0::/48),--netfilter-mode=off, MagicDNS черезdomain_suffix: ["ts.net"], восстановлениеresolv.conf. - Исправлен
latency_boot_sweep(): корректный group-тег и уникальный job id (устранён краш при загрузке).
🎯 Локализация исключений GeoIP на уровне секций
- Изолированные исключения GeoIP: правила секций формируются как
type: "logical", mode: "and"сinvert: trueдля режимаexclude. - Гео-фильтр применяется ко всем правилам секции (домены, rule_set, ip_cidr, Discord voice, match_all).
- GeoIP для bypass-секций: опции
geoip_modeиgeoip_countryтеперь доступны для секций сaction=bypass. Можно задать, например,geoip_country=ru,geoip_mode=include, чтобы все RU IP шли напрямую. - Новый тест
tests/singbox_section_geoip.sh.
🔧 Исправление установки sing-box-extended compressed
- Фикс валидации UPX-сжатых бинарей:
validate_sing_box_extended_binary()теперь принимает параметрcompressed. Еслиsing-box versionне отвечает (UPX + Go runtime крэш), проверяется ELF-за...
1.3.28
🚀 Tachyon v1.3.28
В релизе v1.3.28 реализовано ключевое архитектурное исправление жизненного цикла перезапуска сервиса для защиты от DNS-отравления клиентских устройств, добавлена поддержка локального DNS-кэша высокой емкости, исправлена совместимость правил DNS с sing-box 1.14+, добавлена авто-санация пакетного менеджера APK (OpenWrt 25+), а также включен широкий комплекс улучшений для работы с текстовыми списками правил, обновленной системы автоподбора стратегий DPI и компонентов qWDTT / olcRTC / FPTN.
⚡ Непрерывность DNS при перезапуске (Защита от DNS-отравления клиентов)
- Устранена необходимость
ipconfig /flushdnsпосле рестарта Tachyon:- Ранее
restart()вызывалstop_impl(), который до остановки рантайма возвращалdnsmasqна системные DNS провайдера, а после старта снова настраивал127.0.0.42. В эту секундную паузу клиентские устройства (Windows, Android, iOS, SmartTV) успевали запросить домены (например, YouTube) через провайдера и закэшировать реальные заблокированные/замедленные IP-адреса. - Архитектурное разделение
stopиrestart: теперьrestart()вызываетstop_main()вместоstop_impl(). На всем протяжении перезапускаdhcp.@dnsmasq[0].serverгарантированно указывает на127.0.0.42. Клиентские устройства не получают некорректных ответов и не кэшируют заблокированные адреса.
- Ранее
- Атомарный перезапуск в
init.dиprocd:- В
/etc/init.d/tachyonиservice/initd.ucреализованы прямые хукиrestart_service()иrestart-service, предотвращающие стандартный для OpenWrtrc.commonфоллбэк наstop; start.
- В
- Локальный DNS-кэш в
dnsmasq(dns_local_cache):- Добавлена опция включения локального кэша
dnsmasqемкостью 10 000 записей (dns_cache_size), ускоряющая повторные DNS-запросы и защищающая от тайм-аутов при перезапусках ядра.
- Добавлена опция включения локального кэша
- Персистентность
cache.dbиdns_turbo_cache:- Исправлено переключение путей к базе FakeIP: при включении
dns_turbo_cacheпуть автоматически разрешается во flash (/etc/sing-box/cache.db), сохраняя соответствия FakeIP между перезагрузками роутера.
- Исправлено переключение путей к базе FakeIP: при включении
- Новый регрессионный тест:
- Добавлен тест
tests/service_restart_lifecycle.sh, строго валидирующий непрерывность привязки127.0.0.42при перезапуске, корректность отката DNS при остановке и сохранение состояния селекторов.
- Добавлен тест
🛠️ Совместимость с sing-box 1.14.1+ (Разделение DNS Query и Response правил)
- Устранена фатальная ошибка инициализации DNS-роутера:
- Полностью исключен сбой
Legacy Address Filter Fields in DNS rules is deprecated in sing-box 1.14.0 and will be removed in sing-box 1.16.0 ... Aborted, из-за которого ядро sing-box 1.14.x аварийно завершало работу при наличии комбинированных списков или списков подсетей сообщества (содержащих IP-подсети без явногоmatch_response: true). - Исправлен эвристический детектор типов rule-set: списки
antifilter-ipиcommunity-ipбольше ошибочно не классифицируются как доменные. - Все правила фильтрации по адресам вынесены в
dns_response_rule_set_tagsсо связкойaction: evaluate(на upstream DNS) иaction: routeсmatch_response: true.
- Полностью исключен сбой
- Устранено предупреждение
store_rdrc cache file option is deprecated:- Реализован прямой live-опрос версии бинарника (
sing-box version 2>/dev/nullи/usr/bin/sing-box version) с автосинхронизацией/etc/tachyon/sing-box-versionи целочисленным парсингом версий. - Для sing-box 1.14+ опция
store_rdrcзаменена на актуальнуюstore_dns: true, а также включен оптимистичный DNS-кэш (optimistic: { enabled: true, timeout: "3d" }).
- Реализован прямой live-опрос версии бинарника (
- Восстановлен
download_detourна удаленных наборах правил (remote rule-sets):- Снята блокировка
download_detourдля 1.14+: удаленные rule-sets гарантированно скачиваются через заданный прокси-аутбаунд на любых версиях sing-box.
- Снята блокировка
- Гарантированная инициализация
config.route.rule_set:- Добавлена превентивная инициализация массива rule-sets, исключившая ошибку
rule-set not found.
- Добавлена превентивная инициализация массива rule-sets, исключившая ошибку
📦 Менеджер пакетов APK (OpenWrt 25+ / Alpine) и надежность установки
- Автоматическая санация
/etc/apk/world:- Устранена ошибка
ERROR: unable to select packages: sing-box-extended (no such package): required by: world[...], блокировавшая установку и обновление пакетов на роутерах сapk-инфраструктурой, если пакетsing-box-extendedранее прерывался при установке из-за нехватки свободного места или заменялся сжатой версией (compressed). - В
install.sh,uninstall.shи бэкенд компонентов LuCI (action.uc) внедрена авто-санация спискаworldот фантомных записей до запуска транзакцийapk.
- Устранена ошибка
- Принудительная перезапись при fallback-распаковке (
apk extract):- Добавлен флаг
--force-overwriteвapk extract, предотвращающий ошибкуFile existsпри аварийном накате пакетов поверх существующих файлов.
- Добавлен флаг
- Защита от отключения сервиса при сбое обновления:
- В случае ошибки в процессе работы установщика
install.shтеперь автоматически восстанавливает и перезапускает демон Tachyon, если он был активен до начала обновления, исключая потерю доступа к интернету.
- В случае ошибки в процессе работы установщика
🛡️ Изоляция маршрутизации провайдеров и защита от сбоев WAN (FPTN)
- Защита основного шлюза WAN (
table main):- Добавлен сторожевой контроль таблицы маршрутизации
mainпри запуске демона FPTN: предотвращен перехват дефолтного системного маршрута клиентомfptn-client-cli, что исключило отвал физического WAN-интерфейса и потерю доступа к роутеру.
- Добавлен сторожевой контроль таблицы маршрутизации
- Fail-fast валидация пустых секций провайдеров:
- Внедрены канонические предикаты
section_has_routing_matchersиactive_provider_sections. Секции провайдеров (Zapret, Zapret2, ByeDPI, WDTT, OlcRTC, FPTN) без условий маршрутизации и без флагаmatch_allбракуются валидатором до запуска runtime и не запускают фоновые процессы.
- Внедрены канонические предикаты
📋 Нативная поддержка текстовых (.lst, .txt) и бинарных (.srs) списков правил
- Прямое использование простых списков:
- Поля
rule_setиrule_set_with_subnetsв настройках секций нативно принимают URL-ссылки и локальные пути к обычным текстовым спискам доменов и IP (.lst,.txt).
- Поля
- Встроенная компиляция на лету:
- Фоновый движок автоматически конвертирует plain-text списки в оптимизированный бинарный формат sing-box (
.srs) с помощью утилитыsing-box rule-set compileи сохраняет их в постоянном кэше/etc/tachyon/cache/rulesets/compiled/.
- Фоновый движок автоматически конвертирует plain-text списки в оптимизированный бинарный формат sing-box (
- Извлечение CIDR подсетей в nftables:
- Все обнаруженные в списках IP-подсети автоматически парсятся и добавляются в соответствующие nftables sets.
- Фоновое обновление через
list_update:- Периодический планировщик и команда
/usr/bin/tachyon list_updateинкрементально обновляют и перекомпилируют текстовые наборы правил.
- Периодический планировщик и команда
- Защита от сбоев sing-box:
- Предотвращен краш ядра sing-box с ошибкой
invalid sing-box rule-set fileпри пустых или некорректных списках: генерируется валидный минимальный бинарный стаб.
- Предотвращен краш ядра sing-box с ошибкой
🎯 Адаптивный фаззер стратегий DPI v2 (Probe v2) и Zapret2
- Двухэтапная верификация и стабилизация скоринга:
- Полностью переработан алгоритм подбора параметров обхода DPI в
fuzzer/: внедрена архитектура Probe v2, объединяющая разведочный зонд, оценку паттернов DPI и контрольное тестирование стабильности соединения.
- Полностью переработан алгоритм подбора параметров обхода DPI в
- Надежность демона Zapret2:
- Исправлен запуск демона фаззера zapret2, устранена проблема зависания фоновых процессов и реализована строгая изоляция задач (job isolation).
- Улучшена передача контекста в модуль автономного анализа AI Doctor.
🔒 Сетевая безопасность, DNS и защита от утечек
- Блокировка DNS SVCB / HTTPS (type 64 / 65) против обхода через ECH:
- В перехватчик DNS sing-box добавлено превентивное отклонение (
reject) запросов ресурсных записей типов SVCB и HTTPS. Это предотвращает автоматическое переключение современных браузеров на Encrypted Client Hello (ECH) и прямой QUIC в обход прокси и стратегий DPI.
- В перехватчик DNS sing-box добавлено превентивное отклонение (
- Расширение
disable_quicна все входящие интерфейсы:- Опция блокировки протокола QUIC (UDP/443) теперь применяется ко всем inbounds, гарантируя принудительный фоллбэк браузеров на стандартный TCP TLS.
- Изоляция исключений IP (
excluded_ips):- Исключаемые IP-адреса теперь строго локализованы в правилах целевой секции и не влияют на глобальную таблицу маршрутизации.
- Чистый детектор внешнего WAN IP:
- Исключено попадание виртуальных IP туннелей в список внешних адресов WAN, что устранило ложные уведомления о смене IP.
- Фильтрация Tailscale в диагностике:
- Инбаунды Tailscale исключены из ложных предупреждений сетевой безопасности о доступности служебных портов из публичной сети.
🛠️ Маршрутизация, Discord Voice и Smart Detect
- Discord Voice на подсетях Cloudflare (#55):
- В правила голосового UDP-трафика для подсетей Cloudflare (
sing-boxиnftables) добавлен диапазон портов19294–19344. - В дефолтный список голосовых подсетей включена
104.16.0.0/12.
- В правила голосового UDP-трафика для подсетей Cloudflare (
- Smart Detect: фильтрация прокси-секций (#56):
- Кандидатами для добавления проверенных доменов теперь выступают исключительно секции удалённого прокси (
connections.is_remote_proxy_action). Локальные и DPI-секции (zapret,zapret2,byedpi) исключены.
- Кандидатами для добавления проверенных доменов теперь выступают исключительно секции удалённого прокси (
- Разделение серверов с одинаковыми именами:
- Обеспечена корректная дифференциация серверов с идентичными именами, но разными типами транспорта (TCP, XHTTP, gRPC, WebSocket) в селекторах LuCI и генераторе маршрутов sing-box.
📦 Статус компонентов (OlcRTC, WDTT) и веб-интерфейс LuCI
- Корректное отображение OlcRTC и WDTT:
- Исправлено определение статуса для локально установленных пакетов
olcrtcиwdtt/qwdtt: теперь в веб-интерфейсе отображаются точная версия (например,0.1.3-r1) и статусУстановлен. - Разблокированы кнопки быстрого управления, переустановки и отката.
- Исправлено определение статуса для локально установленных пакетов
- Стабильность вкладки «Обновления»:
- Устранена ошибка преждевременн...
1.3.27
🚀 Tachyon v1.3.27: Маршрутизация трафика роутера, производительность Watchdog и устранение сетевых задержек
Релиз 1.3.27 представляет масштабный комплекс улучшений архитектуры runtime, оптимизации энергопотребления и фоновой нагрузки роутера, исправление критических задержек DNS в Sing-box, а также новую функциональность по маршрутизации собственного локального трафика роутера.
🌐 Новая функция: Маршрутизация собственного трафика роутера (Route Router's Own Traffic)
- Перенаправление локального трафика роутера через выбранную секцию:
- Назначение: Позволяет заворачивать исходящий сетевой трафик, генерируемый непосредственно самой операционной системой роутера (системные утилиты
wget,curl, пакетный менеджерopkg, встроенные торрент-клиенты Transmission/qBittorrent, TorrServer и локальные сервисы) через назначенную прокси-секцию Tachyon. - Архитектура Sing-box: Добавлен специализированный инбаунд
redirect-in(типredirect, порт1604,127.0.0.1) и автоматические правила маршрутизации, направляющие перехваченный трафик роутера в целевой outbound секции с защитой от зацикливания. - Интеграция с nftables: Встроена поддержка перехвата локально сгенерированного TCP-трафика роутера через
OUTPUT-цепочки без нарушения локальной связанности. - Удобное управление в LuCI: В веб-интерфейсе (вкладка «Настройки» → «Сеть») добавлены переключатель «Маршрутизировать собственный трафик роутера» и селектор целевой секции «Секция для трафика роутера».
- Поддержка в Telegram и UCI: Параметры
route_router_trafficиroute_router_traffic_sectionинтегрированы в схему валидации, синхронизацию состояния и управление через Telegram-бота. - Тестирование: Добавлен специализированный интеграционный тест
tests/route_router_traffic.sh, а также обновлены тестыtests/nft_apply.shиtests/runtime_state_predicates.sh.
- Назначение: Позволяет заворачивать исходящий сетевой трафик, генерируемый непосредственно самой операционной системой роутера (системные утилиты
⚡ Радикальная оптимизация сторожевого таймера (Watchdog & Runtime Performance)
- Разгрузка CPU и устранение тысяч холостых сетевых проверок:
- Суть проблемы: Ранее быстрый контур проверки (fast-tier) сторожевого таймера запускался каждые 15 секунд и жёстко вызывал как локальные проверки процесса, так и внешние сетевые зонды (
probe_proxyпорождалcurlчерез прокси, аprobe_dns— запросыnslookup). В сутки это создавало до 5 760 HTTP-запросов и 5 760 DNS-проверок даже при полностью стабильной сети, игнорируя заданные в интерфейсе параметры UCI (ai_proxy_health_interval=30иai_dns_interval=60). - Двухуровневый адаптивный мониторинг: Локальный контроль здоровья (PID,
/proc, состояние сокетов) сохранён на быстром тике (15 секунд). Внешние сетевые зонды теперь строго следуют интервалам из UCI: проверка прокси — раз в 30 секунд, проверка DNS — раз в 60 секунд. Это снизило число запросовcurlна 50%, а проверок DNS — на 75%. - Мгновенный Fast-Retry при сбоях: При первой же неудачной проверке сторожевой таймер временно переключается на учащённый опрос (10–15 секунд) вплоть до восстановления работоспособности. При автоматическом перезапуске сервисов счетчики сбоев и временные метки мгновенно сбрасываются в ноль (
reset_proxy_consecutive,reset_dns_consecutive), гарантируя проверку без ожидания полного интервала. - Единый снимок состояния (
tick_context): Ликвидированы многократные запускиpgrep -f /usr/bin/tachyon, повторные обходы/procи повторный опрос настроек UCI. На старте каждого тика состояние (singbox_pid, флагиreload_in_progressиlist_update_running, параметры настроек) кэшируется в shared-контекст и передаётся всем зондам, избавляя процессоры MIPS/ARM от сотен лишнихfork -> exec -> waitв минуту. - Троттлинг keepalive-штампа: Запись сторожевого файла
/var/run/tachyon_watchdog.keepaliveпереведена с 5-секундного тика на интервал раз в 30 секунд, снизив пробуждения CPU и лишний дисковый I/O в RAM на 83%.
- Суть проблемы: Ранее быстрый контур проверки (fast-tier) сторожевого таймера запускался каждые 15 секунд и жёстко вызывал как локальные проверки процесса, так и внешние сетевые зонды (
🛠️ Устранение зависания обновлений и задержек DNS (Fix Sing-box Mixed Proxy)
- Корректная маршрутизация служебных и смешанных прокси:
- Суть проблемы: В версии 1.3.26 для mixed (HTTP+SOCKS5) инбаундов были добавлены правила
action: "hijack-dns"по порту 53 и протоколуdns. На прикладных L7/L5 прокси-портах это вызывало перехват служебных сессий сниффером sing-box: при попытке скачать обновления компонентов (action.ucчерез127.0.0.1:4535) или резолве доменов соединения циклически перенаправлялись во внутренний DNS-движок sing-box и отваливались по 4-секундному таймауту (HTTP request via service proxy failed for https://api.github.com/...; retrying directly), а сайты в локальной сети открывались с ощутимой задержкой. - Решение: Правила
hijack-dnsполностью удалены со всех mixed-инбаундов (секционных, direct-bypass и служебных). - Прямой доступ к LAN (
ip_is_private: true): Правило прямого пропуска трафика к локальным адресам (direct-out) сохранено, гарантируя мгновенную доступность веб-интерфейса роутера (192.168.1.1:80), DoT/DNS роутера и локальных устройств без таймаутов.
- Суть проблемы: В версии 1.3.26 для mixed (HTTP+SOCKS5) инбаундов были добавлены правила
🚀 Read-Only Fast-Path и адаптивный UI Polling
- Облегчение работы веб-интерфейса во время выполнения фоновых задач:
- Суть проблемы: При выполнении любых операций (обновление списков, проверка версий компонентов, скачивание подписок) интерфейс LuCI переключается на частый опрос бэкенда каждые 500 мс (
/usr/bin/tachyon get_ui_state). Каждый такой запрос не только читал файл состояния, но и вызывалrefresh_action_dirs(), проводя поиск файлов и очистку устаревших директорий задач в/var/run/tachyon_actions/*. - Решение: Метод
get_ui_stateпереведён в строго легковесный read-only режим. Сборка мусора (GC) теперь запускается сразу по завершении фоновой задачи либо троттлится до 1 раза в 30 секунд по файлу-штампу/var/run/tachyon_action_dirs_refresh.stamp. - Адаптивный поллинг в LuCI: Внедрена динамическая подстройка частоты опроса состояния: 1с первые 4 секунды (быстрый отклик на запуск), 2с для длительных операций и автоматический возврат к 10с при завершении задачи.
- Суть проблемы: При выполнении любых операций (обновление списков, проверка версий компонентов, скачивание подписок) интерфейс LuCI переключается на частый опрос бэкенда каждые 500 мс (
🤖 Оптимизация Telegram-бота
- Мгновенный отклик на команды и сокращение TLS-сессий:
- Время long-polling в запросе
getUpdatesувеличено с 20 до 50 секунд (таймаутcurlскорректирован до 65 секунд, connection timeout 15 секунд). - Убран избыточный принудительный сон (
sleep) после успешного получения ответа. Бот теперь реагирует на команды пользователя мгновенно, а сон используется исключительно как пауза при ошибках сети (backoff). Число TLS-рукопожатий и накладные расходы на поддержание сессии сокращены более чем в 2 раза.
- Время long-polling в запросе
📺 Оптимизация воркера прямого обхода TorrServer
- Ликвидация холостого сканирования процессов и шелл-форков:
- Внедрено кэширование PID процесса TorrServer: пока
/proc/<cached_pid>/cmdlineуказывает на активный бинарник, полный поиск процессов черезfs.glob("/proc/[0-9]*/cmdline")опускается. - Внешний запуск шелла
system("sleep 60")заменён на нативную неблокирующую функциюsleep(60000)в ucode, исключив ежеминутное создание процессовsh.
- Внедрено кэширование PID процесса TorrServer: пока
🛡️ Стабильность сервиса и исправление дедлоков (Service Reliability & Hotfixes)
-
Устранение рекурсивного дедлока блокировки flock (
initd.uc):- Суть проблемы: При отложенном запуске сервиса во время ожидания WAN (
retry_start_on_wan_up) повторный вызов/etc/init.d/tachyon startприводил к попытке захвата блокировкиflock -x 1000вrc.common. Родительский процесс procd/init.d уже удерживал дескриптор блокировки, из-за чего сервис уходил в бесконечный дедлок. - Решение: Функция
retry_start_on_wan_upтеперь вызывает ядроBIN_PATH(/usr/bin/tachyon start_service) напрямую в обходrc.common, полностью исключая взаимную блокировку. - Изоляция дескрипторов: В функции
schedule_start_retryотложенный запуск переведён наbackground_command(), гарантированно закрывающий унаследованный файловый дескрипторfd 1000перед переходом в фоновыйsleep.
- Суть проблемы: При отложенном запуске сервиса во время ожидания WAN (
-
Защита crontab от непреднамеренного стирания (
updates.uc,parental_quota.uc):- Суть проблемы: Системная утилита
crontab -lв BusyBox при изначально пустом файле/etc/crontabs/rootзавершается с кодом ошибки 1. Из-за этого функция чтения возвращала пустую строку, приводя к затиранию существующих пользовательских задач cron при добавлении расписания обновлений или родительского контроля. - Решение: Чтение файла crontab переведено на безопасную работу через
fs.readfile().
- Суть проблемы: Системная утилита
-
Увеличение таймаута RPC установки компонентов в LuCI (
fe-app-tachyon):- Таймаут
COMPONENT_ACTION_RPC_TIMEOUT_MSувеличен с 10 до 45 секунд, что предотвращает появление ложных сообщений об ошибках таймаута в веб-интерфейсе при установке или обновлении компонентов черезopkgна устройствах со слабой или медленной флеш-памятью.
- Таймаут
🧪 Надежность и автотесты
- Добавлен тест
tests/route_router_traffic.shдля проверки маршрутизации трафика роутера. - Добавлен тест
tests/watchdog_adaptive_intervals.sh, проверяющий адаптивные интервалы, троттлинг keepalive, штамп UI и единый контекст watchdog. - Обновлен контракт в
tests/sing_box_runtime.sh, фиксирующий отсутствие правилhijack-dnsна mixed-инбаундах. - Все 150 бэкенд-тестов (
tests/run_all.sh) и 626 тестов фронтенда в CI/Docker успешно пройдены (100% pass rate).
1.3.26
🚀 Полная интеграция с OpenWrt SQM (CAKE / fq_codel) и защита Bufferbloat (Рейтинг A/A+)
- Гармонизация QoS-приоритизации и алгоритмов управления очередями CAKE:
- Суть проблемы: Ранее при совместной работе Tachyon и SQM (
luci-app-sqm/ CAKE) тесты Bufferbloat деградировали до оценок B или C. Причина заключалась в двух факторах: во-первых, включенный в OpenWrtflow_offloadingзаставлял установленные соединения идти мимо очередейtcна виртуальных интерфейсах (pppoe-wan,ifb), а во-вторых, маркировка чистых TCP ACK классомcs2в nftables конфликтовала с нативным механизмомack-filterCAKE и засоряла Tin 2 (видео-корзину в diffserv4). - Кооперативный режим QoS (
qos_priority_engine): В nftables сохранена приоритизация голосового (VoiceEF 0x2e) и игрового трафика (GamingAF41 0x22), направляющая пакеты в соответствующие высокоприоритетные корзины CAKE (Tin 0 / Tin 1). При активном SQM маркировка малых TCP ACK (cs2) автоматически опускается, передавая управление нативномуack-filterядра без избыточной модификации заголовков. - Диагностика и авто-лечение в AI Doctor (
doctor --fix, пункт 4b3): Добавлена проверка конфликтаflow_offloading '1'с очередями SQM. При обнаружении конфликта Doctor предлагает или автоматически применяет исправление (uci set firewall.@defaults[0].flow_offloading='0' + firewall reload), возвращая тестам Bufferbloat идеальный рейтинг A / A+ (дельта задержки < 1 мс при 100% утилизации канала). - Защита от некорректной привязки интерфейса: AI Doctor предупреждает пользователя, если очередь SQM ошибочно привязана к мосту LAN (
br-lan), и рекомендует правильный WAN-интерфейс (pppoe-wan/wan). - Обновление интерфейса LuCI: Опция режима QoS в настройках переименована в «Авто (кооперация с SQM/CAKE)» с подробной подсказкой.
- Суть проблемы: Ранее при совместной работе Tachyon и SQM (
🟣 Официальный пресет Twitch и отказоустойчивый CDN Fallback
- Бесперебойный стриминг и обход троттлинга видеопотоков Twitch:
- В перечень предустановленных сервисов добавлен официальный пресет Twitch, включающий все необходимые домены платформы (веб-интерфейс, GraphQL API, чаты IRC/WebSocket и HLS-стриминг видео:
ttvnw.net,jtvnw.net,twitchcdn.net,ext-twitch.tvи др.). - Реализован отказоустойчивый механизм CDN Fallback, предотвращающий падение качества трансляций и буферизацию при блокировках или троттлинге отдельных узлов распределительной сети доставки контента.
- В перечень предустановленных сервисов добавлен официальный пресет Twitch, включающий все необходимые домены платформы (веб-интерфейс, GraphQL API, чаты IRC/WebSocket и HLS-стриминг видео:
🏷️ Восстановление бейджей подписок в Dashboard и маршрутизация списков
- Отображение источников серверов и стабильность динамических списков:
- Восстановлены визуальные цветные бейджи с префиксами подписок на карточках серверов в дашборде LuCI, позволяющие с одного взгляда определить источник и провайдера ноды.
- Исправлена ошибка маршрутизации при динамическом применении правил пользовательских списков.
🌐 Синхронизация локализации LuCI (Утечки, QoS, Валидация)
- Актуализация каталогов переводов и интерфейса:
- Восстановлены и синхронизированы переводы для модального окна проверки утечек (Leak Check Modal), настроек QoS (DSCP) и валидации доменов.
- Устранены расхождения в ключах вызовов
_()и синхронизированы файлыtachyon.pot,tachyon.ru.poиcalls.json.
🎯 Фаззер стратегий DPI: надежность, устранение зависаний и корректный поиск стратегий
- Гарантированное завершение проверок и устранение зависаний:
- Суть проблемы: При углубленном комбинаторном тестировании Zapret 2 фаззер мог зависать навсегда на 85% (в частности, на стратегии #273
[Fake PAWS (tls_google, rep=8) + Multidisorder (pos=1)]). В стандартном OpenWrt / BusyBox утилита coreutilstimeoutотсутствует, из-за чего внешний сторожевой таймер не срабатывал, а синхронный DNS-резолверgetaddrinfoв musl libc блокировался при отбрасывании пакетов со стороны ТСПУ. Попытка временного сброса DNS-флагов приводила к тому, что после первой неудачной проверки все последующие стратегии (с 4 по 314) ошибочно маркировались как неработающие. - Нативный POSIX-таймаут (
wrap_cmd_timeout): Все вызовы зондовcurlи утилит диагностики обёрнуты в универсальный сторожевой процесс шелла BusyBox с принудительнымkill -9по истечении 8 секунд. Больше никаких зависаний дочерних процессов и бесконечных блокировок ввода-вывода. - Предкэширование IP и флаг
--resolve: Целевые хосты зондов разрешаются один раз при старте, после чегоcurlсоединяется напрямую по IP с флагами--resolve <host>:443:<ip>. Это исключило более 900 сетевых DNS-запросов во время прогона бенчмарка, снизило задержки и полностью защитило фаззер от провайдерских DNS-блокировок и DoH-дропов. - Устранение ложного сброса DNS-флагов: Удалена строка сброса DoH-флагов в памяти процесса. Фаззер снова штатно находит полное и нормальное количество рабочих стратегий под ТСПУ провайдера.
- Валидация параметров Multidisorder: Устранена генерация стратегий с невалидной одиночной позицией
pos=1(отбрасываемой функциейdelete_pos_1в Lua Zapret 2). Multidisorder теперь корректно использует валидные позиции (pos=2,1,midsld,midsld). - Штатная загрузка Lua-библиотек и блобов для Zapret v2 (
nfqws2): Устранена ошибкаDaemon nfqws2 failed to start (invalid arguments or missing Lua library)при бенчмарке стратегий Zapret 2. Фаззер теперь гарантированно находит встроенные Lua-библиотеки десинхронизации (zapret-lib.lua,zapret-antidpi.lua,zapret-auto.lua) в директориях Tachyon (/usr/lib/tachyon/providers/zapret2/lua/), подключает их через--lua-initдля каждого теста и корректно перенаправляет поток диагностики демона (stdout+stderr). - Контроль живости воркера (Liveness Check): Метод
get_fuzzer_state()теперь проверяет реальное состояние PID черезkill -0 <pid>. В случае неожиданного завершения воркера состояниеrunningавтоматически сбрасывается вfalse, исключая зависший индикатор прогресса в LuCI. - Оптимизация UI: Интервал опроса статуса фаззера в LuCI снижен с 600 мс до 1200 мс, снизив нагрузку на CPU роутера при передаче больших пакетов результатов вдвое.
- Суть проблемы: При углубленном комбинаторном тестировании Zapret 2 фаззер мог зависать навсегда на 85% (в частности, на стратегии #273
☕ Поддержка проекта и развитие (Donate Modal)
- Модальное окно поддержки автора:
- В интерфейс LuCI добавлено окно поддержки проекта с поддержкой сервиса CloudTips (карты РФ / СБП), а также популярных криптовалют (USDT TRC20/TON, TON, BTC, ETH) с удобным копированием адресов в буфер обмена.
🌐 Восстановление работы серверов роутера (Fix Server Inbound DNS & Routing)
- Штатная работа интернета и DPI-обхода при подключении к роутеру извне:
- Суть проблемы: При подключении к встроенным серверам роутера (Hysteria2, VLESS и др.) с мобильных устройств через сотовую сеть в браузере возникала ошибка «Нет интернета», а трафик YouTube шёл через Direct вместо секции Zapret (работали только прямые IP-подсети вроде Instagram). Причина заключалась в ограничении правила
hijack-dnsтолько локальным интерфейсомdns-inи пропуске правилaction: "resolve"при клонировании правил секций для серверных инбаундов. - Перехват DNS для серверов (
hijack-dns): Для инбаундов встроенных серверов добавлены правила перехвата DNS по порту 53 и протоколуdns, восстановив доступ в интернет из браузеров на мобильных клиентах. - Клонирование правил разрешения доменов (
action: "resolve"): В модульservers.ucдобавлено клонирование правил с действиемresolve, благодаря чему доменные секции Zapret/Byedpi корректно резолвятся для последующего перехвата пакетов в NFQUEUE. - Доступ к локальным сервисам роутера (
ip_is_private: true): При отключенной изоляции LAN клиенты встроенного сервера получают прямой доступ к управлению роутером (192.168.1.1) без таймаутов.
- Суть проблемы: При подключении к встроенным серверам роутера (Hysteria2, VLESS и др.) с мобильных устройств через сотовую сеть в браузере возникала ошибка «Нет интернета», а трафик YouTube шёл через Direct вместо секции Zapret (работали только прямые IP-подсети вроде Instagram). Причина заключалась в ограничении правила
🎧 Discord Voice UDP на Anycast Cloudflare и защита веб-трафика (Fix #50)
- Изоляция голосового трафика Discord без перехвата сторонних сайтов:
- Суть проблемы: Встроенные списки Discord содержали общие подсети Cloudflare Anycast (
104.16.0.0/12,172.64.0.0/13). В результате любой сторонний сайт, размещённый за Cloudflare (например,appstorrent.ru), непреднамеренно перехватывался секцией Discord, а Rule Tracer отображал расхождение. - Селективная маршрутизация по протоколу UDP и портам голосового шлюза: Подсети Cloudflare теперь применяются исключительно для голосового UDP-трафика Discord (порты
50000-65535,3478,19302,5000-5020) вnftablesиsing-box, исключая перехват веб-трафика (TCP 80/443). - Интеграция с Routing Rule Tracer: Трассировщик маршрутов в LuCI теперь учитывает фильтрацию Cloudflare-подсетей и корректно информирует о выделенной обработке голосового UDP.
- Выделенные шлюзы и API Discord (
162.159.128.0/21): Добавлено сохранение прямых маршрутов к выделенным диапазонам Discord в правилах ядра и nftables, исключающее сбои подключения голосовых каналов при фильтрации общих диапазонов Cloudflare Anycast.
- Суть проблемы: Встроенные списки Discord содержали общие подсети Cloudflare Anycast (
⚡ Оптимизация работы с sing-box-extended 2.7.1 (Устранение задержки >2 минут)
- Мгновенный старт и устранение конфликтов конфигурации:
- Совместимость с
store_rdrc: Для форкаsing-box-extendedавтоматически генерируется параметрstore_rdrc = trueвместоstore_dns, устраняя ошибку валидации схемы sing-box и циклический перезапуск ядра. - Устранение блокировки групп
urltest: Для сборок extended в группы автоматического выбора узла назначаетсяdefault = outbounds[0], благодаря чему проксирование активируется мгновенно без 2-минутного ожидания завершения полного цикла тестирования задержек всех нод. - Кэширование версии ядра: Чтение версии sing-box оптимизировано через дисковый кэш, предотвращая тяжелые вызовы
sing-box versionи распаковку UPX на роутерах со слабым CPU.
- Совместимость с
🛠️ Фаззер стратегий: синхронизация формы LuCI (Fix Unsaved Changes)
- Устранение рассинхронизации настроек и отката стратегий:
- После успешного применения стратегии из модального окна фаззера страница автоматически обновляется с выводом уведом...
1.3.25
Tachyon 1.3.25
🛡️ Критическое исправление: устранение коллизии сокетов DNS (sing-box ↔ dnsmasq)
- Устранение паразитного перехвата UDP-трафика и зависания системного резолвера:
- Суть проблемы: Ранее в
singbox/route.ucперехват DNS конфигурировался глобальными правилами{ action: "hijack-dns", port: 53 }и{ action: "hijack-dns", protocol: "dns" }без фильтрации по интерфейсам входа (inbound). Из-за этого любой DNS-трафик, попадающий в прозрачный прокси TPROXY (tproxy-inиtproxy6-in), захватывался ядром sing-box. В режиме прозрачного прокси sing-box создавал сокеты с флагомSO_REUSEADDRдля transparent write-back пакетов, порождая паразитную коллизию с локальнымdnsmasq, слушающим порт:53на роутере. Ядро Linux случайным образом доставляло входящие UDP-датаграммы в сокеты sing-box, находившиеся в состоянииUNCONN, где они накапливались в очереди приёма (Recv-Q > 0) без обработки, вызывая периодическую потерю DNS-ответов у клиентов LAN и деградацию сети. - Архитектурное решение в
singbox/route.uc: Правилоhijack-dnsтеперь строго ограничено локальными выделенными DNS-инбаундами:dns_hijack_inbounds = [ runtime_constants.DNS_INBOUND_TAG ](dns-in,source-dns-inи диагностическиеdns-health-*-in). Входящий трафик сtproxy-inиtproxy6-inбольше не попадает вhijack-dns, полностью исключая конфликт сокетов на уровне ядра. - Корректная обработка DoH-блокировок: Прямые обращения клиентов к внешним резолверам на порт 53 (например,
8.8.8.8:53) больше не захватываютсяhijack-dns, а штатно попадают в терминальное правилоrejectпри активной опции блокировки DoH/сторонних DNS (block_doh).
- Суть проблемы: Ранее в
🎯 Аппаратная маршрутизация по MAC-адресам устройств и устранение сбоя sing-box
- Поддержка MAC-адресов в полной маршрутизации (
fully_routed_ips) и фильтре устройств (source_ip_cidr):- Устранение критического сбоя запуска: При выборе устройства по аппаратному MAC-адресу (
AA:BB:CC:DD:EE:FF) генератор маршрутов ранее передавал неразрешённый MAC напрямую в полеsource_ip_cidrsing-box. Это приводило к фатальной ошибке парсераnetip.ParsePrefix: no '/'и невозможности запуска Tachyon. - Нормализатор адресов в
core/ip.uc(normalize_to_cidrs): Добавлен механизм автоматической трансляции MAC-адресов в актуальные IP-адреса устройства (/32и/128) с опросом/tmp/dhcp.leases,dnsmasq.leases,/proc/net/arp, статических арендuci dhcp host, а такжеodhcpd.leases. Одиночным IP автоматически выставляется корректный префикс/32//128. Если устройство сейчас оффлайн, сырой MAC безопасно опускается для sing-box, гарантируя стабильный старт. - L2-захват трафика в nftables (
nft/apply.uc): Для правил принудительной маршрутизации внедрена прямая генерация правилether saddr <mac> meta mark set <mark>в цепочкеmangle prerouting. Сетевой стек ядра захватывает пакеты целевого устройства на канальном уровне Ethernet независимо от смены или динамического обновления IP-адреса. - Валидация в LuCI и бэкенде: Валидатор
validator.ucи поле вводаvalidateSubnet.tsтеперь нативно принимают и верифицируют MAC-адреса.
- Устранение критического сбоя запуска: При выборе устройства по аппаратному MAC-адресу (
📊 Надежный Дашборд: работа на подчинённых роутерах, HTTPS и единый интерфейс
-
Отказоустойчивость виджетов на точках доступа (AP / Dumb Switch) и при HTTPS:
-
Проблема: Виджеты скорости, суммарного трафика и системных ресурсов зависели исключительно от прямого соединения браузера с WebSocket Clash API (
ws://...:9090). На вторичных роутерах без стандартного интерфейса LAN или при открытии LuCI по защищенному протоколу HTTPS браузер блокировал WebSocket (ошибка Mixed Content либо биндинг на loopback127.0.0.1), из-за чего виджеты зависали в скелетон-загрузке или падали в статус «Временно недоступно». -
Бесшовный RPC-фоллбек в
initController.ts: При недоступности прямого сокета дашборд автоматически переходит на периодический опрос роутера через LuCI RPC (getClashApiConnections), парсит суммарный трафик, память и вычисляет дельту скорости ($\Delta\text{bytes} / \Delta t$ ) в реальном времени. Дашборд стабильно работает в любых топологиях сети. -
Привязка
0.0.0.0:9090вgenerator.uc: Если адрес прослушивания не задан явно,external_controllerбиндится на все локальные интерфейсы.
-
Проблема: Виджеты скорости, суммарного трафика и системных ресурсов зависели исключительно от прямого соединения браузера с WebSocket Clash API (
-
Единое наименование «Дашборд» во всех локалях:
- В словарях
tachyon.ru.poиluci-app-tachyon/po/ru/tachyon.poперевод вкладки унифицирован к названию «Дашборд» (ранее в ряде тем отображалось устаревшее «Панель управления» или «Информационная панель»).
- В словарях
🩺 Диагностика и самовосстановление: новые проверки в AI Doctor
- Детектирование и авто-устранение коллизии на порту 53 (
Port 53 Socket Collision):- В модуль
diagnostics/runtime.ucдобавлена глубокая диагностика сокетов ядра через утилитуss(ss -u -a -e -n 'sport = :53'). Проверка находит зависшиеUNCONNсокеты sing-box с ненулевымRecv-Q, перехватывающие UDP-пакеты уdnsmasq. - В режиме исправления (
tachyon doctor --fix) выполняется мягкий перезапуск службы sing-box, мгновенно очищающий паразитные сокеты и очереди без нарушения общих таблиц маршрутизации.
- В модуль
- Автоматическое устранение конфликта с DNAT-правилом
dnsmasq dns_redirect:- Добавлена проверка параметра
dhcp.@dnsmasq[0].dns_redirect. Если опция включена (1), межсетевой экранfirewall4генерирует DNAT-правило, перенаправляющее внешние DNS-пакеты на:53адрес роутера. В сочетании с TProxy-маркировкой Tachyon это приводило к перезаписи адреса назначения на192.168.1.1:53и циклической коллизии. - Режим
doctor --fixавтоматически выставляетdns_redirect='0', фиксирует UCI-конфигурацию и перезапускаетdnsmasq.
- Добавлена проверка параметра
🚀 Новые специализированные провайдеры обхода DPI: WDTT и OlcRTC
- WDTT (WireGuard-over-TURN / qwdtt):
- Обход блокировок протокола WireGuard: Реализован провайдер для скрытного туннелирования трафика через TURN/STUN-серверы (включая медиа-шлюзы видеозвонков VK), маскирующий WireGuard-сессии под легитимный голосовой и видеопоток.
- Архитектура sidecar-сервиса: Написан бэкенд жизненного цикла (
providers/wdtt/common.uc,validator.uc,runtime.uc) для контроля процессовqwdtt-clientиwdtt-client. Демон запускает изолированный локальный SOCKS5-прокси, в который sing-box перенаправляет трафик назначенных секций правил. - Конфигурация в UCI и LuCI: Поддержка параметров пиров/URI, режима фильтрации (
mode:selectiveилиall), генерации и ротации хэшей (workers,max_hashes), MTU (default_mtu: 1280), интервала обновления (refresh), подавления DoH и выбора движка (qwdtt_mode). - Интеграция в экосистему: Реализована автоматическая установка, подбор релизов под архитектуру роутера, автообновление и откат версий (
updater.uc,action.uc), а также вывод статуса в Telegram-боте (/info) и поддержка в механизме failover.
- OlcRTC (TCP-over-WebRTC Tunnel):
- Скрытная передача трафика через WebRTC: Провайдер обхода жестких белых списков и DPI-фильтрации через WebRTC DataChannel под видом участия в видеоконференциях (платформы на базе Jitsi Meet и др.).
- Полный стек управления: Модули
providers/olcrtc/common.uc,validator.uc,runtime.ucс валидацией конфигурации (room_id,crypto_key,transport,socks_host,socks_port,dns_server) и динамическим созданием outbounds в sing-box. - Автоматизация: Включение OlcRTC в пул кандидатов механизма переключения при отказе (
service/failover.uc) и интеграция с панелями статуса.
🎯 Адресная маршрутизация: исключения по MAC-адресам для каждой секции (Per-Section MAC Exclusions)
- Исключение устройств на уровне отдельных правил:
- Ранее: Опция
excluded_ipsв правилах секций принимала исключительно IPv4/IPv6 адреса и CIDR-подсети. При изменении IP-адреса устройства по DHCP исключение теряло актуальность. - Поддержка MAC в ядре и nftables (
nft/apply.uc): Параметрexcluded_ipsтеперь нативно поддерживает ввод аппаратных MAC-адресов клиентов (AA:BB:CC:DD:EE:FF). Функцияnft_section_excluded_saddrsна лету разрешает MAC-адреса в актуальные IP через ARP/DHCP (core_ip.resolve_mac_to_ips()) и внедряет правила исключенияsaddr != { ... }прямо в цепочки межсетевого экрана. - Маршрутизация в Sing-box (
singbox/generator_routes.uc): Функцияadd_excluded_ips_ruleдинамически транслирует MAC-адреса в/32и/128адреса, генерируя правила безусловного прямого выхода вdirect-outв обход туннелей секции. - Интерфейс LuCI (
section.js): Добавлен выбор устройств по MAC из активной таблицы клиентов сети с автоматической валидацией.
- Ранее: Опция
🌐 Изолированный DNS для правил: маршрутизируемый резолвер (Per-Section Routed DNS)
- Выделенный DNS-сервер для каждой секции правил:
- Изоляция и защита от утечек: Для любой секции теперь можно включить индивидуальный DNS-сервер (
routed_dns_enabled,routed_dns_type,routed_dns_server). Запросы к нему отправляются строго через прокси-выход этой конкретной секции (detour = outbound_tag). - Поддержка современных протоколов шифрования: Выбор между стандартными UDP/TCP и защищёнными протоколами DoT (TLS), DoH (HTTPS), DoQ (QUIC) и HTTP/3.
- Интеграция с nftables и Sing-box: Sing-box генерирует изолированный DNS-сервер
<section>-routed-dns-server, а подсистемаsource-aware DNSвnft/apply.ucперехватывает DNS-запросы устройств данной секции и направляет их в инбаундsource-dns-in, гарантируя открытие гео-специфичных ресурсов без DNS-спуфинга провайдером.
- Изоляция и защита от утечек: Для любой секции теперь можно включить индивидуальный DNS-сервер (
⚡ Мгновенная калибровка задержек при старте (Boot Latency Sweep)
- Ликвидация слепой зоны после перезагрузки роутера:
- Суть проблемы: Ранее при старте роутера группы автоматического выбора лучшего прокси (
urltest) не имели данных о задержках нод вплоть до первого интервального теста или ручного замера пользователем, из-за чего трафик мог направляться на медленный или недоступный сервер. - **Реали...
- Суть проблемы: Ранее при старте роутера группы автоматического выбора лучшего прокси (
1.3.24
🔧 Исправление Pre-NAT NFQUEUE для Zapret/Zapret2 с портами и подсетями
- Устранение сбоя десинхронизации DPI для трафика с портами (STUN, Discord RTC, VoIP):
- Критическое исправление в
nft/apply.uc: В функцииnft_add_section_priority_rules_from_sectionsубрано принудительное переопределениеsec_markдля секцийzapretиzapret2с портами и подсетями. Ранее эти секции получали метку0x02000000 + idxвместо стандартногоfakeip_mark(0x04000000), что приводило к полному обходу TPROXYsing-box. - Патч потока пакетов: При наличии портов/подсетей в секции Zapret пакеты клиентов LAN теперь корректно маршрутизируются:
prerouting→ TPROXYsing-box→ outbound сrouting_mark→mangle_output(Post-NAT) → NFQUEUE. Ранее пакеты попадали вmangle_forward(Pre-NAT), из-за чего фейковые пакетыnfqws2содержали серый адрес клиента (192.168.1.x) и отбрасывались провайдером (BCP 38 / RFC 2827) или правилом!fw4: Prevent NAT leakage. - Подтверждение: Тестирование на провайдере Farline (ТСПУ блокирует Google STUN / Discord RTC) — до исправления 100% потеря пакетов (
FAIL: timed out), после — 5 из 5 SUCCESS (41.5–48.0 мс). - Секции Zapret с доменными списками (
community_lists) не затронуты — они всегда работали корректно через FakeIP → TPROXY →mangle_output.
- Критическое исправление в
🛡️ Диагностика Zapret2: проверка маршрутов sing-box
- Добавлена проверка
routes_configuredв dedicated check:- В
runZapret2Check.tsдобавлен 8-й check item «Zapret2 sing-box route rules are configured / not configured». Ранее dedicated check проверял толькоoutbounds_configured, но неroutes_configured, из-за чего секции без маршрутизационных правил (нет доменов, подсетей, портов) показывали зелёный статус, хотяserviceStatus.readyбылfalse.
- В
🛡️ Стабильность Zapret2, nftables и Sing-box: устранение сбоев запуска и краш-лупов
- Sing-box 1.14+: исправление схемы
http_clients[].detourи устранение сбоев запуска:- Критическое исправление: устранено ошибочное имя поля
dial_detourв объектеhttp_clients, вызывавшее фатальный сбой валидации конфигурации ядра sing-box 1.14+ (json: unknown field "dial_detour". Aborted) и падение службы при старте. Заменено на валидное полеdetour. - Добавлены строгие регрессионные тесты в
tests/ruleset_download_detour.sh, валидирующие сгенерированный конфиг ядра черезsing-box checkи гарантирующие отсутствие устаревших полей. - В веб-интерфейсе LuCI название списка
Blockуточнено какBlock (RKN)(Реестр РКН), что исключает коллизию с действием «Блокировать» родительского контроля. - Исправлен хинт доменов для списков контента для взрослых в
section.js(pornhub.com).
- Критическое исправление: устранено ошибочное имя поля
- Устранение краша запуска Zapret2 (
left-hand side is not a function):- В
providers/zapret2/common.ucдобавлен защитный хелперsafe_str(), исключающий падениеprepare_strategy_args()при отсутствии методаas_string. - Устранена ошибочная повторная инъекция
--filter-tcp=443для UDP-правил (QUIC/WireGuard desync). - В
providers/nfqueue/runtime.ucпадение одного правила в секции сделано некритичным (best-effort): секция не откатывает остальные работающие правила, если хотя бы часть стратегий успешно запущена.
- В
- Устранение
rawsend: sendto: Operation not permitted(EPERM) в nftables при рестарте:- В
nft/apply.ucдобавлена таблицаraw_outputс правиламиnotrackдля пакетов десинхронизации (meta mark & 0x40000000 == 0x40000000и0x20000000), а также для UID демоновskuid { 2147483647, 65534 }(musl / nobody). Это гарантирует, что raw desync-пакеты не сбрасываются фильтромct state invalidпри сбросе таблицы conntrack или рестарте службы. - В цепочки
mangle_outputиmangle_forwardдобавлены правилаcounter returnдля байпаса повторной фильтрации desync-трафика. - Внедрено динамическое разрешение исполняемых файлов
nfqwsиnfqws2по всем поддерживаемым путям OpenWrt (/opt/zapret2/nfq2/nfqws2,/opt/zapret2/nfq/nfqws2,/opt/zapret2/nfqws2,/usr/bin/nfqws2). - В
service/reload.ucобеспечен флагneeds.nft_rebuild = trueпри изменении состояния zapret и zapret2.
- В
- Предотвращение конфликта демонов и порчи nftables при установке
zapret2:- В
components/action.ucперед установкой APK/IPK пакетаzapret2конфигурационный файл/etc/config/zapret2предварительно инициализируется сoption enabled '0'черезcore.uci. Это предотвращает автоматический запуск встроенного в апстрим-пакет демона с некорректными шаблонами правил IPv6 (::1 Name has no usable address), которые ранее приводили к broken pipe и обрыву соединений.
- В
- Sing-box: устранение краш-лупа при ранней загрузке rule-sets через
mieru:- В
singbox/generator_routes.ucреализована функцияis_mieru_detour()и усилена валидацияis_valid_detour(). Протоколmieruи группы селекторов/urltest с участиемmieruкатегорически исключаются из назначения в качествеdownload_detourиhttp_clients[].detour. Это устраняет фатальный крах ячеекmieru.Outbound(SIGSEGV / panic), вызывавшийся попыткой ранней загрузки списков до инициализации клиентского пула.
- В
📦 Отказоустойчивая установка версий компонентов (Docker, OpenWrt 23.05 OPKG и 24+/25+/Snapshot APK v3)
- Установка конкретных версий по тегу (Single Release JSON):
- В
updater.ucисправлен крах выбора ассетов при установке конкретной версии по тегу: GitHub API для/releases/tags/<tag>возвращает одиночный объект вместо массива, из-за чегоarray_or_empty()возвращал пустой список и селектор завершался ошибкой 404. Внедрена нормализацияreleases_array_or_wrapped(), а также снята ошибочная блокировка поprereleaseпри установке явно выбранного тега.
- В
- Совместимость с
uclient-fetchна OpenWrt 23.05:- Заменён неподдерживаемый в OpenWrt 23.05 флаг
wget --header=User-Agent:...на универсальный флаг-U "Tachyon-OpenWrt", исключающий ошибкуwget: unrecognized option: header=...при обращениях к GitHub API.
- Заменён неподдерживаемый в OpenWrt 23.05 флаг
- Отказоустойчивость при недоступности внешних репозиториев (Snapshot kmods):
- Обновление списков пакетов (
apk update/opkg update) переведено в режим best-effort. Сбои и 404 на сторонних или snapshot-репозиториях ядерных модулей больше не прерывают аварийно установку компонентов.
- Обновление списков пакетов (
- Каскадный fallback установки пакетов при несовпадении хэшей ядра в APK v3:
- На OpenWrt 24+/25+/Snapshot при отказе
apk addиз-за несовпадения хэшей ядерных модулей (kmod-nft-queue,kmod-tun) Tachyon автоматически переключается наapk extract --destination /, гарантированно распаковывая бинарники и конфигурации без жесткой привязки к онлайн-репозиторию ядра. - Для систем с
opkgреализован аналогичный аварийный распаковщик через прямое извлечениеdata.tar.gz. - В
core/packages.ucфункции определения статуса и версий (installed,version) научены физически проверять наличие бинарников (nfqws,nfqws2,ciadpi,sing-box) и считывать их версию через--version, обеспечивая корректное отображение версий даже при аварийной распаковке.
- На OpenWrt 24+/25+/Snapshot при отказе
- Автоматическое создание системных каталогов
/var/lockи/tmp/run:- Устранено падение
opkgи postinst-скриптов procd в чистых системах и rootfs-контейнерах из-за отсутствия/var/lock/opkg.lockи/var/lock/procd_rpcd.lock.
- Устранено падение
- Исправление резервного шаблона скачивания Zapret:
- При недоступности GitHub API фоллбэк ссылки на скачивание архива
remittor/zapret-openwrtформировал некорректный URLzapret_<tag>_openwrt_<arch>.zip. Шаблон исправлен на правильныйzapret_v<tag>_<arch>.zip.
- При недоступности GitHub API фоллбэк ссылки на скачивание архива
- Парсинг версий ByeDPI в APK v3:
- В
providers/byedpi/runtime.ucреализовано прямое чтение версии установленного пакета из выводаapk list --installed byedpi.
- В
- Устранение обрезания ошибок фонового воркера (Near here caret):
- Устранен срез последней строки
stderr(Near here ---^) при падениях ucode; парсер теперь возвращает осмысленное описание ошибки с указанием имени файла и строки.
- Устранен срез последней строки
- Синхронизация сигнатур перезагрузки:
- В
state.ucсигнатуры отслеживания изменений сервиса теперь учитывают секцииschedule,profileиguest_mode, исключая ложные срабатывания и пропуски перезагрузок.
- В
🎯 Исправление маршрутизации Zapret/Zapret2 и отображения соединений в Мониторинге
- Устранение сбоя прямого desync-обхода и расхождения с Трассировщиком правил:
- Разрешение реальных IP (
action: "resolve"): Устранена критическая проблема, из-за которой трафик доменов, назначенных на Zapret (например, YouTube /googlevideo.com), не проходил через desync и уходил в VPN. Ранее sing-box отправлял пакеты на FakeIP (198.18.x.x) напрямую в интерфейс WAN, что приводило к сбросу соединения и откату браузеров/приложений на прямые IP, пролетавшие мимо доменных правил Zapret в следующую секцию (VPN). Теперь дляzapretиzapret2автоматически создаются правила разрешения FakeIP в реальные IP-адреса черезdns-serverперед передачей в desync-очередьnfqws/nfqws2. - Сниффинг доменов для IPv6 (
tproxy6-in): Интерфейсtproxy6-inдобавлен в перечень входящих соединений для сниффинга (sniff_inbounds), гарантируя перехват TLS SNI и HTTP Host для IPv6-трафика. - Защита от утечки загрузки правил (Ruleset Detour): Аутболды с роутинг-марками (
routing_mark != null) больше не могут быть выбраны в качествеdownload_detour. Это исключает попытки скачивания.srs-списков правил с GitHub через desync-модуль Zapret. - Корректное отображение маршрутов на вкладке «Мониторинг»: Исправлено сопоставление тегов соединений в интерфейсе LuCI. Именованные субаутболды (
vpn-priority-1-out,vpn-json-1-out,vpn-interface-1-outи др.) теперь безошибочно привязываются к имени своей секции, а для резервных маршрутов отображается статусFailoverвместо сырых тегов или прочерков.
- Разрешение реальных IP (
🛡️ Устранение таймаута теста утечек IP и DNS в LuCI («XHR request tim...
1.3.23
🛡️ Гостевой режим (Guest Mode) и сетевая изоляция
- Полная изоляция локальной сети и защиты роутера:
- Гостевые устройства получают доступ строго во внешнюю сеть (WAN/Интернет).
- Доступ к локальным приватным подсетям (RFC1918:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16, CGNAT100.64.0.0/10и локальные IPv6 диапазоны) надежно блокируется на уровне ядра (nftables forward drop). - Доступ к портам администрирования роутера (веб-интерфейс LuCI 80/443, консоль SSH 22, Clash API 9090 и локальные служебные порты) блокируется в цепочке
guest_input, при этом гарантированно сохраняется доступ к жизненно важным сервисам: выдаче IP-адресов по DHCP (UDP 67/68), разрешению DNS (UDP/TCP 53) и сетевой диагностике (ICMP echo / IPv6 ND).
- Два режима политик доступа:
selected(Явный список): администратор указывает конкретные устройства (по MAC или IP), которые изолируются как гостевые.inverted(Нулевое доверие / Zero-Trust): администратор указывает доверенные (мастер/домашние) устройства с полным доступом к LAN и роутеру. Все остальные устройства (включая любых новых гостей, подключившихся по Wi-Fi или проводу) автоматически становятся гостевыми.
- Суточные квоты и контроль времени:
- Лимит времени в день (
daily_time_limit): автоматический подсчет активных минут в сети для каждого гостевого устройства. При превышении суточного лимита доступ блокируется до полуночи. - Лимит трафика в день (
daily_traffic_limit): точный аппаратный учет переданных байт вnftables(скачивание/отдача). При превышении квоты мегабайт устройство блокируется до полуночи. - Расписание доступа: ограничение активных часов (например,
08:00–22:00) и дней недели для гостевых клиентов. - Автоматический сброс: в полночь квоты автоматически сбрасываются без необходимости перезагрузки роутера.
- Лимит времени в день (
- Уведомления и управление:
- Мгновенные оповещения в Telegram администраторам при исчерпании устройством суточной квоты времени или трафика.
- Команды Telegram-бота:
/guest(быстрый статус гостевого режима и список изолированных устройств) и/guest_toggle(мгновенное включение/отключение гостевого режима).
- Веб-интерфейс LuCI и полная русская локализация:
- Выделенная вкладка Гостевой режим в веб-интерфейсе с автодополнением устройств из активной ARP/DHCP таблицы роутера (поддержка привязки по постоянному MAC-адресу или IP).
- Устранена ошибка рендеринга пустой вкладки («Гостевой режим» отображал только карточку без настроек): исправлены отсутствовавшие JS-валидаторы IP/MAC и времени, добавлен синтез секции
guest_modeв память LuCI при загрузке карты настроек. - Добавлены полные русские переводы (30 ключей локализации) для всех параметров гостевого режима: переключателя, селектора политик, суточных квот, расписаний и уведомлений.
🌐 Исправление смены языка и форматирования в Telegram-боте
- Устранение ошибки смены языка (
Repetition not preceded by valid expression):- В ucode регулярные выражения компилируются по стандарту POSIX Extended, где non-capturing группы
(?:...)не поддерживаются, а знак?непосредственно после(воспринимался парсером как некорректный квантификатор повторения. - Регулярное выражение команды смены языка исправлено на совместимое со стандартным захватом группы:
/^\/(lang_set|lang|language)[ \t]+([a-zA-Z0-9_-]+)/.
- В ucode регулярные выражения компилируются по стандарту POSIX Extended, где non-capturing группы
- Устранение бага форматирования строк (
Current language: %s):- В ucode функции не имеют объекта JavaScript
arguments. Из-за проверкиlength(arguments) > 1подстановка параметров черезsprintfне выполнялась, и бот отдавал сырой шаблон%s. - В модуле
i18n.ucфункцияbindпереведена на rest-параметры(...args)с корректным вызовомsprintf(val, ...args).
- В ucode функции не имеют объекта JavaScript
- Поддержка текстовых команд и кнопок:
- Добавлена прямая поддержка команд
/lang ru,/lang en,/language ruнаряду с кликами по inline-кнопкам.
- Добавлена прямая поддержка команд
- Мгновенное применение перевода:
- Функция смены языка немедленно обновляет привязку
t = i18n.bind(lang)для текущей активной сессии и динамически обновляет системное меню команд Telegram (setMyCommands) на выбранном языке.
- Функция смены языка немедленно обновляет привязку
🚀 Защита от краш-лупа при «холодном старте» и чистой установке (Fix: Missing Community Rulesets)
- Устранение «мертвой петли» (deadlock) при первом запуске:
- Ранее на чистой системе или после полного сброса роутера («зачистил до блеска»), если в секциях были настроены комьюнити-листы (
russia_inside,youtube,discordи др.), sing-box генерировалtype: "remote"и пытался скачать списки напрямую с GitHub до поднятия сервисов и прокси. - Из-за блокировок/замедления GitHub со стороны ТСПУ или неготового туннеля sing-box падал с фатальной ошибкой:
FATAL start service: initialize rule-set[0]: Get "...": EOF, уходя в бесконечный цикл паденийprocd: Instance in a crash loop 7 crashes, из-за чего прокси и сеть так и не поднимались.
- Ранее на чистой системе или после полного сброса роутера («зачистил до блеска»), если в секциях были настроены комьюнити-листы (
- Локальные валидные stub-заглушки (
empty.srs):- В состав пакета включен универсальный 17-байтовый бинарный stub набора правил (
/usr/share/tachyon/rulesets/empty.srs), валидный для всех версий sing-box (включая tiny, extended и lx). - На этапе инициализации
prepare_community_rulesetsсистема гарантирует наличие локального файла правил в/tmp/sing-box/rulesets/. Если список ещё не скачан и прямое соединение недоступно, создаётся локальная заглушка. - Конфигуратор sing-box переключает списки на
type: "local", позволяя демону стартовать за 0.00с без единого сетевого запроса к GitHub!
- В состав пакета включен универсальный 17-байтовый бинарный stub набора правил (
- Фоллбек на веб-прокси (gh-proxy) и компонентные прокси:
- На этапе предзагрузки списков и при плановом фоновом обновлении система пробует быстрые зеркала и веб-прокси (
gh-proxy.com,ghproxy.net), устойчивые к ТСПУ, пропуская неработающий для релизов jsdelivr. - Если в UCI настроен
download_components_via_proxy, загрузчик списков автоматически использует его в качестве фоллбека для комьюнити-листов. - Сразу после старта sing-box фоновый воркер Tachyon скачивает полные актуальные списки через работающий туннель и бесшовно обновляет sing-box без обрыва соединений.
- На этапе предзагрузки списков и при плановом фоновом обновлении система пробует быстрые зеркала и веб-прокси (
🚀 Исправление маршрутизации UDP для HTTP Outbounds (#45)
- Устранение спама в системный журнал:
- Исправлена ошибка
router: UDP is not supported by outbound: <tag>(например,WarpFI-out,OperaFI-out), когда при выборе HTTP-прокси sing-box безостановочно сыпал ошибками в syslog из-за отсутствия поддержки UDP в протоколе HTTP. - Для групп
selectorиurltestтеперь строго проверяется поддержка UDP всеми узлами группы. Если в группе присутствует хотя бы один outbound без поддержки UDP (HTTP или SOCKS4), группа определяется как не поддерживающая UDP. - Добавлена генерация явного правила
{ action: "reject", network: "udp" }, а само правило маршрутизации строго ограничивается{ action: "route", network: "tcp" }. Браузеры мгновенно переключаются с QUIC на TCP без задержек и ошибок в логах. - Добавлена защита от циклических зависимостей (
visited) в проверке поддержки UDP. - В интерфейсе Telegram-бота и выгрузке багрепорта добавлена фильтрация и агрегация повторов UDP-ошибок.
- Исправлена ошибка
🏷️ Индикация протоколов и транспорта в Dashboard и LuCI
- Отображение типа транспорта:
- В карточках аутбаундов дашборда и в модальном окне выбора/приоритетов теперь выводится тип транспорта соединения:
VLESS (XHTTP),VLESS (TCP),VMess (WS),SOCKS5и т.д. - Для групп сохраняются их понятные названия:
Priority (Авто)иURLTest (Авто). - В парсере подписок и кэше поддержано извлечение и сохранение типа транспорта из ссылок конфигураций.
- В карточках аутбаундов дашборда и в модальном окне выбора/приоритетов теперь выводится тип транспорта соединения:
- Подсказка для URL подключения:
- В настройках секций расширено описание поддерживаемых протоколов:
Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, http/s://, hy2/hysteria2://.
- В настройках секций расширено описание поддерживаемых протоколов:
🛡️ Поддержка параметров AmneziaWG 3.1
- Случайные трейлеры пакетов (
RandomTrailers):- Добавлена поддержка случайных завершающих байтов (рандомного паддинга) в пакетах данных для клиентов (outbound) и серверов (inbound).
- Делает длину пакетов недетерминированной и разрушает эвристику классификаторов современных DPI-систем/ТСПУ, отслеживающих WireGuard по фиксированным сигнатурам и распределению длин пакетов.
- Отключение cookie-ответов (
DisableCookies):- Отключает генерацию протокольных cookie-ответов при приеме некорректных пакетов (inbound/outbound), защищая шлюз от активного сканирования и сетевого зондирования цензорами.
- Интерфейс LuCI:
- В форму настроек AmneziaWG 3.1 добавлены флаги
Random TrailersиDisable Cookies. - Парсер импорта файлов конфигурации
.confтеперь автоматически распознает и подхватывает директивыRandomTrailersиDisableCookies. - Реализован сброс параметров в UCI при смене версии протокола.
- В форму настроек AmneziaWG 3.1 добавлены флаги
- Смешанный прокси (HTTP+SOCKS5) для секций AmneziaWG:
- В интерфейсе LuCI для секций с действием AmneziaWG добавлена возможность включить локальный смешанный прокси (
mixed_proxy_enabled), настроить порт (mixed_proxy_port) и авторизацию по логину/паролю, аналогично действиямconnection,byedpiиzapret. - Исправлена проверка поддержки UDP в маршрутизаторе sing-box для туннельных эндпоинтов (
config.endpoints). Теперь через смешанный прокси AmneziaWG (и в туннель AWG в целом) прозрачно и без искусственных блокировок направляется как TCP, так и полноценный UDP (QUIC, VoIP, игры).
- В интерфейсе LuCI для секций с действием AmneziaWG добавлена возможность включить локальный смешанный прокси (
⏱️ Рандомизация Persistent Keepalive (awg_keepalive ranges)
- В интерфейсе LuCI и конфигурации поддержаны диапазоны для Persistent Keepalive (например,
25-35), что позволяет размывать периодичность контрольных пакетов (heartbeat timing) для противодействия тайминг-анализу DPI. - Отказоустойчивость:
- На ядрах Leadaxe (
sing-box-lx) диапазон передаётся в sing-box нативно. - На стандартных и Extended ядрах sing-box (где Go-структура ожидает строго целое число и падает с
cannot unmarshal string into Go struct field) система автоматически извлекает начальное целочисленное значени...
- На ядрах Leadaxe (
1.3.22
Tachyon 1.3.22 — Исправление обновления пакетов, независимость подписок, TorrServer Direct и совместимость с Sing-box 1.14
Выпуск Tachyon 1.3.22 — масштабное обновление стабильности и функциональности. В релиз вошли: критическое исправление механизма обновления пакетов (предотвращающее исчезновение Tachyon из меню LuCI «Службы»), устранение коллизии правил маршрутизации Sing-box 1.14, защита от ложных перезапусков подписок, прямой обход для TorrServer через cgroups v2, выделенный прямой порт прокси, а также полноценная поддержка HTTP/HTTPS прокси-серверов.
🚨 Критические исправления стабильности
1. Безопасное обновление пакетов и защита от сброса LuCI
- Проблема: При обновлении на роутере до предыдущих сборок Tachyon внезапно исчезал из меню LuCI «Службы», а демон не запускался даже после перезагрузки роутера.
- Причина: Менеджер пакетов
opkgпри обновлении вызывает скриптpostrm upgradeстарого пакета. Старыйpostrmбезоговорочно удалял системные файлы рантайма и перезапускал веб-серверuhttpd, что обрывало сессию пользователя и ломало регистрацию ACL вrpcd. Кроме того, в IPKpostinstотсутствовала регистрация сервиса в автозагрузке/etc/rc.d/. - Решение:
- В скрипты
postrmпакетовtachyon,luci-app-tachyonиluci-i18n-tachyon-ruвнедрены строгие проверки[ "$1" = "upgrade" ] && exit 0. - Из скриптов пакета полностью удалён деструктивный вызов
uhttpd restart, а жесткий перезапускrpcd restartзаменён на мягкийrpcd reload. - В
postinstсборщика IPK добавлена обязательная регистрация службы/etc/init.d/tachyon enable, запускtachyon package_postinstи выставление правchmod 600. - Добавлена превентивная нейтрализация старых незащищенных скриптов на диске роутера (
/usr/lib/opkg/info/*.postrm), гарантирующая безопасное накатывание обновления поверх старых версий. - В модуле
service/package.ucсохранение состояния работающей службы теперь защищено от сброса при любых типах обновлений.
- В скрипты
2. Исправление логической коллизии маршрутизации Sing-box (Discord + кастомные домены)
- Проблема: При одновременном наличии в секции списка Discord и пользовательских доменов весь трафик Discord утекал напрямую в
direct. - Причина: В Sing-box 1.14 условия внутри одного правила маршрутизации объединяются через логическое И (AND). Правило вида
{"domain_suffix": ["site.com"], "rule_set": ["discord"]}никогда не срабатывало дляdiscord.com. - Решение: В генераторе маршрутов (
generator_routes.uc) правила секции разделены на независимые блоки (логическое ИЛИ):- Отдельное правило для доменов секции (
domain,domain_suffix,domain_keyword). - Отдельное правило для правил-сетов (
rule_set). - Отдельное правило для диапазонов IP (
ip_cidr).
- Отдельное правило для доменов секции (
- Исключение хардкода: Полностью вырезан встроенный хардкод IP/доменов из кодовой базы — списки берутся строго из бинарных
.srsправил и пользовательских настроек.
🚀 Новые возможности и улучшения (Аудит Screamshow)
3. Стабильность подписок при тасовке серверов (Subscription Order Independence)
- Проблема: Многие провайдеры подписок при каждом запросе отдают серверы в случайном порядке (round-robin). Из-за этого вычисленный хеш подписки менялся, файл кэша перезаписывался, а Sing-box уходил в непрерывный цикл перезапусков, разрывая TCP/UDP сессии пользователей.
- Решение: В
subscription/parser.ucиcache.ucрасчёт сигнатурыruntime_outbounds_signatureпереведён на детерминированную сортировку канонических JSON-представлений исходящих узлов. Любая перестановка серверов местами без изменения их параметров теперь признаётся идентичной и не провоцирует перезапуск.
4. Защита от флаппинга в DNS Failover (dns_failover_failure_threshold)
- В
singbox/dns_failover.ucдобавлен параметрdns_failover_failure_threshold(по умолчанию3). - Единичная потерянная UDP-проба из-за микролага провайдера больше не приводит к мгновенному переключению резолверов — переход на резервный DNS осуществляется только при подтверждённых 3 последовательных ошибках.
5. Прямой обход для TorrServer через cgroups v2 (TorrServer Direct)
- Проблема: Запуск TorrServer прямо на OpenWrt-роутере приводил к захвату сотен торрент-соединений в TPROXY и sing-box, вызывая лавинообразный расход памяти (OOM) и высокую нагрузку на слабых CPU (MIPS/ARM).
- Решение: Добавлен модуль
torrserver/direct.ucи службаtachyon-torrserver-direct. Система автоматически обнаруживает cgroup процесса TorrServer (services/torrserver) и правилом nftablessocket cgroupv2 level 2 "services/torrserver" meta mark set 0x08000000направляет весь трафик TorrServer напрямую в WAN мимо sing-box.
6. Выделенный прямой порт прокси (Direct Proxy Port)
- В
singbox/generator.ucдобавлен входящийmixed(SOCKS5/HTTP) портdirect_bypass_port(по умолчанию2080, настраивается в UCI). - Весь входящий трафик на этот порт направляется в
direct-bypass-outс меткой WAN. Это позволяет подключать отдельные устройства или приложения (браузеры, плееры, торрент-клиенты) к прямому выходу в интернет без необходимости перенастройки списков маршрутизации роутера.
7. Поддержка исходящих HTTP и HTTPS прокси (Issue #45)
- LuCI & Парсер: Полная поддержка ссылок
http://иhttps://(включая авторизациюuser:passи TLS) при ручном добавлении серверов и в подписках Clash YAML. - UDP Reject for HTTP: Поскольку HTTP-прокси принципиально не поддерживают протокол UDP, перед правилом маршрутизации на HTTP-прокси автоматически создаётся блокирующее правило
action: "reject", network: "udp". Это заставляет браузеры и приложения с QUIC/HTTP3 мгновенно переключаться на TCP без зависаний и задержек.
8. Автонормализация параметров conntrack Zapret / NFQWS
- В
providers/nfqueue/runtime.ucдобавлена автонормализация некорректных или устаревших аргументов--ctrack-timeouts(запятые автоматически заменяются на двоеточия30:600:30:30, предотвращая аварийную остановку nfqws при старте).
🛡 Деинсталляция и откат конфигурации
- Скрипт
uninstall.shv1.3.0:- Защита процесса от самоубийства через сохранение PID родителя.
- Таймаут на остановку сервисов и принудительная очистка runtime-замков (
/var/run/tachyon/). - Полная очистка таблиц nftables (
TachyonTable, drop-in файлов) и интерфейсов сетевых пространств имён (fkpsc0). - Автоматическое восстановление параметров
dnsmasq(noresolv,cachesize,rebind_protection) и cron-задач. - Гибкие флаги
--keep-binariesи--purge.
1.3.21
Tachyon 1.3.21 — Совместимость с ядрами sing-box, строгий порядок секций, фикс голосовых чатов Discord и ByeDPI
🚀 Ключевые изменения и исправления
-
Строгое соблюдение порядка применения секций сверху вниз:
- Правила маршрутизации генерируются и обрабатываются строго в порядке их следования в конфигурации
/etc/config/tachyonи веб-интерфейсе LuCI. - Внутри каждой секции правила разделены на независимые цепочки (домены / наборы правил, пользовательские IP CIDR, GeoIP). Это полностью устранило логический конфликт оператора
ANDв ядре Sing-box 1.14+, из-за которого пакеты с FakeIP (198.18.0.x) отбрасывались и ошибочно уходили напрямую вdirect. - Устранены коллизии между доменными и IP-правилами секций с разным приоритетом.
- Правила маршрутизации генерируются и обрабатываются строго в порядке их следования в конфигурации
-
Совместимость со всеми сборками sing-box (
official,tiny,lx,extended):- Устранение фатальной ошибки
store_dns: в Sing-box 1.13.x (включая официальные пакеты OpenWrtsing-boxиsing-box-tiny) поле кэшаstore_dnsвызывало критическую ошибкуunknown field "store_dns"и отказ запуска службы. Реализовано динамическое определение версии ядра: для 1.13.x генерируетсяstore_rdrc, а для 1.14+ —store_dns. - Автоматическая адаптация (graceful degradation): в цикле проверки sing-box добавлен механизм самовосстановления — при несовместимости параметров кэша или неподдерживаемых транспортов (например,
xhttpна ядрах без его поддержки) конфигурация динамически адаптируется, обеспечивая успешный запуск службы без сбоев.
- Устранение фатальной ошибки
-
Исправление перехвата транзитного трафика в NFQUEUE (Zapret / Zapret2) и починка голосовых чатов Discord:
- Ранее правила перенаправления трафика в очереди
nfqws/nfqws2(queue num bypass) создавались только в цепочкеmangle_output, обрабатывающей исключительно локальные пакеты роутера. - Транзитный трафик от клиентов локальной сети (LAN -> WAN), попадая под приоритетные правила IP-подсетей (например, диапазон голосовых серверов Discord
66.22.192.0/18), получал метку провайдера, но проходил черезforwardбез обработки, так как в цепочкеmangle_forwardправилаqueueотсутствовали. - Добавлен полноценный перехват в
mangle_forwardдля действийzapretиzapret2, благодаря чему транзитные UDP-пакеты (голос Discord WebRTC/STUN) корректно попадают в очередь десинхронизации.
- Ранее правила перенаправления трафика в очереди
-
Исправление валидации и сохранения стратегий ByeDPI в веб-интерфейсе LuCI:
- Устранена ошибка валидации
Unexpected token 'U', "Usage: /us"... is not valid JSON, возникавшая при вводе стратегии ByeDPI из-за отсутствия командыvalidate_byedpi_strategy_jsonв диспетчере CLI/usr/bin/tachyon. - Исправлена проблема, из-за которой сбой удалённой валидации прерывал метод сохранения формы LuCI, не позволяя записать введённую стратегию в UCI и откатывая её на дефолтную.
- Проброшена ветка вызова валидатора через
providers/byedpi/validator.uc, добавлены регрессионные тесты вtests/byedpi_validator.sh.
- Устранена ошибка валидации