OpenCode Agent 62ec6c5749 fix(core): critical fixes for service menu, autotest, strategy runner, dependencies
- service.sh: split service_remove into internal (no prompts) and interactive
  versions to prevent 'eternal wait' when installing new strategy.
  Install now calls service_remove_internal > /dev/null instead of service_remove.
  Also filter strategy list to general*.sh only to avoid clutter.
  Systemd ExecStart now points to run_strategy.sh <name> consistently.

- run_strategy.sh: add SIGTERM/SIGINT trap cleanup_strategy() that kills nfqws
  and cleans up firewall. Prevents stale nfqws/firewall rules after autotest kill.
  Also handles nfqws exit gracefully with final cleanup.

- autotest.sh: rewritten to test strategies by config name (not wrapper filename).
  Stop now sends SIGTERM to wrapper (which triggers trap cleanup) instead of
  bare kill. Added extra sleep after stop to let trap fire.
  Auto-install ExecStart fixed to run_strategy.sh <strategy>.

- setup.sh: added libmnl-dev and zlib1g-dev to Ubuntu/Debian dependency install
  to prevent build failures (missing libmnl/libmnl.h and zlib.h).

- general*.sh: removed UTF-8 BOM (0xEF 0xBB 0xBF) that caused 'exec format error'
  when running scripts on Linux. All 19 wrappers cleaned.

- ensure_wrappers.sh: always rewrite wrappers to ensure no stale BOM or paths.

Fixes: eternal wait on menu option 1, nfqws build failure, stale processes after test.
2026-05-10 22:47:48 +04:00

Zapret for Linux (Discord + YouTube + GitHub + Telegram + Steam)

Linux-аналог популярного репозитория Flowseal/zapret-discord-youtube для обхода DPI (Deep Packet Inspection).

Ключевая фича: sync_from_upstream.sh — автоматическое слежение за оригинальным Windows-репозиторием. При обновлении Flowseal скрипт сам скачает новые списки доменов, hosts и авто-конвертирует новые .bat стратегии в Linux-формат. Подробнее в разделе Синхронизация upstream.


Важно для пользователей из России

GitHub заблокирован в РФ. Установщик автоматически использует прокси/зеркала, но рекомендуется:

  1. Если есть VPN/прокси — самый простой способ:

    # Вариант A: системный прокси
    export HTTPS_PROXY=socks5://127.0.0.1:1080
    sudo ./install.sh
    
    # Вариант B: proxychains
    proxychains ./install.sh
    
  2. Если нет VPN на целевой машине — подготовьте офлайн-пакет:

    # На машине С интернетом (с VPN):
    cd /opt/zapret
    proxychains ./prepare_offline_bundle.sh
    
    # Перенесите zapret-discord-youtube-linux-bundle.tar.gz
    # на целевую машину, распакуйте и:
    sudo ./install.sh --offline
    
  3. Если установка падает на скачивании:

    • Проверьте .env.example → создайте .env с GITHUB_PROXY=...
    • Или передайте прокси через переменную окружения

Подробнее: раздел Offline / РФ внизу.


Быстрый старт

# 1. Установка git (один раз)
sudo apt install git          # Ubuntu/Debian
sudo pacman -S git             # Arch/Manjaro
sudo dnf install git           # Fedora

# 2. Клонирование (БЕЗ sudo — создаёт файлы от текущего пользователя)
cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret

# 3. Установка (одна команда — всё сделает)
sudo ./install.sh

После install.sh сервис запущен и будет автозапускаться.

Важно: Все скрипты (install.sh, setup.sh, general*.sh, service.sh, autotest.sh, update.sh) должны запускаться от root (через sudo). Сами скрипты проверяют это автоматически.


Установка по дистрибутивам

Ubuntu / Debian / Linux Mint / Pop!_OS / Zorin OS / Kali

sudo apt update
sudo apt install -y git curl make gcc iptables nftables libnetfilter-queue-dev

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Arch Linux / Manjaro / EndeavourOS / Garuda / Artix

sudo pacman -Syu --noconfirm git curl make gcc iptables nftables libnetfilter_queue

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Fedora / RHEL / CentOS / AlmaLinux / Rocky Linux

sudo dnf install -y git curl make gcc iptables nftables libnetfilter_queue-devel

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Alpine Linux

sudo apk add --no-cache git curl make gcc iptables nftables libnetfilter_queue-dev linux-headers

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Gentoo / Funtoo

sudo emerge --ask dev-vcs/git net-misc/curl sys-devel/gcc sys-devel/make net-firewall/iptables net-firewall/nftables

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

openSUSE / SUSE

