Skip to content

Releases: Dushnilin/tachyon

1.3.30

Choose a tag to compare

@github-actions github-actions released this 20 Sep 07:24

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

Choose a tag to compare

@github-actions github-actions released this 19 Sep 15:28

🚀 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) с двухуровневым движком: openssl CLI, затем встроенная реализация 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 (устойчив к отсутствию openssl CLI).

🛠️ Транзакционная система установки/обновления/отката компонентов (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-за...
Read more

1.3.28

Choose a tag to compare

@Dushnilin Dushnilin released this 15 Sep 12:13

🚀 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, предотвращающие стандартный для OpenWrt rc.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 между перезагрузками роутера.
  • Новый регрессионный тест:
    • Добавлен тест 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" }).
  • Восстановлен download_detour на удаленных наборах правил (remote rule-sets):
    • Снята блокировка download_detour для 1.14+: удаленные rule-sets гарантированно скачиваются через заданный прокси-аутбаунд на любых версиях sing-box.
  • Гарантированная инициализация config.route.rule_set:
    • Добавлена превентивная инициализация массива rule-sets, исключившая ошибку rule-set not found.

📦 Менеджер пакетов 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/.
  • Извлечение CIDR подсетей в nftables:
    • Все обнаруженные в списках IP-подсети автоматически парсятся и добавляются в соответствующие nftables sets.
  • Фоновое обновление через list_update:
    • Периодический планировщик и команда /usr/bin/tachyon list_update инкрементально обновляют и перекомпилируют текстовые наборы правил.
  • Защита от сбоев sing-box:
    • Предотвращен краш ядра sing-box с ошибкой invalid sing-box rule-set file при пустых или некорректных списках: генерируется валидный минимальный бинарный стаб.

🎯 Адаптивный фаззер стратегий DPI v2 (Probe v2) и Zapret2

  • Двухэтапная верификация и стабилизация скоринга:
    • Полностью переработан алгоритм подбора параметров обхода DPI в fuzzer/: внедрена архитектура Probe v2, объединяющая разведочный зонд, оценку паттернов 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.
  • Расширение 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.
  • 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) и статус Установлен.
    • Разблокированы кнопки быстрого управления, переустановки и отката.
  • Стабильность вкладки «Обновления»:
    • Устранена ошибка преждевременн...
Read more

1.3.27

Choose a tag to compare

@github-actions github-actions released this 15 Sep 05:25

🚀 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%.

🛠️ Устранение зависания обновлений и задержек 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 роутера и локальных устройств без таймаутов.

🚀 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с при завершении задачи.

🤖 Оптимизация Telegram-бота

  • Мгновенный отклик на команды и сокращение TLS-сессий:
    • Время long-polling в запросе getUpdates увеличено с 20 до 50 секунд (таймаут curl скорректирован до 65 секунд, connection timeout 15 секунд).
    • Убран избыточный принудительный сон (sleep) после успешного получения ответа. Бот теперь реагирует на команды пользователя мгновенно, а сон используется исключительно как пауза при ошибках сети (backoff). Число TLS-рукопожатий и накладные расходы на поддержание сессии сокращены более чем в 2 раза.

📺 Оптимизация воркера прямого обхода TorrServer

  • Ликвидация холостого сканирования процессов и шелл-форков:
    • Внедрено кэширование PID процесса TorrServer: пока /proc/<cached_pid>/cmdline указывает на активный бинарник, полный поиск процессов через fs.glob("/proc/[0-9]*/cmdline") опускается.
    • Внешний запуск шелла system("sleep 60") заменён на нативную неблокирующую функцию sleep(60000) в ucode, исключив ежеминутное создание процессов sh.

