Docker-контейнер на основе zapret от bol-van с интегрированным Shadowsocks и SOCKS5 для подключения к контейнеру. Предназначен для удобной маршрутизации трафика через изолированную среду без модификации основной сети.
- Изоляция zapret в отдельном контейнере
- Простая интеграция с sing-box, Xray и другими прокси-клиентами
Note
Контейнер был протестирован на следующих хостингах:
- RocketCloud
- HSVDS
- VDS Selectel MSK
- Aeza MSK
- VDC MSK - промокод
VERNETTEна скидку в 9% - RUVDS MSK
- 4VPS - проверялся сервер в Кемерово. Скидка 20% на первый заказ
Caution
В режиме nfqws контейнер работает только на Linux из-за отсутствия nfqueue на других ОС
- Быстрый старт
- Изменение конфигурации
- Расширенные возможности
- Работа Instagram в браузере
- Предупреждение про Shadowsocks и SOCKS5
- Установка git:
# Ubuntu/Debian
sudo apt install git
# Fedora
sudo dnf install git
# Arch Linux
sudo pacman -S git- Установка Docker:
bash <(wget -qO- https://get.docker.com)- Клонируйте репозиторий:
git clone https://github.com/vernette/ss-zapret
cd ss-zapret- Скопируйте стандартный конфиг zapret:
cp config.default config- Cоздайте
.envфайл. За основу можно взять.env.example:
cp .env.example .env
nano .envПример содержимого .env:
SS_PORT=8388 # Порт Shadowsocks
SOCKS_PORT=1080 # Порт SOCKS5
SS_PASSWORD=SuperSecurePassword # Пароль (рекомендуется изменить!)
SS_ENCRYPT_METHOD=chacha20-ietf-poly1305 # Метод шифрования
SS_TIMEOUT=300 # Таймаут подключенияNote
Необязательно использовать .env файл. Вы можете задать переменные окружения вручную прямо в docker-compose.yml
Список переменных окружения в docker-compose.yml:
| Переменная | Описание |
|---|---|
SS_PORT: 8388 |
Порт Shadowsocks |
SOCKS_PORT: 1080 |
Порт SOCKS5 |
SS_PASSWORD: SuperSecurePassword |
Пароль для Shadowsocks |
SS_ENCRYPT_METHOD: chacha20-ietf-poly1305 |
Метод шифрования Shadowsocks |
SS_TIMEOUT: 300 |
Таймаут сокета Shadowsocks в секундах |
SS_VERBOSE: 0, 1 |
Логгирование Shadowsocks. Если переменная не установлена или равна 1, то по-умолчанию будет включено |
- Запустите контейнер:
docker compose up -dДля внесения изменений в конфиг открываем его в текстовом редакторе:
nano configСтратегия меняется в переменной NFQWS_OPT, например:
NFQWS_OPT="
--filter-tcp=80 --methodeol --new
--filter-tcp=443 --hostlist-domains=youtube.com,googlevideo.com --dpi-desync=fakedsplit --dpi-desync-fooling=md5sig --dpi-desync-split-pos=1 --new
--filter-tcp=443 --dpi-desync=fake --dpi-desync-fooling=badseq --new
--filter-udp=50000-50099 --filter-l7=discord,stun --dpi-desync=fake --new
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6
"
--filter-tcp=80- стратегия для всего HTTP трафика--filter-tcp=443 --hostlist-domains=youtube.com,googlevideo.com- стратегия для HTTPS для определенных доменов--filter-tcp=443- стратегия для всего остального HTTPS трафика--filter-udp=50000-50099 --filter-l7=discord,stun- стратегия для диапазона портов Discord (с версии zapret >= 70.6)--filter-udp=443- стратегия для всего HTTP3 (QUIC) трафика
После внесения изменений не забудьте перезапустить контейнер:
docker compose restartПеред поиском стратегий нужно обязательно остановить zapret командой, чтобы поиск шёл без модификации трафика:
docker compose exec ss-zapret sh /opt/zapret/init.d/sysv/zapret stopКак и в оригинальном проекте, поиск стратегий осуществляется скриптом blockcheck.sh. Этот скрипт подбирает оптимальные стратегии для вашего домашнего/хостинг провайдера:
docker compose exec ss-zapret sh /opt/zapret/blockcheck.shTip
К скрипту поиска можно применять дополнительные параметры. Например, вам скорее всего не нужен режим TPWS и мы можем отключить поиск стратегий для него, чем сократим время поиска. Более подробно в оригинальном репозитории
Пример запуска с параметрами:
docker compose exec ss-zapret sh -c 'SKIP_TPWS=1 REPEATS=8 DOMAINS="amnezia.org discord.com" /opt/zapret/blockcheck.sh'Поиск стратегий для HTTP, HTTPS TLS 1.2, без HTTPS TLS 1.3 и HTTP3 (QUIC). Подходит для сайтов, которые не поддерживают TLS 1.3 (таких мало, но они есть)
docker compose exec ss-zapret sh -c 'SKIP_TPWS=1 SKIP_DNSCHECK=1 SECURE_DNS=0 IPVS=4 ENABLE_HTTP=1 ENABLE_HTTPS_TLS12=1 ENABLE_HTTPS_TLS13=0 ENABLE_HTTP3=0 REPEATS=8 PARALLEL=1 SCANLEVEL=standard BATCH=1 DOMAINS="amnezia.org discord.com" /opt/zapret/blockcheck.sh'Поиск стратегий для HTTPS TLS 1.3, без HTTP, HTTPS TLS 1.2 и HTTP3 (QUIC). Подходит для большинства сайтов и серверов YouTube
docker compose exec ss-zapret sh -c 'SKIP_TPWS=1 SKIP_DNSCHECK=1 SECURE_DNS=0 IPVS=4 ENABLE_HTTP=0 ENABLE_HTTPS_TLS12=0 ENABLE_HTTPS_TLS13=1 ENABLE_HTTP3=0 REPEATS=8 PARALLEL=1 SCANLEVEL=standard BATCH=1 DOMAINS="xxxxxx.googlevideo.com" /opt/zapret/blockcheck.sh'Вместо xxxxxx.googlevideo.com можно указать адрес ближайшего GGC сервера, который можно найти командой (требуется установленный curl и jq):
curl "https://www.youtube.com/youtubei/v1/player" \
--silent \
--request POST \
--json '{"videoId":"dQw4w9WgXcQ","context":{"client":{"clientName":"WEB","clientVersion":"2.20230810.05.00"}}}' \
--proxy socks5://localhost:1080 |
jq -r ".streamingData.serverAbrStreamingUrl" |
awk -F'/' '{print $3}'Note
Обратите внимание, что запрос мы делаем через локальный прокси контейнера
После завершения поиска стратегий запустите zapret командой:
docker compose exec ss-zapret sh /opt/zapret/init.d/sysv/zapret startЛибо перезапустите контейнер:
docker compose restartПосле первого запуска контейнера в директории проекта будет создана директория scripts:
scripts
├── custom.d
└── examples
├── 10-keenetic-udp-fix
├── 20-fw-extra
├── 40-webserver
├── 50-dht4all
├── 50-discord-media
├── 50-nfqws-ipset
├── 50-quic4all
├── 50-stun4all
└── 50-wg4all
Для того, чтобы использовать эти скрипты, необходимо скопировать их из директории examples в директорию custom.d. Например, скопируем скрипты для Discord и Stun (Telegram, WhatsApp):
cp scripts/examples/{50-discord-media,50-stun4all} scripts/custom.dПосле чего необходимо перезапустить контейнер, чтобы скрипты применились:
docker compose restartПроверить работу стратегий можно используя скрипт censorcheck, указав локальный прокси контейнера:
bash <(wget -qO- https://github.com/vernette/censorcheck/raw/master/censorcheck.sh) --mode dpi --proxy localhost:1080Проверить работу видео-доменов YouTube можно следующей командой:
curl --connect-to ::speedtest.selectel.ru https://manifest.googlevideo.com/100MB -k -o/dev/null -x socks5://localhost:1080В поле Current speed должна расти скорость скачивания. Если она вообще не идёт или постоянно прыгает (во втором случае всё равно нужно проверить работу видео вручную) - стратегия не подходит.
Примеры интеграции с sing-box, Xray и в существующий проект: INTEGRATION.md
Чаще всего IP Instagram будет заблокирован и будет работать только в мобильном приложении.
Чтобы решить эту проблему, нам нужно найти незаблокированный IP и прописать его в docker-compose.yml на сервере:
ss-zapret:
image: vernette/ss-zapret:v72.8
container_name: zapret-proxy
restart: unless-stopped
...
healthcheck:
test: [
"CMD-SHELL",
"nc -z localhost ${SS_PORT} && nc -z localhost ${SOCKS_PORT} || exit 1"
]
interval: 30s
timeout: 10s
retries: 3
start_period: 3s
extra_hosts:
instagram.com: "незаблокированный_ip"
www.instagram.com: "незаблокированный_ip"
cap_add:
- NET_ADMINНапример instagram.com: "11.22.33.44"
После чего перезапустить compose, чтобы он прописал изменения в файл /etc/hosts контейнера:
docker compose down && docker compose up -d- Локальное использование: Запуск контейнера на домашнем сервере для изолированной работы zapret без модификации основной сети
- Серверное использование: Развертывание на удалённом VPS как единая точка подключения
Сборка образа с другой версией zapret:
docker build -t ss-zapret:v70.5 --build-arg ZAPRET_TAG=v70.5 .Затем отредактируйте docker-compose.yml:
ss-zapret:
image: ss-zapret:v70.5Если у вас есть идеи для улучшения проекта, вы нашли баг или хотите предложить новую функциональность - не стесняйтесь создавать issue или отправлять pull request.
Important
Shadowsocks и SOCKS5 предназначены только для подключения в локальной сети. Не рекомендуется использовать их для внешнего подключения, так как это может скомпрометировать сервер