На главную
Как устроено

Четыре части, ноль зависимостей

Клиент для Windows, сервер ключей, сборщик маршрутов и скрипт, который поднимает сервер целиком. Весь Python — только стандартная библиотека: ни одного pip install ни на сервере, ни у игрока.

КОМПЬЮТЕР ИГРОКА · WINDOWS PingLane.exe окно, ключ, статус Служба AmneziaWG туннель, AllowedIPs = адреса Riot Valorant Браузер, Discord… СЕРВЕР В ПЕТЕРБУРГЕ · UBUNTU key_server.py HTTPS, TCP 443 Туннель awg0 AmneziaWG, UDP, NAT наружу accel.sh + make_routes.py клиенты, ключи, список адресов, отключение по сроку раз в час Серверы Valorant Riot Direct, AS6507 AWS: Франкфурт, Стокгольм RIPEstat, AWS ip-ranges Остальной интернет UDP-туннель NAT ключ → файл сверка отпечатка ставит / снимает подсети напрямую
Компоненты

Что делает каждая часть и почему так

accelerator_app.py

Клиент для Windows

Python и tkinter, собирается PyInstaller в один exe, который сам запрашивает права администратора.

  • Туннель не изобретает. Ставит и снимает службу AmneziaWG командами /installtunnelservice и /uninstalltunnelservice, а сам только следит за ней.
  • Статус из трёх источников: состояние службы через Service Control Manager, пинг до сервера внутри туннеля через IcmpSendEcho и возраст последнего рукопожатия из awg show. Рукопожатие старше 180 секунд — связи нет, даже если служба «работает».
  • Пинг через WinAPI, а не через ping.exe: вывод ping.exe зависит от языка Windows, а IcmpSendEcho возвращает число.
  • Находит мешающий VPN. GetBestInterfaceEx показывает, через какой интерфейс система пойдёт к серверу. Если это не физическая сетевая карта, трафик забрал чужой TUN — окно называет его по имени и подсказывает, что сделать.
  • Закрытый ключ не лежит на виду. Файл настроек хранится в ProgramData, папку icacls закрывает для всех, кроме администраторов и SYSTEM.
  • Сервер ключей упал — игра нет. Перед стартом приложение берёт свежий файл настроек, а если сервер недоступен, запускается на сохранённом.
key_server.py

Сервер ключей

HTTPS на http.server и ssl: два метода, POST /v1/config и /v1/status.

  • Ключ — это адрес, отпечаток и секрет. Строка accel:// — base64url от JSON:
    {"h": "203.0.113.7", "p": 443,
     "f": "SHA-256 сертификата сервера",
     "t": "секрет клиента, 128 бит"}
  • Свой отпечаток вместо удостоверяющего центра. Сертификат самоподписанный, домен не нужен. Клиент сверяет SHA-256 сертификата с отпечатком из ключа и только после этого отправляет секрет — подменить сервер посередине нельзя.
  • Секреты на сервере не хранятся — только их SHA-256. Утечка keys.json не даёт ни одного рабочего ключа.
  • Подбор не ускоряем: на неизвестный ключ ответ приходит через полсекунды.
  • Медленный клиент не держит приём: TLS-рукопожатие идёт в потоке запроса, а не в цикле приёма соединений. Запись keys.json атомарная, через временный файл.
make_routes.py

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

Из него получается строка AllowedIPs — именно она решает, что идёт через ускоритель.

  • Три источника: анонсы сети Riot Direct (AS6507) из RIPEstat, подсети AWS EC2 в регионах eu-central-1 и eu-north-1 плюс Global Accelerator из ip-ranges.json — Riot перенёс игровые серверы в AWS — и свои адреса из файла.
  • Склейка и вырезание. Соседние подсети объединяются, а IP самого VPS вырезается из списка: попади он в туннель, пакеты туннеля пошли бы в туннель и связь пропала бы.
  • Лучше старый список, чем половина нового. Если любой источник не скачался, скрипт завершается с ошибкой и ничего не печатает — сервер остаётся на прежнем списке.
  • Проверка одной командой: accel.sh covered IP отвечает, идёт ли адрес через туннель.
accel.sh

Сервер целиком

Bash для Ubuntu 22.04 / 24.04: от голого VPS до работающего туннеля одной командой.

  • Установка с проверками: AmneziaWG из PPA, заголовки ядра для будущих ядер (иначе после обновления DKMS не пересоберёт модуль и туннель не поднимется), отказ на OpenVZ/LXC, где модуль ядра не загрузить. Запасной вариант --plain — обычный WireGuard.
  • Обфускация AmneziaWG: мусорные пакеты перед рукопожатием (Jc, Jmin, Jmax) и свои размеры и заголовки пакетов (S1, S2, H1–H4), случайные при установке. На пинг не влияет: меняется только рукопожатие.
  • Сеть без сюрпризов: MTU 1380 с запасом на PPPoE домашних провайдеров, MSS clamping для TCP, NAT через iptables в PostUp/PostDown.
  • Клиенты на ходу: новый пир добавляется и в конфиг, и в работающий туннель — перезапуск не нужен, остальные игроки не отваливаются.
  • status ловит общий ключ: по каждому клиенту видно, откуда он подключён. Если адрес скачет — одним файлом пользуются два устройства.
Жизнь ключа

От выдачи до продления — без ручной возни

Выдача

issue-key ivan 30

Создаётся пир в туннеле, секрет и ключ accel:// на 30 дней.

Первый запуск

Ключ в окне

Приложение сверяет сертификат, забирает файл настроек и срок подписки.

Каждый старт

Свежий файл

Новые адреса серверов Riot подтягиваются без участия игрока.

Срок вышел

Таймер раз в час

Пир снимается с туннеля, сервер ключей отвечает «подписка закончилась» с датой.

Продление

extend ivan 30

Дни прибавляются к сроку, пир возвращается. Ключ у игрока тот же.

Команды

Управление сервером — это accel.sh

КомандаЧто делает
installСтавит AmneziaWG (или WireGuard с --plain), поднимает туннель, скачивает адреса, создаёт первого клиента
enable-keysВключает сервер ключей: сертификат, служба systemd, ежечасный таймер отключения
issue-key ИМЯ ДНЕЙНовый клиент и ключ на срок
extend ИМЯ ДНЕЙПродлить подписку от даты окончания или от сегодня, если срок уже вышел
keysУ кого какой срок и кто отключён
remove-client ИМЯОтключить устройство: ключ и файл настроек перестают работать
update-routesЗаново скачать адреса Riot и AWS и пересобрать файлы клиентов
check IP / covered IPПинг и маршрут от сервера до адреса / идёт ли адрес через туннель
statusКлиенты, откуда подключены, когда было рукопожатие
Стек

Из чего собрано

Python 3 — только стандартная библиотека tkinter ctypes + WinAPI PyInstaller AmneziaWG / WireGuard Bash systemd iptables Ubuntu 22.04 / 24.04 PowerShell

Хотите попробовать в игре?

Установка, тарифы и ключ — на главной странице.

Как установить