🛡️ Стабильность сервиса и исправление дедлоков (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.
  • Защита 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

Choose a tag to compare

@github-actions github-actions released this 12 Sep 13:54

🚀 Полная интеграция с OpenWrt SQM (CAKE / fq_codel) и защита Bufferbloat (Рейтинг A/A+)

  • Гармонизация QoS-приоритизации и алгоритмов управления очередями CAKE:
    • Суть проблемы: Ранее при совместной работе Tachyon и SQM (luci-app-sqm / CAKE) тесты Bufferbloat деградировали до оценок B или C. Причина заключалась в двух факторах: во-первых, включенный в OpenWrt flow_offloading заставлял установленные соединения идти мимо очередей tc на виртуальных интерфейсах (pppoe-wan, ifb), а во-вторых, маркировка чистых TCP ACK классом cs2 в nftables конфликтовала с нативным механизмом ack-filter CAKE и засоряла Tin 2 (видео-корзину в diffserv4).
    • Кооперативный режим QoS (qos_priority_engine): В nftables сохранена приоритизация голосового (Voice EF 0x2e) и игрового трафика (Gaming AF41 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)» с подробной подсказкой.

🟣 Официальный пресет Twitch и отказоустойчивый CDN Fallback

  • Бесперебойный стриминг и обход троттлинга видеопотоков Twitch:
    • В перечень предустановленных сервисов добавлен официальный пресет Twitch, включающий все необходимые домены платформы (веб-интерфейс, GraphQL API, чаты IRC/WebSocket и HLS-стриминг видео: ttvnw.net, jtvnw.net, twitchcdn.net, ext-twitch.tv и др.).
    • Реализован отказоустойчивый механизм CDN Fallback, предотвращающий падение качества трансляций и буферизацию при блокировках или троттлинге отдельных узлов распределительной сети доставки контента.

🏷️ Восстановление бейджей подписок в 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 утилита coreutils timeout отсутствует, из-за чего внешний сторожевой таймер не срабатывал, а синхронный 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 роутера при передаче больших пакетов результатов вдвое.

☕ Поддержка проекта и развитие (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) без таймаутов.

🎧 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.

⚡ Оптимизация работы с 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)

  • Устранение рассинхронизации настроек и отката стратегий:
    • После успешного применения стратегии из модального окна фаззера страница автоматически обновляется с выводом уведом...
Read more

1.3.25

Choose a tag to compare

@github-actions github-actions released this 11 Sep 15:08

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_cidr sing-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-адреса.

