Docker-контейнер на основе zapret2 от bol-van с интегрированным Shadowsocks и SOCKS5 для подключения к контейнеру. Предназначен для удобной маршрутизации трафика через изолированную среду без модификации основной сети. Продолжение ss-zapret.
- Изоляция zapret2 в отдельном контейнере
- Простая интеграция с sing-box, Xray и другими прокси-клиентами
Контейнер был протестирован на следующих хостингах:
- 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-zapret2
cd ss-zapret2- Скопируйте стандартный конфиг zapret2:
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. По умолчанию отключено |
- Запустите контейнер:
docker compose up -dДля внесения изменений в конфиг открываем его в текстовом редакторе:
nano configСтратегия меняется в переменной NFQWS2_OPT, например:
NFQWS2_OPT="
--filter-tcp=80 --filter-l7=http --payload http_req --lua-desync=http_methodeol --new
--filter-tcp=443 --filter-l7=tls --payload=tls_client_hello --hostlist-domains=youtube.com,googlevideo.com,youtubei.googleapis.com --lua-desync=multisplit:pos=10:seqovl=1 --new
--filter-tcp=443 --filter-l7=tls --payload=tls_client_hello --lua-desync=multidisorder:pos=2 --new
--filter-udp=443 --filter-l7=quic --payload=quic_initial --lua-desync=fake:blob=fake_default_quic:repeats=6
"
--filter-tcp=80- стратегия для всего HTTP трафика--filter-tcp=443 ... --hostlist-domains=youtube.com,googlevideo.com,youtubei.googleapis.com- стратегия для HTTPS для определенных доменов--filter-tcp=443- стратегия для всего остального HTTPS трафика--filter-udp=443- стратегия для всего HTTP3 (QUIC) трафика
После внесения изменений не забудьте перезапустить контейнер:
docker compose restartПеред поиском стратегий нужно обязательно остановить zapret2 командой, чтобы поиск шёл без модификации трафика:
docker compose exec ss-zapret2 sh /opt/zapret2/init.d/sysv/zapret2 stopКак и в оригинальном проекте, поиск стратегий осуществляется скриптом blockcheck2.sh. Этот скрипт подбирает оптимальные стратегии для вашего домашнего/хостинг провайдера:
docker compose exec ss-zapret2 sh /opt/zapret2/blockcheck2.shTip
К скрипту поиска можно применять дополнительные параметры. Более подробно в оригинальном репозитории
Пример запуска с параметрами:
docker compose exec ss-zapret2 sh -c 'REPEATS=8 DOMAINS="amnezia.org discord.com" /opt/zapret2/blockcheck2.sh'Поиск стратегий для HTTP, HTTPS TLS 1.2, без HTTPS TLS 1.3 и HTTP3 (QUIC). Подходит для сайтов, которые не поддерживают TLS 1.3 (таких мало, но они есть)
docker compose exec ss-zapret2 sh -c '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/zapret2/blockcheck2.sh'Поиск стратегий для HTTPS TLS 1.3, без HTTP, HTTPS TLS 1.2 и HTTP3 (QUIC). Подходит для большинства сайтов и серверов YouTube
docker compose exec ss-zapret2 sh -c '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/zapret2/blockcheck2.sh'Вместо xxxxxx.googlevideo.com можно указать адрес ближайшего GGC сервера, который можно найти командой (требуется установленный curl и jq):
curl "https://www.youtube.com/youtubei/v1/player" \
--silent \
--request POST \
--json '{"videoId":"dQw4w9WgXcQ","context":{"client":{"clientName":"ANDROID","clientVersion":"21.02.35","androidSdkVersion":30,"userAgent":"com.google.android.youtube/21.02.35(Linux;U;Android11)gzip","osName":"Android","osVersion":"11"}}}' \
--proxy socks5://localhost:1080 |
jq -r ".streamingData.serverAbrStreamingUrl" |
awk -F'/' '{print $3}'Note
Обратите внимание, что запрос мы делаем через локальный прокси контейнера
После завершения поиска стратегий запустите zapret2 командой:
docker compose exec ss-zapret2 sh /opt/zapret2/init.d/sysv/zapret2 startЛибо перезапустите контейнер:
docker compose restartВ контейнер интегрирован blockcheckw. Это форк blockcheck2 от rcd27, написанный на Rust.
Для его работы в конфиге необходимо переключить FWTYPE на nftables:
FWTYPE=nftablesПример запуска:
docker compose exec ss-zapret2 sh -c "blockcheckw -w 32 scan -d rutracker.org | blockcheckw check -d rutracker.org --take 10"Более подробная документация описана в оригинальном репозитории.
После первого запуска контейнера в директории проекта будет создана директория 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После первого запуска контейнера в директории проекта будет создана директория lua:
lua/
├── zapret-antidpi.lua
├── zapret-auto.lua
├── zapret-lib.lua
├── zapret-pcap.lua
├── zapret-tests.lua
└── zapret-wgobfs.lua
Помимо стандартных скриптов, вы можете добавлять собственные lua-файлы для расширения функциональности.
После первого запуска контейнера в директории проекта будет создана директория fakes со встроенными в zapret2 фейк-файлами:
fakes
├── tls_clienthello_rutracker_org_kyber.bin
├── tls_clienthello_sberbank_ru.bin
├── tls_clienthello_vk_com.bin
├── tls_clienthello_vk_com_kyber.bin
├── tls_clienthello_www_google_com.bin
...
Вы можете добавлять в эту директорию собственные fake-файлы и использовать их в стратегиях.
Проверить работу стратегий можно используя скрипт 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 должна расти скорость скачивания. Если она вообще не идёт или постоянно прыгает (во втором случае всё равно нужно проверить работу видео вручную) - стратегия не подходит.
Интеграция ничем не отличается от ss-zapret.
Примеры интеграции с sing-box, Xray и в существующий проект: INTEGRATION.md
Чаще всего IP Instagram будет заблокирован и будет работать только в мобильном приложении.
Чтобы решить эту проблему, нам нужно найти незаблокированный IP и прописать его в docker-compose.yml на сервере:
ss-zapret2:
image: vernette/ss-zapret2:v0.8.4
container_name: zapret2-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- Локальное использование: Запуск контейнера на домашнем сервере для изолированной работы zapret2 без модификации основной сети
- Серверное использование: Развертывание на удалённом VPS как единая точка подключения
Сборка образа с другой версией zapret2:
docker build -t ss-zapret2:v0.8 --build-arg ZAPRET_TAG=v0.8 .Затем отредактируйте docker-compose.yml:
ss-zapret2:
image: ss-zapret2:v0.8Если у вас есть идеи для улучшения проекта, вы нашли баг или хотите предложить новую функциональность - не стесняйтесь создавать issue или отправлять pull request.
Important
Shadowsocks и SOCKS5 предназначены только для подключения в локальной сети. Не рекомендуется использовать их для внешнего подключения, так как это может скомпрометировать сервер
- bol-van - За zapret2
- ampetelin - За изначальный проект
- rcd27 - За blockcheckw