Warning
Как и оригинальный проект, этот также не стремится быть "волшебной таблеткой", а лишь является удобным инструментом для развёртывания zapret в Docker
zapret от bol-van, собранный в Docker-контейнер c Shadowsocks для подключения к контейнеру.
Изначально предназначался для маршрутизации в него доменов/подсетей Discord из sing-box и модификации очереди nfqueue
в режиме nfqws
, чтобы не затрагивать основную сеть.
ОС | Поддерживается |
---|---|
Linux | Да |
Windows | Нет |
macOS | ? |
- Установить 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
Warning
Далее все команды нужно запускать из директории проекта - ss-zapret
- Cоздать
.env
файл. За основу можно взять.env.example
:
SS_PORT=8388
SS_PASSWORD=SuperSecurePassword
SS_ENCRYPT_METHOD=chacha20-ietf-poly1305
SS_TIMEOUT=300
И отредактировать его:
cp .env.example .env
nano .env
Warning
ВАЖНО: Смените стандартный пароль для Shadowsocks и, при необходимости, другие переменные окружения
- Запустить контейнер:
docker compose up -d
В репозитории находится конфиг, в котором сразу же включены параметры для Discord и настроенные стратегии, которые протестированы на следующих хостингах:
- RocketCloud
- HSVDS
- vds.selectel.ru MSK
- Aeza MSK
- VDC MSK - промокод
VERNETTE
на скидку в 9%
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
Поиск стратегий ничем не отличается от поиска в оригинальном zapret и осуществляется скриптом 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). Подходит для большинства сайтов
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'
3x-ui
Переходим на вкладку Xray Configs
и добавляем outbound:
network_mode: host
, то мы не можем поместить его в одну сеть с нашим контейнером и использовать имя контейнера как hostname вместо IP
Узнаём IP адрес Docker-контейнера с zapret:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zapret-proxy
Выбираем протокол Shadowsocks
, задаём тэг и заполняем параметры. В поле Address
указываем IP из предыдущего шага:
После чего добавляем outbound кнопкой Add Outbound
.
Переходим на вкладку Routing Rules
и добавляем правило:
Добавляем правило кнопкой Add Rule
.
После этого сохраняем настройки и перезапускаем Xray: Save
-> Restart Xray
Теперь весь приходящий в панель трафик будет проходить через наш контейнер. Если требуется обрабатывать отдельные домены - изменяем правило соответствующим образом.
3x-ui-aio - это проект, который запускает 3x-ui с Angie и автоматическим получением сертификатов для доменов, а также поднимает сайт "заглушку".
Клонируем оба репозитория:
git clone https://github.com/ampetelin/3x-ui-aio
git clone https://github.com/vernette/ss-zapret
Чтобы интегрировать наш контейнер с 3x-ui-aio, нужно внести изменения в файл docker-compose.yml
от 3x-ui-aio:
nano 3x-ui-aio/docker-compose.yml
services:
angie:
image: docker.angie.software/angie:latest
container_name: angie
volumes:
- $PWD/angie.conf:/etc/angie/angie.conf
- $PWD/options-ssl-angie.conf:/etc/angie/options-ssl-angie.conf
- 3x-ui-aio-volume:/var/lib/angie/acme/
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
restart: unless-stopped
networks:
- 3x-ui-aio-network
3x-ui:
image: ghcr.io/mhsanaei/3x-ui:latest
container_name: 3x-ui
volumes:
- 3x-ui-aio-volume:/etc/x-ui/
environment:
XRAY_VMESS_AEAD_FORCED: "false"
X_UI_ENABLE_FAIL2BAN: "false"
tty: true
restart: unless-stopped
networks:
- 3x-ui-aio-network
authorization-stub:
image: ampetelin/authorization-stub
container_name: authorization-stub
environment:
HOST: "0.0.0.0"
PORT: "5000"
restart: unless-stopped
networks:
- 3x-ui-aio-network
ss-zapret:
image: vernette/ss-zapret:latest
container_name: zapret-proxy
cap_add:
- NET_ADMIN
ports:
- "${SS_PORT}:${SS_PORT}"
volumes:
- ./zapret_config:/opt/zapret/config
environment:
- SS_PORT=${SS_PORT}
- SS_PASSWORD=${SS_PASSWORD}
- SS_ENCRYPT_METHOD=${SS_ENCRYPT_METHOD}
- SS_TIMEOUT=${SS_TIMEOUT}
restart: unless-stopped
networks:
- 3x-ui-aio-network
networks:
3x-ui-aio-network:
name: 3x-ui-aio-network
volumes:
3x-ui-aio-volume:
name: 3x-ui-aio-volume
Тут мы добавляем ss-zapret
в сеть 3x-ui-aio-network
и меняем название конфига zapret в volumes
.
Создаём или копируем файл .env
, а также копируем конфиг zapret из ss-zapret
в директорию с 3x-ui-aio
:
cp ss-zapret/.env.example 3x-ui-aio/.env # или если он уже есть - cp ss-zapret/.env 3x-ui-aio/.env
cp ss-zapret/config 3x-ui-aio/zapret_config
Далее следуем инструкции из 3x-ui-aio. Когда панель будет доступна, то добавляем outbound следующим образом:
Настройка правил не отличается от инструкции выше.
Marzban
WIP
sing-box
Добавляем outbound в конфиг:
"outbounds": [
{
"tag": "ss-zapret-out",
"type": "shadowsocks",
"server": "127.0.0.1",
"server_port": 8388,
"method": "chacha20-ietf-poly1305",
"password": "SuperSecurePassword"
}
]
Обратите внимание на
server
: если контейнер и sing-box запущены на одном хосте - то указываем127.0.0.1
, иначе указываем IP сервера или контейнера.
Добавляем нужные правила:
"route": {
"rules": [
{
"domain_suffix": ["amnezia.org"],
"outbound": "ss-zapret-out"
}
]
}
Xray
Добавляем outbound в конфиг:
"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"
}
}
}
}
]
Обратите внимание на
address
: если контейнер и sing-box запущены на одном хосте - то указываем127.0.0.1
, иначе указываем IP сервера или контейнера.
Добавляем нужные правила:
"routing": {
"rules": [
{
"type": "field",
"domain": ["domain:amnezia.org"],
"outboundTag": "zapret"
}
]
}
Мы получаем крохотный (~30 МБ) Docker-контейнер с zapret и запущенным Shadowsocks.
Он может работать:
- на домашнем сервере - изолированно, чтобы не затрагивать основную сеть
- в облаке - как единая точка входа
Контейнер удобно использовать для прокидывания определённых доменов/сервисов через sing-box, Xray, другие прокси-клиенты или панели, или же для маршрутизации в него всего трафика.
Чтобы собрать образ с другой версией 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.
- Добавить примеры подключения к контейнеру
- Обновить zapret до версии 70.6