Руководство для быстрого развертывания WireGuard VPN с обходом блокировок через TURN-серверы VK Звонков. От покупки виртуалки до работающего VPN — за 10 минут.
┌──────────────────────────────────────────────────────────────────────┐
│ Android телефон │
│ │
│ ┌──────────┐ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ WG Tunnel│────▶│ vk-turn-proxy │─────▶ │ TURN-серверы VK │ │
│ │ (VPN) │ │ (127.0.0.1:9000) │ │ (обфускация DTLS) │ │
│ └──────────┘ └──────────────────┘ └─────────┬───────────┘ │
└────────────────────────────────────────────────────────┼─────────────┘
│
Интернет (TURN)
│
┌────────────────────────────────────────────────────────┼────────────┐
│ VPS-сервер │ │
│ ┌────────────────────▼─────────┐ │
│ ┌──────────┐ ┌────────────┐ │ vk-turn-proxy │ │
│ │ Angie │ │ wg-easy │ │ :56000 → 127.0.0.1:9000 │ │
│ │ (HTTPS) │──▶│ (Web UI) │◀───│ │ │
│ │ :443 │ │ :51821 │ └──────────────────────────────┘ │
│ └──────────┘ │ WireGuard │ │
│ │ :9000 │ │
│ └────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Трафик шифруется WireGuard + поверх оборачивается в DTLS 1.2 и идёт через TURN-серверы VK Звонков как обычный видеозвонок. Для провайдера это выглядит как подключение к VK.
| Что | Где взять |
|---|---|
| VPS с Debian 12/13 | Любой хостинг |
| Root-доступ к серверу | Выдаётся провайдером при покупке |
| Android-телефон | — |
Подключитесь к серверу по SSH:
ssh root@YOUR_SERVER_IPЗамените YOUR_SERVER_IP на IP вашего сервера (например, 203.0.113.50).
apt update && apt upgrade -y
apt install -y curl wget
curl -fsSL https://get.docker.com | shcat > /etc/sysctl.d/99-wg-easy.conf << 'EOF'
net.ipv4.ip_forward=1
net.ipv4.conf.all.src_valid_mark=1
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
EOF
sysctl --systemУстановите переменную с IP вашего сервера (подставьте реальный IP):
export SERVER_IP="203.0.113.50"Проверьте, что переменная задана — выполните
echo $SERVER_IP. Должен отобразиться IP вашего сервера. Если пусто — повторитеexportвыше. Без этой переменной Angie не получит правильное доменное имя.
mkdir -p /opt/wg-easy/{data,proxy/logs,proxy/acme,vk-turn-proxy}cat > /opt/wg-easy/docker-compose.yml << 'COMPOSE'
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
network_mode: host
volumes:
- /opt/wg-easy/data:/etc/wireguard
- /lib/modules:/lib/modules:ro
environment:
PORT: "51821"
HOST: "127.0.0.1"
# --- Автоматическая настройка при первом запуске ---
INIT_ENABLED: "true"
INIT_USERNAME: "admin"
INIT_PASSWORD: "changeme123"
INIT_HOST: "127.0.0.1"
INIT_PORT: "9000"
INIT_DNS: "1.1.1.1,8.8.8.8"
INIT_IPV4_CIDR: "10.8.0.0/24"
INIT_IPV6_CIDR: "fdcc:ad94:bacf:61a3::/64"
cap_add:
- NET_ADMIN
- SYS_MODULE
restart: unless-stopped
proxy:
image: docker.angie.software/angie:1.10.2-debian
container_name: proxy
network_mode: host
volumes:
- /opt/wg-easy/proxy/angie.conf:/etc/angie/angie.conf
- /opt/wg-easy/proxy/logs:/var/log/angie
- /opt/wg-easy/proxy/acme:/var/lib/angie/acme
depends_on:
- wg-easy
restart: unless-stopped
turn-proxy:
image: alpine:3.23
container_name: vk-turn-proxy
network_mode: host
volumes:
- /opt/wg-easy/vk-turn-proxy/server-linux-amd64:/opt/server:ro
command:
- /opt/server
- -listen
- 0.0.0.0:56000
- -connect
- 127.0.0.1:9000
healthcheck:
test: ["CMD", "nc", "-zu", "localhost", "56000"]
interval: 5s
timeout: 3s
retries: 5
restart: unless-stopped
networks:
default:
name: none
external: true
COMPOSEВажно:
INIT_HOST: "127.0.0.1"иINIT_PORT: "9000"— это значит, что wg-easy будет генерировать клиентские конфиги сEndpoint = 127.0.0.1:9000. Именно это и нужно: на телефоне vk-turn-proxy-android слушает на127.0.0.1:9000и пробрасывает трафик через TURN.
cat > /opt/wg-easy/proxy/angie.conf << EOF
user root;
worker_processes 1;
worker_rlimit_nofile 2048;
pid /run/angie.pid;
events {
worker_connections 512;
}
http {
include /etc/angie/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log /var/log/angie/access.log main buffer=16k flush=5m;
error_log /var/log/angie/error.log warn;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:128k;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# DNS resolver
resolver 1.1.1.1 8.8.8.8 valid=10s;
resolver_timeout 2s;
# ACME (Let's Encrypt)
acme_client acme_le https://acme-v02.api.letsencrypt.org/directory;
# Upstream — wg-easy Web UI
upstream wg_easy {
server 127.0.0.1:51821;
keepalive 4;
}
# Закрываем все неизвестные HTTPS-запросы
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
ssl_reject_handshake on;
}
# HTTP → reject (ACME обрабатывается Angie)
server {
listen 80;
return 444;
}
# wg-easy Web UI
server {
server_name ${SERVER_IP}.sslip.io;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
acme acme_le;
ssl_certificate \$acme_cert_acme_le;
ssl_certificate_key \$acme_cert_key_acme_le;
location / {
proxy_pass http://wg_easy;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
}
EOFVK_TURN_VERSION="1.2.3"
wget -O /opt/wg-easy/vk-turn-proxy/server-linux-amd64 \
"https://github.com/cacggghp/vk-turn-proxy/releases/download/v${VK_TURN_VERSION}/server-linux-amd64" && \
chmod +x /opt/wg-easy/vk-turn-proxy/server-linux-amd64cd /opt/wg-easy && docker compose up -dПроверяем, что все контейнеры запустились:
docker psДолжно быть 3 контейнера в статусе Up:
wg-easyproxyvk-turn-proxy
После первого запуска wg-easy создаёт учётную запись admin с паролем по умолчанию (changeme123). Сразу смените его:
Пароль должен содержать минимум 12 символов!
Интерактивный режим (пароль будет запрошен при вводе):
cd /opt/wg-easy
docker compose exec -it wg-easy cli db:admin:resetИли с указанием пароля напрямую:
cd /opt/wg-easy
docker compose exec -it wg-easy cli db:admin:reset --password <new_password>Создать /etc/systemd/system/wg-easy.service
cat > /etc/systemd/system/wg-easy.service << 'EOF'
[Unit]
Description=WireGuard Easy with docker compose
PartOf=docker.service
After=docker.service
[Service]
Type=simple
WorkingDirectory=/opt/wg-easy
ExecStartPre=/usr/bin/docker compose down --remove-orphans
ExecStart=/usr/bin/docker compose -f docker-compose.yml up
ExecStop=/usr/bin/docker compose down --remove-orphans
SyslogIdentifier=wg-easy
Restart=always
TimeoutStopSec=20s
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOFДобавить в автозапуск
systemctl daemon-reload
systemctl enable wg-easy
systemctl start wg-easy
После этого стек автоматически запускается при перезагрузке сервера.
Перезагрузите сервер, чтобы убедиться, что автозапуск работает:
rebootПосле перезагрузки (подождите ~30 секунд и переподключитесь по SSH) проверьте, что все контейнеры поднялись автоматически:
docker psДолжно быть 3 контейнера в статусе Up: wg-easy, proxy, vk-turn-proxy.
Откройте в браузере:
https://YOUR_SERVER_IP.sslip.io
Должна открыться страница авторизации wg-easy. Первый сертификат Let's Encrypt может занять 1-2 минуты. Если не открывается сразу — подождите и обновите страницу.
Логин: admin
Пароль: тот, который вы установили в шаге 3.2
Скачайте и установите два приложения:
| Приложение | Откуда | Зачем |
|---|---|---|
| WG Tunnel | Google Play | WireGuard VPN клиент |
| vk-turn-proxy-android | GitHub Releases (APK) | Проброс через TURN |
| turn-proxy-android (альтернатива vk-turn-proxy-android) | GitHub Releases (APK) | Проброс через TURN |
Для установки APK из GitHub нужно разрешить «Установку из неизвестных источников» в настройках Android.
- Откройте VK на телефоне или компьютере
- Создайте звонок: Мессенджер → Звонки → Создать звонок (в официальном приложении VK Мессенджер или в web-версии)
- Скопируйте ссылку вида
https://vk.com/call/join/... - Сохраните ссылку — она понадобится в шаге 5.3 при настройке vk-turn-proxy-android
Ссылка работает до тех пор, пока не нажмёте «Завершить звонок для всех». Не завершайте звонок!
- Откройте https://YOUR_SERVER_IP.sslip.io на телефоне
- Авторизуйтесь (логин/пароль из шага 3.3)
- Нажмите New Client
- Введите имя (например,
Phone) - Нажмите на созданного клиента → редактировать (иконка карандаша)
- В разделе Advanced установите MTU =
1280 - Нажмите Save
- В wg-easy нажмите на QR-код рядом с вашим клиентом
- Откройте WG Tunnel на телефоне
- Нажмите + → Scan from QR code
- Наведите камеру на QR-код
- Профиль добавлен с
Endpoint = 127.0.0.1:9000(уже настроено автоматически) - Настройте раздельное туннелирование, чтобы VK TURN Proxy не шёл через VPN: Настройки профиля → Раздельное туннелирование → Mode: Исключить → добавьте VK TURN Proxy → Сохранить
- Откройте приложение vk-turn-proxy-android
- Заполните поля:
- Peer (IP:Port) →
YOUR_SERVER_IP:56000(IP вашего сервера, порт 56000) - Ссылка (VK Calls) → вставьте ссылку на VK Звонок из шага 4.2
- Потоки (-n) →
8(по умолчанию) - Использовать UDP (-udp) → включите
- Локальный порт →
9000(по умолчанию)
- Peer (IP:Port) →
- Нажмите ЗАПУСТИТЬ ПРОКСИ
- Дождитесь в логах сообщения:
SUCCESSилиEstablished DTLS connection!
- Переключитесь в WG Tunnel
- Активируйте тумблер подключения
- Дождитесь зелёного индикатора соединения
- Готово! Весь трафик теперь идёт через VPN
Откройте в браузере https://whoer.net или https://2ip.ru — IP должен быть IP вашего VPS, а не реальным IP провайдера.
- Открыть vk-turn-proxy-android → нажать ЗАПУСТИТЬ ПРОКСИ → дождаться
SUCCESS - Переключиться в WG Tunnel → активировать подключение → дождаться зелёного индикатора
- Пользоваться интернетом
Важно: Всегда сначала запускайте прокси, и только потом включайте VPN. И наоборот — сначала отключайте VPN, потом останавливайте прокси.
- Убедитесь, что порт 80 открыт на сервере (нужен для ACME challenge)
- Проверьте логи Angie:
docker logs proxy - Подождите 2-3 минуты — Let's Encrypt может быть медленным
- Ошибки DNS → в WG Tunnel включите VPN только для нужных приложений
- Нестабильное соединение → уменьшите количество потоков до
-n 1 - Не подключается → попробуйте включить/выключить UDP-режим
- Проверьте, что ссылка VK Звонка действительна (не завершён звонок)
- Посмотрите логи:
docker logs vk-turn-proxy
- Убедитесь, что vk-turn-proxy-android запущен и показывает
SUCCESS - Проверьте, что MTU в клиенте =
1280 - Проверьте, что Endpoint в конфиге =
127.0.0.1:9000
- Убедитесь, что на сервере включён IP forwarding:
sysctl net.ipv4.ip_forward(должно быть1) - Проверьте, что контейнер wg-easy запущен:
docker ps | grep wg-easy
cd /opt/wg-easy
docker compose pull
docker compose down
docker compose up -d/opt/wg-easy/
├── docker-compose.yml # Конфигурация стека
├── data/ # Данные WireGuard (ключи, конфиги)
├── proxy/
│ ├── angie.conf # Конфиг реверс-прокси
│ ├── logs/ # Логи Angie
│ └── acme/ # SSL-сертификаты Let's Encrypt
└── vk-turn-proxy/
└── server-linux-amd64 # Бинарник TURN-прокси
| Порт | Протокол | Назначение |
|---|---|---|
| 80 | TCP | ACME challenge (получение SSL-сертификата) |
| 443 | TCP | Web UI wg-easy (HTTPS) |
| 51821 | TCP | Web UI wg-easy (внутренний, проксируется Angie) |
| 9000 | UDP | Wireguard (внутренний) |
| 56000 | TCP+UDP | vk-turn-proxy (внешний, приём TURN-трафика) |
При настройке firewall (ufw, iptables и т.д.) убедитесь, что эти порты доступны извне:
| Порт | Протокол | Кому открыт | Зачем |
|---|---|---|---|
| 80 | TCP | Все | ACME challenge — получение/обновление SSL-сертификата Let's Encrypt |
| 443 | TCP | Все | Доступ к Web UI wg-easy через HTTPS |
| 56000 | TCP + UDP | Все | Приём TURN-трафика от клиентов через vk-turn-proxy |
⚠️ Остальные порты (9000, 51821) — внутренние, открывать их из интернета не нужно.
- wg-easy — Web UI для управления WireGuard
- vk-turn-proxy — серверный и клиентский TURN-прокси
- vk-turn-proxy-android — Android-приложение TURN-прокси
- WG Tunnel — WireGuard клиент для Android
- sslip.io — DNS-сервис для получения доменов из IP-адресов