Skip to content

atomlab/vk-turn-proxy-guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

Quick-Start: WireGuard VPN через VK TURN Proxy

Руководство для быстрого развертывания 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-телефон

Шаг 1. Подготовка сервера

Подключитесь к серверу по SSH:

ssh root@YOUR_SERVER_IP

Замените YOUR_SERVER_IP на IP вашего сервера (например, 203.0.113.50).

1.1. Обновление системы и установка Docker

apt update && apt upgrade -y 
apt install -y curl wget 
curl -fsSL https://get.docker.com | sh

1.2. Настройка sysctl (маршрутизация)

cat > /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

Шаг 2. Создание конфигурации

Установите переменную с IP вашего сервера (подставьте реальный IP):

export SERVER_IP="203.0.113.50"

Проверьте, что переменная задана — выполните echo $SERVER_IP. Должен отобразиться IP вашего сервера. Если пусто — повторите export выше. Без этой переменной Angie не получит правильное доменное имя.

2.1. Создание директорий

mkdir -p /opt/wg-easy/{data,proxy/logs,proxy/acme,vk-turn-proxy}

2.2. docker-compose.yml

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.

2.3. Конфиг Angie (реверс-прокси с авто-HTTPS)

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;
        }
    }
}
EOF

2.4. Скачивание vk-turn-proxy

VK_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-amd64

Шаг 3. Запуск

3.1. Запуск стека

cd /opt/wg-easy && docker compose up -d

Проверяем, что все контейнеры запустились:

docker ps

Должно быть 3 контейнера в статусе Up:

  • wg-easy
  • proxy
  • vk-turn-proxy

3.2. Смена пароля администратора

После первого запуска 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>

3.3. Автозапуск через systemd

Создать /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.

3.4. Проверка

Откройте в браузере:

https://YOUR_SERVER_IP.sslip.io

Должна открыться страница авторизации wg-easy. Первый сертификат Let's Encrypt может занять 1-2 минуты. Если не открывается сразу — подождите и обновите страницу.

Логин: admin Пароль: тот, который вы установили в шаге 3.2


Шаг 4. Настройка Android

4.1. Установка приложений

Скачайте и установите два приложения:

Приложение Откуда Зачем
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.

4.2. Создание VK Звонка

  1. Откройте VK на телефоне или компьютере
  2. Создайте звонок: Мессенджер → Звонки → Создать звонок (в официальном приложении VK Мессенджер или в web-версии)
  3. Скопируйте ссылку вида https://vk.com/call/join/...
  4. Сохраните ссылку — она понадобится в шаге 5.3 при настройке vk-turn-proxy-android

Ссылка работает до тех пор, пока не нажмёте «Завершить звонок для всех». Не завершайте звонок!


Шаг 5. Подключение

5.1. Создание клиента в wg-easy

  1. Откройте https://YOUR_SERVER_IP.sslip.io на телефоне
  2. Авторизуйтесь (логин/пароль из шага 3.3)
  3. Нажмите New Client
  4. Введите имя (например, Phone)
  5. Нажмите на созданного клиента → редактировать (иконка карандаша)
  6. В разделе Advanced установите MTU = 1280
  7. Нажмите Save

5.2. Добавление VPN-профиля в WG Tunnel

  1. В wg-easy нажмите на QR-код рядом с вашим клиентом
  2. Откройте WG Tunnel на телефоне
  3. Нажмите +Scan from QR code
  4. Наведите камеру на QR-код
  5. Профиль добавлен с Endpoint = 127.0.0.1:9000 (уже настроено автоматически)
  6. Настройте раздельное туннелирование, чтобы VK TURN Proxy не шёл через VPN: Настройки профиля → Раздельное туннелирование → Mode: Исключить → добавьте VK TURN Proxy → Сохранить

5.3. Настройка vk-turn-proxy-android

  1. Откройте приложение vk-turn-proxy-android
  2. Заполните поля:
    • Peer (IP:Port)YOUR_SERVER_IP:56000 (IP вашего сервера, порт 56000)
    • Ссылка (VK Calls) → вставьте ссылку на VK Звонок из шага 4.2
    • Потоки (-n)8 (по умолчанию)
    • Использовать UDP (-udp) → включите
    • Локальный порт9000 (по умолчанию)
  3. Нажмите ЗАПУСТИТЬ ПРОКСИ
  4. Дождитесь в логах сообщения: SUCCESS или Established DTLS connection!

5.4. Подключение VPN

  1. Переключитесь в WG Tunnel
  2. Активируйте тумблер подключения
  3. Дождитесь зелёного индикатора соединения
  4. Готово! Весь трафик теперь идёт через VPN

Проверка

Откройте в браузере https://whoer.net или https://2ip.ru — IP должен быть IP вашего VPS, а не реальным IP провайдера.


Порядок действий при каждом подключении

  1. Открыть vk-turn-proxy-android → нажать ЗАПУСТИТЬ ПРОКСИ → дождаться SUCCESS
  2. Переключиться в WG Tunnel → активировать подключение → дождаться зелёного индикатора
  3. Пользоваться интернетом

Важно: Всегда сначала запускайте прокси, и только потом включайте VPN. И наоборот — сначала отключайте VPN, потом останавливайте прокси.


Решение проблем

Не выдаётся сертификат (не открывается https://...sslip.io)

  • Убедитесь, что порт 80 открыт на сервере (нужен для ACME challenge)
  • Проверьте логи Angie: docker logs proxy
  • Подождите 2-3 минуты — Let's Encrypt может быть медленным

vk-turn-proxy показывает ошибки

  • Ошибки DNS → в WG Tunnel включите VPN только для нужных приложений
  • Нестабильное соединение → уменьшите количество потоков до -n 1
  • Не подключается → попробуйте включить/выключить UDP-режим
  • Проверьте, что ссылка VK Звонка действительна (не завершён звонок)
  • Посмотрите логи: docker logs vk-turn-proxy

WireGuard не подключается

  • Убедитесь, что 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

Обновление 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-адресов

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors