| .github/workflows | ||
| .env.example | ||
| .gitignore | ||
| config.default | ||
| docker-compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| LICENSE | ||
| README.md | ||
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. Если переменная не установлена или равна 1, то по-умолчанию будет включено |
- Запустите контейнер:
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.sh
Tip
К скрипту поиска можно применять дополнительные параметры. Более подробно в оригинальном репозитории
Пример запуска с параметрами:
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":"WEB","clientVersion":"2.20230810.05.00"}}}' \
--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
Custom.d скрипты
После первого запуска контейнера в директории проекта будет создана директория 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:
lua/
├── zapret-antidpi.lua
├── zapret-auto.lua
├── zapret-lib.lua
├── zapret-pcap.lua
├── zapret-tests.lua
└── zapret-wgobfs.lua
Помимо стандартных скриптов, вы можете добавлять собственные lua-файлы для расширения функциональности.
Проверка работы стратегий
Проверить работу стратегий можно используя скрипт 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
Работа Instagram в браузере
Чаще всего 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.
Предупреждение про Shadowsocks и SOCKS5
Important
Shadowsocks и SOCKS5 предназначены только для подключения в локальной сети. Не рекомендуется использовать их для внешнего подключения, так как это может скомпрометировать сервер