sudo zypper install -y git curl make gcc iptables nftables libnetfilter_queue-devel

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Void Linux

sudo xbps-install -Sy git curl make gcc iptables nftables libnetfilter_queue-devel

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

NixOS

nix-shell -p git curl gnumake gcc iptables nftables libnetfilter_queue

cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret
sudo ./install.sh

Что делает ./install.sh (шаг за шагом)

  1. Синхронизация upstream (sync_from_upstream.sh)

    • Клонирует оригинальный Flowseal/zapret-discord-youtube
    • Мержит свежие lists/*.txt (Discord, YouTube, GitHub, Telegram, Steam)
    • Обновляет .service/hosts (статичные IP для GitHub/Telegram)
    • При необходимости конвертирует новые .bat стратегии в strategies/*.conf
  2. Установка зависимостей (setup.sh) — по дистрибутиву

  3. Сборка nfqws (install_nfqws.sh) — git clone bol-van/zapret, make, fake .bin пакеты

  4. Автотест (autotest.sh --auto) — перебирает стратегии, находит рабочую, ставит в systemd


Структура проекта (новая модульная архитектура)

.
├── bin/                          # nfqws + fake .bin (собирается)
├── lib/
│   └── functions.sh              # Общие: firewall, цвета, cleanup
├── lists/                        # Списки доменов и IP
│   ├── list-general.txt          # Discord, YouTube, GitHub, Telegram, Steam
│   ├── list-google.txt           # Google/YouTube
│   ├── list-exclude.txt          # Исключения (банки, госуслуги)
│   ├── ipset-all.txt             # IP-диапазоны
│   └── ipset-exclude.txt         # Локальные подсети
├── strategies/                   # Новое: модульные стратегии
│   └── general.conf              # Конфиг стратегии (RULE1=... RULE2=...)
│   # Другие .conf появляются автоматически через sync_from_upstream.sh
├── utils/
│   ├── test_zapret.sh            # curl-тесты
│   └── targets.txt               # Цели
├── systemd/                      # Юниты и таймеры
├── .service/
│   ├── version.txt               # Версия (x.y.z-linux)
│   ├── hosts                     # Статичные IP (GitHub, Telegram)
│   └── installed_strategy        # Какая стратегия в systemd
├── general*.sh                   # Обёртки → run_strategy.sh
├── run_strategy.sh               # Движок: читает .conf, подставляет %BIN%/%LISTS%, запускает nfqws
├── sync_from_upstream.sh         # <<< НОВОЕ: авто-мердж с Windows-репон
├── autotest.sh                   # Автоподбор рабочей стратегии
├── install.sh                    # Полный установщик (setup + build + autotest + systemd)
├── service.sh                    # Меню управления (аналог service.bat)
├── setup.sh                      # Зависимости по дистрибутиву
├── install_nfqws.sh              # Сборка nfqws из bol-van/zapret
├── ensure_wrappers.sh            # <<< НОВОЕ: создаёт general_*.sh из strategies/*.conf
└── update.sh                     # Полный pipeline: sync → build → test → install

Ключевой момент: стратегии больше не зашиты в код. Они вынесены в strategies/*.conf — текстовые файлы, которые автоматически конвертируются из .bat при синхронизации.


Модульные стратегии (strategies/*.conf)

Вместо 20 скриптов с дублирующимся кодом — один движок + конфигурационные файлы.

Пример strategies/general.conf:

# Strategy: general
RULE1=--filter-udp=443 --hostlist="%LISTS%/list-general.txt" ... --dpi-desync=fake ...
RULE2=--filter-udp=19294-19344,50000-50100 --filter-l7=discord,stun ...
RULE3=--filter-tcp=2053,2083,2087,2096,8443 --hostlist-domains=discord.media ...
RULE8=--filter-tcp=%GAME_TCP% --ipset="%LISTS%/ipset-all.txt" ...
RULE9=--filter-udp=%GAME_UDP% --ipset="%LISTS%/ipset-all.txt" ...

Переменные (подставляются на лету через sed, без envsubst):

  • %BIN%bin/
  • %LISTS%lists/
  • %GAME_TCP% / %GAME_UDP%1024:65535 (или пусто)

Если Flowseal выпускает новую general (ALT12).bat:

sudo ./sync_from_upstream.sh   # авто-конвертирует в strategies/ALT12.conf + general_ALT12.sh

Стратегии (general*.sh)

Файл Стратегия Описание
general.sh general Standard multisplit (рекомендуется пробовать первой)
general_ALT.sh ALT Fake fakedsplit + ts fooling
general_ALT2.sh ALT2 Multisplit pos=2
general_ALT3.sh ALT3 Hostfakesplit (Google/ya.ru)
general_ALT4.sh ALT4 Fake multisplit + badseq
general_ALT5.sh ALT5 NOT RECOMMENDED syndata multidisorder
general_ALT6.sh ALT6 Uniform split-seqovl=681
general_ALT7.sh ALT7 Multisplit + syndata
general_ALT8.sh ALT8 Fake + badseq-increment=2
general_ALT9.sh ALT9 Hostfakesplit (ozon.ru)
general_ALT10.sh ALT10 Fake + ts fooling
general_ALT11.sh ALT11 Fake multisplit + max_ru pattern
general_FAKE_TLS_AUTO.sh FAKE_TLS_AUTO FAKE TLS multidisorder
general_FAKE_TLS_AUTO_ALT.sh FAKE_TLS_AUTO_ALT FAKE TLS fakedsplit
general_FAKE_TLS_AUTO_ALT2.sh FAKE_TLS_AUTO_ALT2 FAKE TLS multisplit badseq
general_FAKE_TLS_AUTO_ALT3.sh FAKE_TLS_AUTO_ALT3 FAKE TLS + 4pda pattern
general_SIMPLE_FAKE.sh SIMPLE_FAKE Simple fake
general_SIMPLE_FAKE_ALT.sh SIMPLE_FAKE_ALT Simple fakedsplit
general_SIMPLE_FAKE_ALT2.sh SIMPLE_FAKE_ALT2 Simple hostfakesplit

Подбор рабочей:

sudo ./autotest.sh        # интерактивно: тестит, пока не найдёт
sudo ./autotest.sh --auto  # автомат: найдёт и сразу установит в systemd

service.sh — меню управления

Аналог service.bat из Windows-версии:

:: SERVICE
   1. Install Service     — выбор стратегии + systemd unit
   2. Remove Services     — удаление unit + остановка nfqws
   3. Check Status        — проверка nfqws и firewall rules

:: SETTINGS
   4. Game Filter         — вкл/выкл обход портов >1024
   5. IPSet Filter        — none / loaded / any
   6. Auto-Update Check   — вкл/выкл автообновление

:: UPDATES
   7. Update IPSet List  — обновить список IP
   8. Update Hosts File   — показать hosts и предложить добавить в /etc/hosts
   9. Check for Updates   — проверить версию (внутренняя)

:: TOOLS
   10. Run Diagnostics    — зависимости, ядерный модуль, DNS
   11. Run Tests          — curl-проверка Discord/YouTube

update.sh — автообновление (pipeline)

# Полный pipeline: sync upstream → rebuild → test → install
sudo ./update.sh              # интерактивно
sudo ./update.sh --auto       # для cron: тихий режим, только если upstream изменился
sudo ./update.sh --full-auto  # форсировать пересборку + перетестирование
sudo ./update.sh --help       # справка

Что делает при обновлении Flowseal:

Step 0: sync_from_upstream.sh
       → скачивает новые lists, hosts, версию
       → если Flowseal выпустил новый .bat — авто-конвертирует в .conf + .sh

Step 1: Rebuild nfqws
       → пересобирает из исходников

Step 2: Auto-test
       → перетестирует все стратегии (включая новые)

Step 3: Install to systemd
       → ставит лучшую рабочую в автостарт

Синхронизация upstream (sync_from_upstream.sh)

Отдельный скрипт для ручного мержа с оригиналом. Не требует пересборки nfqws.

sudo ./sync_from_upstream.sh
# Вывод:
#   [OK] lists/list-general.txt (новые домены GitHub/Telegram)
#   [OK] .service/hosts (новые статичные IP)
#   [NEW] Detected upstream strategy: general (ALT12).bat → ALT12.conf
#   [OK] REBUILD NEEDED: run ./update.sh

Если видите REBUILD NEEDED (exit 2) — запускайте sudo ./update.sh или sudo ./install.sh.

systemd таймер для ежедневного автообновления:

sudo cp systemd/zapret-update.timer /etc/systemd/system/
sudo cp systemd/zapret-update.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now zapret-update.timer

Security — hosts для заблокированных ресурсов

Проект включает .service/hosts со статичными IP, чтобы обойти DNS-блокировки:

  • GitHub: raw.githubusercontent.com, avatars.githubusercontent.com, gist.github.com
  • Telegram: t.me, telegram.org, web.telegram.org, api.telegram.org
  • Discord media: голосовые каналы

Добавить в /etc/hosts:

sudo ./service.sh
# → 8. Update Hosts File

Или вручную:

cat .service/hosts | sudo tee -a /etc/hosts

Рекомендуется также включить Secure DNS (DoH/DoT):

  • Chrome: chrome://settings/security → Secure DNS
  • Firefox: about:preferences#privacy → DNS-over-HTTPS
  • systemd-resolved: resolvectl dns eth0 1.1.1.1

Ручное управление (если автоматика не подошла)

cd /opt/zapret

# Запуск конкретной стратегии
sudo ./general.sh        # если не работает — Ctrl+C
sudo ./general_ALT.sh    # пробуем следующую
# ... и так до 20 стратегий

# Меню
sudo ./service.sh

# Обновление (sync + rebuild + test + install)
sudo ./update.sh
sudo ./update.sh --full-auto

Если autotest показывает "nfqws did not start" / ошибка 0000

Это значит nfqws не удалось запуститься. Самые частые причины:

  1. Не хватает root-прав — запускайте ВСЕ скрипты через sudo
  2. Отсутствуют fake .bin файлы — пересоберите: sudo ./install_nfqws.sh
  3. nfnetlink_queue не загруженsudo modprobe nfnetlink_queue
  4. iptables/nftables конфликтsudo ./service.sh → 2. Remove Services, затем sudo ./general.sh

Если curl-тесты падают, но nfqws запущен

  1. Включите Secure DNS (DoH/DoT) — провайдер блокирует по DNS
  2. Добавьте .service/hosts в /etc/hosts (sudo ./service.sh → 8)
  3. Попробуйте стратегии вручную — у разных провайдеров работают разные

Требования

  • Linux с iptables или nftables
  • Ядерный модуль nfnetlink_queue (загрузится автоматически)
  • git, make, gcc, curl
  • Root-доступ — все скрипты (install.sh, setup.sh, general*.sh, service.sh, autotest.sh, update.sh) проверяют это автоматически и показывают sudo $0, если запущены без прав

Работа в России / Offline-режим

Почему нужен прокси или offline-бандл

  • github.com заблокирован в РФ
  • Оригинальный репозиторий лежит на GitHub (Flowseal/zapret-discord-youtube)
  • Исходники nfqws тоже на GitHub (bol-van/zapret)
  • Наш проект на Gitea, поэтому клонирование работает, но внутренние скачивания (lists, hosts, bol-van/zapret) — используют GitHub

Вариант 1: Установка с VPN/прокси (рекомендуется)

# Системный прокси
export HTTPS_PROXY=socks5://127.0.0.1:1080
export HTTP_PROXY=socks5://127.0.0.1:1080
sudo ./install.sh

# Или proxychains
proxychains ./install.sh

Также можно настроить ~/.bashrc:

echo 'export HTTPS_PROXY=socks5://127.0.0.1:1080' >> ~/.bashrc
source ~/.bashrc

Вариант 2: Offline-бандл (без интернета на целевой машине)

На машине с интернетом (например, у друга, или с VPN на работе):

cd /opt/zapret
proxychains ./prepare_offline_bundle.sh

Получите файл: zapret-discord-youtube-linux-bundle.tar.gz

На машине без интернета:

cd /opt
sudo tar -xzf zapret-discord-youtube-linux-bundle.tar.gz
cd zapret-bundle-*/installed-scripts
sudo ./install.sh --offline

