OpenCode Agent c6d843bd23 fix: critical nfqws startup failures + root-check + strategy bugs
Fixed the following critical issues that prevented zapret from working:

1. strategies/*.conf: Remove --dpi-desync-fake-discord/--dpi-desync-fake-stun
   These are Windows winws.exe parameters that do NOT exist in Linux nfqws.
   nfqws immediately exited with 'unrecognized option', causing the
   infamous 'error 0000' / all strategies failing in autotest.

2. run_strategy.sh: Remove 'set -e' that broke on SIGTERM and empty arrays.
   Remove useless service.sh sub-command calls (status_zapret/check_updates/
   load_game_filter/load_user_lists) that did nothing and could fork bomb.
   Add root check with clear 'sudo ' message.

3. autotest.sh: Fix typo '2&1' -> '2>&1' (bash parse error on cleanup).
   Remove redundant 'sudo' when already root. Properly kill strategy wrapper
   PID before cleanup_firewall to avoid nfqws orphan processes.

4. service.sh: Add root check at main() entry. Remove nested 'sudo' inside
   already-root scripts (systemctl cp/daemon-reload/...). Fix recursive
   'bash  remove_services' -> call service_remove directly.

5. lib/functions.sh: Fix stray space before detect_distro(). Add check_root()
   helper for all scripts. Add missing fake-bin warning in check_nfqws().

6. setup.sh / install_nfqws.sh / install.sh: Add root check. Remove nested
   'sudo' inside package manager calls. Fix EUID portability (use id -u fallback).

26 files changed. All 19 strategy configs now produce valid nfqws arguments.
2026-05-10 17:33:30 +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. Клонирование
cd /opt
git clone https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux.git zapret
cd zapret

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

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


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

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

Требования

  • Linux с iptables или nftables
  • Ядерный модуль nfnetlink_queue (загрузится автоматически)
  • git, make, gcc, curl
  • sudo или root

Работа в России / 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%