Docker-контейнер на основе zapret от bol-van с интегрированным Shadowsocks и SOCKS5 для подключения к контейнеру. Предназначен для удобной маршрутизации трафика через изолированную среду без модификации основной сети.
- Изоляция zapret в отдельном контейнере
- Простая интеграция с sing-box, Xray и другими прокси-клиентами
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
В репозитории находится конфиг, в котором включены параметры для Discord и настроенные стратегии, которые протестированы на следующих хостингах:
Хостинг | Дата-центр | Апстрим |
---|---|---|
RocketCloud | M9 | Rascom |
HSVDS | Собственный ДЦ | WestCall |
VDS Selectel MSK | Selectel | Rascom |
Aeza MSK | M9 | Rascom |
VDC MSK - промокод VERNETTE на скидку в 9% |
DataCheap, M9 | INETCOM |
RUVDS MSK | Собственный ДЦ (Rucloud) | RETN |
4VPS - проверялся сервер в Кемерово. Скидка 20% на первый заказ | Yacolo | ER-Telecom |
Warning
Не везде всё может работать идеально, поэтому при необходимости можно внести изменения в конфиг
Для внесения изменений в конфиг открываем его в текстовом редакторе:
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
Поиск стратегий осуществляется скриптом blockcheck.sh
. Этот скрипт подбирает оптимальные стратегии для вашего домашнего/хостинг провайдера:
docker compose exec ss-zapret sh /opt/zapret/blockcheck.sh
Tip
К скрипту поиска можно применять дополнительные параметры. Например, вам скорее всего не нужен режим 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'
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zapret-proxy
Shadowsocks
"outbounds": [
{
"tag": "ss-zapret-out",
"type": "shadowsocks",
"server": "127.0.0.1",
"server_port": 8388,
"method": "chacha20-ietf-poly1305",
"password": "SuperSecurePassword"
}
],
"route": {
"rules": [
{
"network": "udp",
"port": 443,
"port_range": "50000:50099",
"outbound": "ss-zapret-out"
},
{
"network": "tcp",
"outbound": "ss-zapret-out"
}
]
}
SOCKS5
"outbounds": [
{
"tag": "ss-zapret-out",
"type": "socks",
"server": "127.0.0.1",
"server_port": 1080
}
],
"route": {
"rules": [
{
"network": "udp",
"port": 443,
"port_range": "50000:50099",
"outbound": "ss-zapret-out"
},
{
"network": "tcp",
"outbound": "ss-zapret-out"
}
]
}
Important
Обратите внимание на server
: При обычном использовании указываем IP устройства, на котором запущен контейнер. Если используется панель, то нужно указывать IP контейнера или поместить контейнер в одну сеть с панелью и обращаться к нему по названию сервиса (ss-zapret
) для корректной работы UDP трафика
Shadowsocks
"outbounds": [
{
"tag": "zapret",
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 8388,
"password": "SuperSecurePassword",
"method": "chacha20-ietf-poly1305"
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"header": {
"type": "none"
}
}
}
}
],
"routing": {
"rules": [
{
"type": "field",
"network": "UDP",
"port": "443,50000-50099",
"outboundTag": "zapret"
},
{
"type": "field",
"network": "TCP",
"outboundTag": "zapret"
}
]
}
SOCKS5
"outbounds": [
{
"tag": "zapret",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 1080
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"header": {
"type": "none"
}
}
}
}
],
"routing": {
"rules": [
{
"type": "field",
"network": "UDP",
"port": "443,50000-50099",
"outboundTag": "zapret"
},
{
"type": "field",
"network": "TCP",
"outboundTag": "zapret"
}
]
}
Important
Обратите внимание на address
: При обычном использовании указываем IP устройства, на котором запущен контейнер. Если используется панель, то нужно указывать IP контейнера или поместить контейнер в одну сеть с панелью и обращаться к нему по названию сервиса (ss-zapret
) для корректной работы UDP трафика
Вы можете интегрировать контейнер ss-zapret
в существующий проект, например, с Xray или sing-box. Это позволит использовать имя сервиса вместо IP-адреса в конфигурации.
- Клонируйте основной репозиторий:
git clone https://github.com/vernette/ss-zapret
cd ss-zapret
- Скопируйте
config.default
в директорию вашего проекта:
cp config.default /path/to/your/project/zapret_config
- Добавьте переменные окружения напрямую в
docker-compose.yml
вашего проекта или скопируйте.env.example
:
cp .env.example /path/to/your/project/.env
- Добавьте сервис
ss-zapret
в вашdocker-compose.yml
:
services:
ss-zapret:
image: vernette/ss-zapret:latest
restart: always
environment:
- SS_PORT=${SS_PORT}
- SOCKS_PORT=${SOCKS_PORT}
- SS_PASSWORD=${SS_PASSWORD}
- SS_ENCRYPT_METHOD=${SS_ENCRYPT_METHOD}
- SS_TIMEOUT=${SS_TIMEOUT}
- SS_VERBOSE=1
volumes:
- ./zapret_config:/opt/zapret/config
healthcheck:
test:
[
"CMD-SHELL",
"nc -z localhost ${SS_PORT} && nc -z localhost ${SOCKS_PORT} || exit 1",
]
interval: 30s
timeout: 10s
retries: 3
start_period: 2s
cap_add:
- NET_ADMIN
Пример из другого моего репозитория - steal-oneself-examples:
services:
caddy:
image: caddy:2.9
restart: always
ports:
- "80:80"
volumes:
- ./caddy/data:/data
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
- ./caddy/templates:/srv
xray:
image: ghcr.io/xtls/xray-core:25.1.1
restart: always
ports:
- "443:443"
volumes:
- ./xray:/etc/xray
- ./xray_data:/usr/local/share/xray
depends_on:
ss-zapret:
condition: service_healthy
ss-zapret:
image: vernette/ss-zapret:latest
restart: always
environment:
- SS_PORT=${SS_PORT}
- SS_PASSWORD=${SS_PASSWORD}
- SS_ENCRYPT_METHOD=${SS_ENCRYPT_METHOD}
- SS_TIMEOUT=${SS_TIMEOUT}
- SOCKS_PORT=${SOCKS_PORT}
volumes:
- ./zapret_config:/opt/zapret/config
healthcheck:
test:
[
"CMD-SHELL",
"nc -z localhost ${SS_PORT} && nc -z localhost ${SOCKS_PORT} || exit 1",
]
interval: 30s
timeout: 10s
retries: 3
start_period: 2s
cap_add:
- NET_ADMIN
- В конфигурации Xray или sing-box используйте имя сервиса
ss-zapret
вместо IP-адреса:
{
"outbounds": [
{
"tag": "ss-zapret-out",
"type": "shadowsocks",
"server": "ss-zapret", // Используем имя сервиса
"server_port": 8388,
"method": "chacha20-ietf-poly1305",
"password": "SuperSecurePassword"
}
]
}
Это позволит Docker автоматически разрешать имя сервиса в IP-адрес контейнера.
Warning
Этот пункт выполняется на удалённом сервере. Если контейнер работает в локальной сети, то прописывайте IP на роутере или шлюзе
Warning
Не всегда на клиентах сразу заработает Instagram в браузере, возможно придётся поиграться с DNS
Чаще всего IP Instagram будет заблокирован и он будет работать только в мобильном приложении.
Чтобы решить эту проблему, нам нужно найти незаблокированный IP и прописать его в /etc/hosts
на сервере:
sudoedit /etc/hosts
Вписываем следующее в самый конец:
незаблокированный_ip instagram.com www.instagram.com
Например 11.22.33.44 instagram.com www.instagram.com
После этого нам нужно будет установить systemd-resolved
, чтобы файл /etc/hosts
читался нашим контейнером и при необходимости можно было искать стратегии для Instagram:
sudo apt install systemd-resolved
После чего перезапустить контейнер ss-zapret
, чтобы он увидел новый /etc/hosts
:
docker container restart zapret-proxy
- Локальное использование: Запуск контейнера на домашнем сервере для изолированной работы 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 предназначены только для подключения в локальной сети. Не рекомендуется использовать их для внешнего подключения, так как это может скомпрометировать сервер