Бандл содержит:

  • Исходники bol-van/zapret (для сборки nfqws)
  • lists/*.txt (свежие домены)
  • .service/hosts (статичные IP)
  • Все скрипты и стратегии

Вариант 3: Установка на Windows и перенос в Linux

  1. Скачать репозиторий на Windows (где VPN работает)
  2. Перенести на Linux через флешку/сеть
  3. На Linux запустить sudo ./install.sh --offline

Если GitHub заблокирован — поведение скриптов

Скрипт Поведение при отсутствии интернета
install.sh Предупреждает, спрашивает, можно запустить --offline
sync_from_upstream.sh Переключается в offline-режим, использует .bundle/
update.sh Если sync не удался — сообщает и выходит
install_nfqws.sh Предлагает proxychains, --offline, или prepare_offline_bundle.sh

Настройка прокси через .env

cp .env.example .env
nano .env
GITHUB_PROXY=socks5://127.0.0.1:1080

Скрипты автоматически прочитают .env при запуске.

Обновление при заблокированном GitHub

# С VPN/proxy на целевой машине:
sudo ./update.sh --full-auto

# Или через proxychains:
proxychains ./update.sh --full-auto

Лицензия

MIT License.

Авторы:

  • bol-van — оригинальный zapret
  • Flowseal — Windows-обёртка и стратегии
  • Linux-адаптация — Gitea
Description
No description provided
Readme 309 KiB
Languages
Shell 100%