No description
  • HTML 49.3%
  • Python 27.6%
  • Shell 23.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-11 20:13:42 +05:00
ct Fix update entrypoint pulling from upstream instead of Gitea 2026-11-11 20:13:42 +05:00
install Fix update entrypoint pulling from upstream instead of Gitea 2026-11-11 20:13:42 +05:00
ui Add network traffic graph to the web UI 2026-11-11 19:54:53 +05:00
.gitattributes Enforce LF line endings for scripts 2026-11-11 01:55:49 +05:00
.gitignore Add web UI and use Gitea repository URLs 2026-11-11 02:20:31 +05:00
README.md Fix update entrypoint pulling from upstream instead of Gitea 2026-11-11 20:13:42 +05:00

Zapret + Proxy в LXC для Proxmox VE

Репозиторий: http://192.168.1.111:3000/alex/zapret-lxc

Скрипт в стиле community-scripts.org создаёт LXC-контейнер в Proxmox VE, устанавливает в него zapret, поднимает два прокси и веб-панель:

  • SOCKS5 — tpws из состава zapret, порт 987;
  • HTTP-прокси — Privoxy, порт 8118, форвардит запросы в SOCKS5;
  • веб-панель — статус сервисов и портов, выбор стратегии и хостлиста, проверка доступности адреса, порт 8080.

Схема:

Устройство в LAN
   ↓
HTTP :8118 (Privoxy)  или  SOCKS5 :987 (tpws)
   ↓
zapret (nfqws/tpws обходят DPI)
   ↓
Интернет

Что делает установщик

  • создаёт непривилегированный LXC на Debian 13;
  • загружает на хосте Proxmox модули ядра, нужные zapret;
  • скачивает последний релиз bol-van/zapret и ставит бинарники;
  • применяет готовую стратегию fix_v3 из Snowy-Fluffy/zapret.cfgs (хостлист list-basic; если fix_v3 нет — general);
  • включает SOCKS5 в tpws и биндит его на LAN-интерфейс контейнера;
  • устанавливает и настраивает Privoxy поверх SOCKS5;
  • добавляет helper zapret-strategy для смены стратегии одной командой;
  • ставит веб-панель на http://<IP>:8080;
  • настраивает systemd-сервисы и увеличенный таймаут запуска (большой хостлист).

Требования

  • Proxmox VE 8/9, запуск от root на ноде;
  • доступ к GitHub с ноды и из контейнера;
  • свободное место под шаблон Debian 13 и контейнер;
  • ядро Proxmox с поддержкой nf_tables/ip_set (стандартное ядро PVE подходит).

Установка

Из локальной копии репозитория

bash /root/zapret-lxc/ct/zapret.sh

Скрипт сам найдёт соседний install/zapret-install.sh. Если каталог является git-клоном, адрес для будущих update определится автоматически из origin (GitHub или Gitea). Для копии без .git или для работы команды update задайте COMMUNITY_SCRIPTS_URL, как в варианте ниже.

Через curl (Gitea)

COMMUNITY_SCRIPTS_URL="http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main" \
  bash -c "$(curl -fsSL http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main/ct/zapret.sh)"

Для этого репозитория базой служит http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main. Скрипт подставляет её сам, если COMMUNITY_SCRIPTS_URL не задан и origin не указывает на GitHub/Gitea; явное значение нужно для форка или другого адреса.

Параметры

Переменная По умолчанию Описание
var_cpu 1 vCPU
var_ram 1024 RAM, МБ
var_disk 4 диск, ГБ
var_os debian ОС контейнера
var_version 13 версия Debian
var_unprivileged 1 непривилегированный контейнер
var_arm64 yes разрешить ARM64-шаблон

Пример с другими ресурсами:

var_ram=2048 var_disk=8 bash /root/zapret-lxc/ct/zapret.sh

После установки

В конце установки скрипт печатает IP контейнера. Прокси будут доступны по адресам:

SOCKS5:  <IP контейнера>:987
HTTP:    <IP контейнера>:8118
Web UI:  http://<IP контейнера>:8080

Настройки клиентов:

  • Firefox / браузер с SOCKS5 — включите «Proxy DNS when using SOCKS v5», чтобы DNS тоже шёл через прокси;
  • curl — используйте --socks5-hostname, а не --socks5;
  • iPhone/iPad/Android TV — HTTP-прокси <IP>:8118;
  • Windows/macOS/Linux — SOCKS5 <IP>:987 предпочтительнее.

Веб-панель

Открыть: http://<IP контейнера>:8080.

