Files
zapret-discord-youtube-linux/README.md
T
OpenCode Agent 6a1304bcfa docs(README): add root requirements + troubleshooting for common errors
- Clarify that ALL scripts require root (not just install.sh)
- Add 'git clone WITHOUT sudo' note to avoid permission issues
- Add troubleshooting section for 'nfqws did not start' / error 0000
- Add checklist for when curl tests fail but nfqws is running
- Emphasize Secure DNS and hosts file as common fixes
2026-05-10 17:35:57 +04:00

522 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Zapret for Linux (Discord + YouTube + GitHub + Telegram + Steam)
Linux-аналог популярного репозитория [Flowseal/zapret-discord-youtube](https://github.com/Flowseal/zapret-discord-youtube) для обхода DPI (Deep Packet Inspection).
**Ключевая фича:** `sync_from_upstream.sh` — автоматическое слежение за оригинальным Windows-репозиторием. При обновлении Flowseal скрипт сам скачает новые списки доменов, `hosts` и авто-конвертирует новые `.bat` стратегии в Linux-формат. Подробнее в разделе **Синхронизация upstream**.
---
## Важно для пользователей из России
GitHub заблокирован в РФ. Установщик **автоматически использует** прокси/зеркала, но рекомендуется:
1. **Если есть VPN/прокси** — самый простой способ:
```bash
# Вариант A: системный прокси
export HTTPS_PROXY=socks5://127.0.0.1:1080
sudo ./install.sh
# Вариант B: proxychains
proxychains ./install.sh
```
2. **Если нет VPN на целевой машине** — подготовьте офлайн-пакет:
```bash
# На машине С интернетом (с 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 / РФ** внизу.
---
## Быстрый старт
```bash
# 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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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`:**
```bash
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 |
**Подбор рабочей:**
```bash
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)
```bash
# Полный 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.
```bash
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 таймер для ежедневного автообновления:**
```bash
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`:
```bash
sudo ./service.sh
# → 8. Update Hosts File
```
Или вручную:
```bash
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`
---
## Ручное управление (если автоматика не подошла)
```bash
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/прокси (рекомендуется)
```bash
# Системный прокси
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`:
```bash
echo 'export HTTPS_PROXY=socks5://127.0.0.1:1080' >> ~/.bashrc
source ~/.bashrc
```
### Вариант 2: Offline-бандл (без интернета на целевой машине)
На машине **с интернетом** (например, у друга, или с VPN на работе):
```bash
cd /opt/zapret
proxychains ./prepare_offline_bundle.sh
```
Получите файл: `zapret-discord-youtube-linux-bundle.tar.gz`
На машине **без интернета**:
```bash
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
```bash
cp .env.example .env
nano .env
```
```
GITHUB_PROXY=socks5://127.0.0.1:1080
```
Скрипты автоматически прочитают `.env` при запуске.
### Обновление при заблокированном GitHub
```bash
# С VPN/proxy на целевой машине:
sudo ./update.sh --full-auto
# Или через proxychains:
proxychains ./update.sh --full-auto
```
---
## Лицензия
MIT License.
**Авторы:**
- [bol-van](https://github.com/bol-van) — оригинальный zapret
- [Flowseal](https://github.com/Flowseal) — Windows-обёртка и стратегии
- Linux-адаптация — [Gitea](https://giteas.stitch505.su/Stitch505/zapret-discord-youtube-linux)