Skip to content

vernette/ss-zapret

 
 

Repository files navigation

Zapret Version Docker Pulls

Docker-контейнер на основе zapret от bol-van с интегрированным Shadowsocks и SOCKS5 для подключения к контейнеру. Предназначен для удобной маршрутизации трафика через изолированную среду без модификации основной сети.

  • Изоляция zapret в отдельном контейнере
  • Простая интеграция с sing-box, Xray и другими прокси-клиентами

Caution

В режиме nfqws контейнер работает только на Linux из-за отсутствия nfqueue на других ОС

Содержание

Быстрый старт

Предварительные требования

  1. Установка git:
# Ubuntu/Debian
sudo apt install git

# Fedora
sudo dnf install git

# Arch Linux
sudo pacman -S git
  1. Установка Docker:
bash <(wget -qO- https://get.docker.com)

Установка и запуск

  1. Клонируйте репозиторий:
git clone https://github.com/vernette/ss-zapret
cd ss-zapret
  1. Скопируйте стандартный конфиг zapret:
cp config.default config
  1. 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, то по-умолчанию будет включено
  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'

Интеграция с прокси-клиентами

Получение IP адреса контейнера

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zapret-proxy

Интеграция с sing-box

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 трафика

Интеграция с Xray

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-адреса в конфигурации.

  1. Клонируйте основной репозиторий:
git clone https://github.com/vernette/ss-zapret
cd ss-zapret
  1. Скопируйте config.default в директорию вашего проекта:
cp config.default /path/to/your/project/zapret_config
  1. Добавьте переменные окружения напрямую в docker-compose.yml вашего проекта или скопируйте .env.example:
cp .env.example /path/to/your/project/.env
  1. Добавьте сервис 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
  1. В конфигурации 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-адрес контейнера.

Работа Instagram в браузере

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.

Предупреждение про Shadowsocks и SOCKS5

Important

Shadowsocks и SOCKS5 предназначены только для подключения в локальной сети. Не рекомендуется использовать их для внешнего подключения, так как это может скомпрометировать сервер

About

📦 Крохотный Docker-контейнер с zapret, Shadowsocks и SOCKS5

Topics

Resources

License

Stars

Watchers

Forks

Languages

  • Dockerfile 76.4%
  • Shell 23.6%