Панель показывает:

  • состояние сервисов zapret, privoxy, zapret-ui;
  • открытые порты 987, 8118, 8080 и готовые адреса для клиентов (с копированием);
  • живой график Network: суммарная скорость и скорость по каждому клиенту (IP) за последние 5 минут, с подсказками при наведении и отключением линий в легенде;
  • текущую стратегию и текущий хостлист;
  • смену стратегии и хостлиста с перезапуском zapret;
  • проверку открытия адреса (по умолчанию https://www.youtube.com/) напрямую, через SOCKS5 и через HTTP-прокси.

Скорость по клиентам считается по счётчикам TCP-сокетов ss для прокси-портов 987/8118: это реальный трафик каждого LAN-клиента через прокси. Данные хранятся в памяти процесса zapret-ui и обнуляются при его перезапуске.

Применение стратегии/хостлиста идёт в фоне, страница сама опрашивает статус. Большой хостлист может применяться несколько минут.

Панель слушает 0.0.0.0:8080, но принимает запросы только из приватных сетей (RFC1918 и loopback); авторизации нет. Не публикуйте порт 8080 в интернет. Сервис: zapret-ui, файлы: /opt/zapret-ui.

Смена стратегии

Стратегию и хостлист можно менять в веб-панели на http://<IP>:8080. Из консоли:

Посмотреть доступные стратегии:

pct exec <CTID> -- ls /opt/zapret/zapret.cfgs/configurations

Применить:

pct exec <CTID> -- zapret-strategy fix_v3

zapret-strategy сам выставит FWTYPE, IFACE_LAN, TPWS_SOCKS_ENABLE и TPPORT_SOCKS, затем перезапустит zapret. Стратегии можно перебирать: у разных провайдеров работают разные наборы.

Ручное редактирование конфига:

pct exec <CTID> -- nano /opt/zapret/config
pct exec <CTID> -- systemctl restart zapret

При ручной замене конфига сохраняйте строки TPWS_SOCKS_ENABLE, TPPORT_SOCKS, IFACE_LAN, FWTYPE — иначе SOCKS5 может перестать слушать LAN.

Обновление

Внутри контейнера:

update

Или кнопкой Update в интерфейсе Proxmox. update_script обновит zapret и веб-панель, сохранит конфиг, списки, кастомные fake-файлы и стратегии. Версия zapret при этом остаётся закреплённой (v72.9), а не «последней».

Если update отвечает 404 (контейнер создан до перехода на Gitea и в /usr/bin/update остался адрес апстрима), один раз перезапишите entrypoint внутри LXC:

cat > /usr/bin/update <<'EOF'
#!/usr/bin/env bash
export SCRIPT_SLUG="zapret"
export UPDATE_SCRIPT_NAME="zapret"
export COMMUNITY_SCRIPTS_URL="http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main"
export COMMUNITY_SCRIPTS_CORE_URL="https://raw.githubusercontent.com/community-scripts/core/main"
bash -c "$(curl -fsSL "http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main/ct/zapret.sh")"
EOF
chmod +x /usr/bin/update

После этого обычный update заработает. Проверка:

cat /usr/bin/update

В файле должно быть COMMUNITY_SCRIPTS_URL="http://192.168.1.111:3000/alex/zapret-lxc/raw/branch/main". Для копии репозитория без .git или нестандартного remote адрес также можно задать явно через ZAPRET_SCRIPTS_URL при установке.

Обновить только хостлисты:

pct exec <CTID> -- git -C /opt/zapret/zapret.cfgs pull
pct exec <CTID> -- systemctl restart zapret

Диагностика

pct exec <CTID> -- systemctl status zapret --no-pager
pct exec <CTID> -- systemctl status privoxy --no-pager
pct exec <CTID> -- systemctl status zapret-ui --no-pager
pct exec <CTID> -- ss -lntp
pct exec <CTID> -- curl --socks5-hostname 127.0.0.1:987 -I https://example.com
pct exec <CTID> -- curl -x http://127.0.0.1:8118 -I https://example.com
pct exec <CTID> -- journalctl -u zapret -n 100 --no-pager
pct exec <CTID> -- journalctl -u privoxy -n 100 --no-pager
pct exec <CTID> -- journalctl -u zapret-ui -n 100 --no-pager

Если порт 987 слушается только на 127.0.0.1, проверьте IFACE_LAN в /opt/zapret/config: там должен быть LAN-интерфейс контейнера (обычно eth0).

Важно

  • Прокси доступен всем в LAN. Privoxy разрешает только RFC1918-адреса (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). Если у вас другая адресация — поправьте permit-access в /etc/privoxy/config.
  • Если у контейнера включён firewall Proxmox, разрешите входящие 987, 8118, 8080.
  • Не публикуйте порты 987, 8118 и 8080 в интернет.
  • SOCKS5 в tpws работает только для TCP (ограничение zapret).
  • SOCKS5 работает как обычный релей, а DPI-обход выполняет nfqws (TPWS_SOCKS_OPT="" в /opt/zapret/config). Не включайте собственный десинк в tpws — двойной десинк ломает TLS.
  • Стратегия по умолчанию — fix_v3; на ряде провайдеров именно она пробивает видео-CDN YouTube, тогда как general/general_ALT дают только redirector. DPI у провайдеров различается, поэтому стратегию всё равно может понадобиться подбирать.
  • Для работы zapret нужны модули ядра хоста. Скрипт загружает их и записывает список в /etc/modules-load.d/zapret.conf, чтобы они поднимались при загрузке Proxmox.
  • Если контейнер не может создать правила nft/iptables, пересоздайте его привилегированным:
var_unprivileged=0 bash /root/zapret-lxc/ct/zapret.sh
  • zapret ставится из официального репозитория bol-van/zapret. Готовая стратегия, хостлисты и fake-файлы — из Snowy-Fluffy/zapret.cfgs.
  • Версия zapret закреплена на v72.9: в v72.13 ломается обход DPI у стратегий из zapret.cfgs (general, general_ALT, fix_v3 и др.). При ручном запуске установщика версию можно переопределить переменной ZAPRET_VERSION.

Структура

ct/zapret.sh               # создание LXC, меню/параметры community-scripts, update
install/zapret-install.sh  # установка zapret, SOCKS5, Privoxy внутри контейнера
ui/server.py               # API веб-панели
ui/index.html              # страница веб-панели
ui/zapret-ui.service       # systemd-юнит панели