📊 Надежный Дашборд: работа на подчинённых роутерах, HTTPS и единый интерфейс

  • Отказоустойчивость виджетов на точках доступа (AP / Dumb Switch) и при HTTPS:
    • Проблема: Виджеты скорости, суммарного трафика и системных ресурсов зависели исключительно от прямого соединения браузера с WebSocket Clash API (ws://...:9090). На вторичных роутерах без стандартного интерфейса LAN или при открытии LuCI по защищенному протоколу HTTPS браузер блокировал WebSocket (ошибка Mixed Content либо биндинг на loopback 127.0.0.1), из-за чего виджеты зависали в скелетон-загрузке или падали в статус «Временно недоступно».
    • Бесшовный RPC-фоллбек в initController.ts: При недоступности прямого сокета дашборд автоматически переходит на периодический опрос роутера через LuCI RPC (getClashApiConnections), парсит суммарный трафик, память и вычисляет дельту скорости ($\Delta\text{bytes} / \Delta t$) в реальном времени. Дашборд стабильно работает в любых топологиях сети.
    • Привязка 0.0.0.0:9090 в generator.uc: Если адрес прослушивания не задан явно, external_controller биндится на все локальные интерфейсы.
  • Единое наименование «Дашборд» во всех локалях:
    • В словарях 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-спуфинга провайдером.

⚡ Мгновенная калибровка задержек при старте (Boot Latency Sweep)

  • Ликвидация слепой зоны после перезагрузки роутера:
    • Суть проблемы: Ранее при старте роутера группы автоматического выбора лучшего прокси (urltest) не имели данных о задержках нод вплоть до первого интервального теста или ручного замера пользователем, из-за чего трафик мог направляться на медленный или недоступный сервер.
    • **Реали...
Read more

1.3.24

Choose a tag to compare

@Dushnilin Dushnilin released this 09 Sep 14:30

🔧 Исправление 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), что приводило к полному обходу TPROXY sing-box.
    • Патч потока пакетов: При наличии портов/подсетей в секции Zapret пакеты клиентов LAN теперь корректно маршрутизируются: prerouting → TPROXY sing-box → outbound с routing_markmangle_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.
  • Отказоустойчивость при недоступности внешних репозиториев (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, обеспечивая корректное отображение версий даже при аварийной распаковке.
  • Автоматическое создание системных каталогов /var/lock и /tmp/run:
    • Устранено падение opkg и postinst-скриптов procd в чистых системах и rootfs-контейнерах из-за отсутствия /var/lock/opkg.lock и /var/lock/procd_rpcd.lock.
  • Исправление резервного шаблона скачивания Zapret:
    • При недоступности GitHub API фоллбэк ссылки на скачивание архива remittor/zapret-openwrt формировал некорректный URL zapret_<tag>_openwrt_<arch>.zip. Шаблон исправлен на правильный zapret_v<tag>_<arch>.zip.
  • Парсинг версий 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 и DNS в LuCI («XHR request tim...

Read more

1.3.23

Choose a tag to compare

@github-actions github-actions released this 07 Sep 07:16

🛡️ Гостевой режим (Guest Mode) и сетевая изоляция

  • Полная изоляция локальной сети и защиты роутера:
    • Гостевые устройства получают доступ строго во внешнюю сеть (WAN/Интернет).
    • Доступ к локальным приватным подсетям (RFC1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, CGNAT 100.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_-]+)/.
  • Устранение бага форматирования строк (Current language: %s):
    • В ucode функции не имеют объекта JavaScript arguments. Из-за проверки length(arguments) > 1 подстановка параметров через sprintf не выполнялась, и бот отдавал сырой шаблон %s.
    • В модуле i18n.uc функция bind переведена на rest-параметры (...args) с корректным вызовом sprintf(val, ...args).
  • Поддержка текстовых команд и кнопок:
    • Добавлена прямая поддержка команд /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!
  • Фоллбек на веб-прокси (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 при смене версии протокола.
  • Смешанный прокси (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, игры).

⏱️ Рандомизация 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) система автоматически извлекает начальное целочисленное значени...
Read more

1.3.22

Choose a tag to compare

@github-actions github-actions released this 06 Sep 11:16

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. Кроме того, в IPK postinst отсутствовала регистрация сервиса в автозагрузке /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) и правилом nftables socket 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.sh v1.3.0:
    • Защита процесса от самоубийства через сохранение PID родителя.
    • Таймаут на остановку сервисов и принудительная очистка runtime-замков (/var/run/tachyon/).
    • Полная очистка таблиц nftables (TachyonTable, drop-in файлов) и интерфейсов сетевых пространств имён (fkpsc0).
    • Автоматическое восстановление параметров dnsmasq (noresolv, cachesize, rebind_protection) и cron-задач.
    • Гибкие флаги --keep-binaries и --purge.

1.3.21

Choose a tag to compare

@github-actions github-actions released this 06 Sep 05:35

Tachyon 1.3.21 — Совместимость с ядрами sing-box, строгий порядок секций, фикс голосовых чатов Discord и ByeDPI

🚀 Ключевые изменения и исправления

  1. Строгое соблюдение порядка применения секций сверху вниз:

    • Правила маршрутизации генерируются и обрабатываются строго в порядке их следования в конфигурации /etc/config/tachyon и веб-интерфейсе LuCI.
    • Внутри каждой секции правила разделены на независимые цепочки (домены / наборы правил, пользовательские IP CIDR, GeoIP). Это полностью устранило логический конфликт оператора AND в ядре Sing-box 1.14+, из-за которого пакеты с FakeIP (198.18.0.x) отбрасывались и ошибочно уходили напрямую в direct.
    • Устранены коллизии между доменными и IP-правилами секций с разным приоритетом.
  2. Совместимость со всеми сборками sing-box (official, tiny, lx, extended):

    • Устранение фатальной ошибки store_dns: в Sing-box 1.13.x (включая официальные пакеты OpenWrt sing-box и sing-box-tiny) поле кэша store_dns вызывало критическую ошибку unknown field "store_dns" и отказ запуска службы. Реализовано динамическое определение версии ядра: для 1.13.x генерируется store_rdrc, а для 1.14+ — store_dns.
    • Автоматическая адаптация (graceful degradation): в цикле проверки sing-box добавлен механизм самовосстановления — при несовместимости параметров кэша или неподдерживаемых транспортов (например, xhttp на ядрах без его поддержки) конфигурация динамически адаптируется, обеспечивая успешный запуск службы без сбоев.
  3. Исправление перехвата транзитного трафика в 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) корректно попадают в очередь десинхронизации.
  4. Исправление валидации и сохранения стратегий 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.