Skip to content

Skiro1/warp-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

awarp

CLI-утилита для создания Cloudflare WARP VPN-тоннеля через AmneziaWG (обфусцированный форк WireGuard) на Windows.

English: README-en.md

Возможности

  • Регистрация в Cloudflare WARP и управление ключами
  • AmneziaWG-тоннель с параметрами обфускации (jc, jmin, jmax, s1-s4, h1-h4, i1-i5)
  • WFP firewall (kill switch)
  • Сканер эндпоинтов v2 — поиск рабочих WARP-серверов через полноценный Noise-IK WireGuard handshake
  • Авто-оптимизацияawarp register --auto регистрирует и находит лучший эндпоинт за одну команду
  • Интеграция с Запретом (winws) через привязку --wf-iface

Требования

  • Windows 10/11
  • Права администратора (для awarp up)
  • wintun.dll рядом с бинарником

Сборка

go build -o awarp.exe .

wintun.dll

Для создания TUN-интерфейса требуется библиотека wintun.dll. Скачать:

Поместите wintun.dll в ту же директорию, где лежит awarp.exe.

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

:: Всё в одном: регистрация + поиск лучшего эндпоинта
awarp register --auto

:: Подключение
awarp up

После awarp register --auto вы получаете готовый к подключению профиль с оптимальным эндпоинтом. Профиль создаётся один раз и сохраняется рядом с бинарником.

Команды

awarp register --profile <name> [--license KEY] [--set-awg KEY=VAL ...] [--sni DOMAIN] [--i1-mode safe|reorder|legacy] [--auto]
awarp up       --profile <name>
awarp down     --profile <name>
awarp status   --profile <name>
awarp scan     [--community] [--fast] [--awg] [--full-as]
awarp config show    --profile <name>
awarp config set     --profile <name> [--endpoint IP:PORT] [--set-awg KEY=VAL ...]
awarp config profiles
awarp config delete  --profile <name>
awarp help

awarp register

Регистрирует новый аккаунт Cloudflare WARP.

:: Обычная регистрация
awarp register --profile mywarp

:: С WARP+ лицензией
awarp register --profile mywarp --license XXXXXX

:: С параметрами обфускации
awarp register --profile mywarp --set-awg jc=10 --set-awg jmin=50

:: С кастомным SNI для I1-пакета
awarp register --profile mywarp --sni cloudflare.com

:: С выбранной стратегией I1 (safe, reorder, legacy)
awarp register --profile mywarp --sni cloudflare.com --i1-mode reorder

:: Регистрация + авто-поиск лучшего эндпоинта
awarp register --profile mywarp --auto

awarp register --auto (ключевая функция)

Флаг --auto автоматически находит самый быстрый WARP-сервер сразу после регистрации:

  1. Регистрирует аккаунт (или пропускает регистрацию, если профиль уже существует)
  2. Сканирует 10 подсетей Cloudflare WARP (8180 IP) через полноценный WireGuard handshake
  3. Находит лучший по задержке эндпоинт
  4. Сохраняет его в профиль

После этого остаётся только awarp up --profile <name>.

Если профиль уже существует, --auto не перерегистрирует его, а просто запускает сканирование и обновляет эндпоинт.

awarp scan

Сканирует эндпоинты Cloudflare WARP для поиска живых серверов.

:: Полное сканирование всех подсетей
awarp scan

:: С загрузкой community-списков
awarp scan --community

:: С AmneziaWG обфускацией (warp-plus junk noise)
awarp scan --awg

:: Быстрое сканирование (8 портов)
awarp scan --fast

:: Полное покрытие Cloudflare AS (~60k IP)
awarp scan --full-as

Важно: сканер использует полноценный Noise-IKpsk2 WireGuard handshake (148-байтовая Initiation-посылка). Для корректной работы требуется зарегистрированный профиль (awarp register). Без профиля используется упрощённый MAC1-only probe, который всегда находит 0 эндпоинтов, т.к. WARP-серверы игнорируют Initiation-пакеты без MAC1 и незарегистрированного ключа.

Процесс сканирования:

  1. Phase 1: ICMP ping всех IP из 10 подсетей (8180 IP, или ~60k с --full-as)
  2. Phase 2: WireGuard handshake probe на 54 UDP-портах для топ-30 самых быстрых по ping IP
  3. Вывод таблицы живых эндпоинтов, отсортированных по задержке

Параметры сканирования:

  • 10 подсетей (базовые): 162.159.192.0/21, 188.114.96.0/20, 8.6.112.0/24, 8.34.70.0/24, 8.34.146.0/24, 8.35.211.0/24, 8.39.125.0/24, 8.39.204.0/24, 8.39.214.0/24, 8.47.69.0/24
  • 26 подсетей (--full-as): + 162.159.200.0/21162.159.248.0/21 (7×/21) + 188.114.112.0/20188.114.240.0/20 (8×/20)
  • 54 порта: 2408, 500, 1701, 4500, 854, 859, 864, 878, 880, 890, 891, 894, 903, 908, 928, 934, 939, 942, 943, 945, 946, 955, 968, 987, 988, 1002, 1010, 1014, 1018, 1070, 1074, 1180, 1387, 1843, 2371, 2506, 3138, 3476, 3581, 3854, 4177, 4198, 4233, 5279, 5956, 7103, 7152, 7156, 7281, 7559, 8319, 8742, 8854, 8886
  • 50 конкурентных goroutines
  • Progress bar для обеих фаз
:: Пример вывода
awarp scan

Results: 29 alive endpoints, top 20:

Distribution: 8.47.69.0/24=3 8.6.112.0/24=2 8.35.211.0/24=2 8.34.70.0/24=8 8.39.214.0/24=2 8.39.204.0/24=2 8.39.125.0/24=6 8.34.146.0/24=4
ENDPOINT           PORT  LATENCY
--------------------------------------------------
8.39.125.5         2408  46ms
8.6.112.245        2408  47ms
8.34.146.142       2408  47ms
...

Use the best endpoint:
  awarp config set --profile <name> --endpoint 8.39.125.5:2408

Флаг --awg

Использует warp-plus junk noise перед WireGuard handshake — для регионов где DPI блокирует чистый WG.

Флаг --fast

Быстрое сканирование на 8 основных портах вместо 54.

Флаг --community

Загружает списки эндпоинтов с ircfspace/endpoint (GitHub) и использует их как источник IP. Если community-списки недоступны (блокировка в регионе или сетевые проблемы), сканер автоматически переключается на полное сканирование всех подсетей.

Флаг --full-as

Максимальное покрытие Cloudflare AS — 26 подсетей (~60k IP). Добавляет 7 подсетей /21 (162.159.200.0/21 → 162.159.248.0/21) и 8 подсетей /20 (188.114.112.0/20 → 188.114.240.0/20). Рекомендуется для пользователей с хорошим каналом (занимает ~30 минут Phase 1).

awarp config set --endpoint

После сканирования установите лучший эндпоинт:

awarp config set --profile mywarp --endpoint 8.39.125.5:2408
awarp down --profile mywarp
awarp up --profile mywarp

Эндпоинт указывается в формате IP:PORT или хост:порт.

Сканер эндпоинтов — подробности

Зачем нужен сканер?

Дефолтный эндпоинт engage.cloudflareclient.com:2408 может работать медленно или быть недоступным в вашем регионе. Сканер находит ближайшие к вам WARP-серверы.

Как это работает (технически)

Сканер отправляет полноценный Noise-IKpsk2 handshake initiation — тот же самый пакет, который WireGuard (и AmneziaWG) отправляет при установке соединения:

  1. Генерация эфемерного ключа — для каждого probe создаётся новый ключ Curve25519
  2. KDF1/KDF2 через HMAC-Blake2s — вычисление цепочки ключей для шифрования
  3. mixHash/mixKey — лавинное перемешивание хэша для аутентифицированного шифрования
  4. TAI64N timestamp — защита от replay-атак
  5. Шифрование ChaCha20Poly1305 — статического ключа клиента и timestamp
  6. MAC1 через Blake2s-128 — подпись для аутентификации на WARP-сервере

WARP-сервер, получив валидный Initiation:

  • Расшифровывает статический ключ клиента через clientPub
  • Проверяет ключ в своей БД (зарегистрирован ли)
  • Если всё ок — отправляет Handshake Response (32-байтный ответ)
  • Если нет — молча дропает пакет

Именно поэтому сканирование без зарегистрированного профиля всегда находит 0 — сервер не знает ваш ключ и игнорирует запрос.

Почему это лучше обычного UDP-сканера?

Обычный UDP-сканер проверяет, открыт ли порт (send → receive = "жив"). Это даёт ложные срабатывания: многие серверы в подсетях WARP имеют открытые UDP-порты, но не являются WARP-серверами. Noise-IK handshake даёт 100% точность — ответ приходит только от настоящего WARP-сервера, у которого зарегистрирован ваш ключ.

Стратегии I1 (QUIC Initial)

При регистрации можно задать стратегию генерации I1-пакета (QUIC Initial) через флаг --i1-mode:

Режим mini_quic level Описание
safe (default) 4 Split ClientHello на [0:1]+[38:∞], пропуск нулей, 2 CRYPTO фрейма
reorder 1 Split+перестановка фреймов [38:∞]+[0:38], удаление хвоста 32 байта
legacy 0 Один CRYPTO фрейм без фрагментации

AWG 1.5+ <r N> tag: I1 может содержать <b 0x...> (include) и <r N> (skip N байт) для реконструкции фрагментированного QUIC-пакета. Алгоритм: чередовать <b> и <r>, где <r> пропускает N байт в оригинале.

Без --sni выбирается случайная статическая I1 маска (из 2 предсобранных).

QUIC Initial generation: HMAC-SHA256 с salt 38762cf7f55934b3..., AES-CBC для Header Protection mask (ECB fallback), AES-GCM шифрование payload. Алгоритм идентичен генератору llimonix/mini_quic.

Параметры AWG

Параметр Описание
jc Количество junk-пакетов
jmin, jmax Диапазон размеров junk-пакетов
s1-s4 Заполнение сообщений
h1-h4 Заголовки сообщений
i1-i5 Пользовательские пакеты подписи

Эндпоинты Cloudflare WARP

Стандартные подсети WireGuard

  • IPv4 (broad CIDR): 162.159.192.0/21 (2046 IP), 188.114.96.0/20 (4094 IP), 8.6.112.0/24, 8.34.70.0/24, 8.34.146.0/24, 8.35.211.0/24, 8.39.125.0/24, 8.39.204.0/24, 8.39.214.0/24, 8.47.69.0/24
  • IPv6: 2606:4700:100::/48, 2606:4700:d0::/48
  • --full-as: добавляет 162.159.200.0/21162.159.248.0/21 (7×/21) + 188.114.112.0/20188.114.240.0/20 (8×/20) = ~60k IP

Порты (54 порта)

  • Стандартный: UDP 2408
  • Резервные: 500, 1701, 4500
  • Все порты: 500, 854, 859, 864, 878, 880, 890, 891, 894, 903, 908, 928, 934, 939, 942, 943, 945, 946, 955, 968, 987, 988, 1002, 1010, 1014, 1018, 1070, 1074, 1180, 1387, 1701, 1843, 2371, 2408, 2506, 3138, 3476, 3581, 3854, 4177, 4198, 4233, 4500, 5279, 5956, 7103, 7152, 7156, 7281, 7559, 8319, 8742, 8854, 8886

Дефолтный эндпоинт

engage.cloudflareclient.com:2408

Интеграция с Запретом (winws)

Проблема

При запуске winws (GoodbyeDPI/Запрет) вместе с WARP браузеры показывают "Нет интернета" и сайты не грузятся. Причина:

  1. WinDivert (используется winws) перехватывает пакеты на ВСЕХ сетевых интерфейсах
  2. WARP создаёт TUN-интерфейс (warp0), который обрабатывает весь трафик
  3. Windows NCSI отправляет HTTP-запросы через TUN
  4. WinDivert ломает эти запросы → Windows думает, что интернета нет
  5. curl и Telegram работают, потому что используют свой стек (Winsock)

Симптомы

  • curl https://youtube.com работает
  • Telegram работает
  • Браузер показывает "Нет интернета", YouTube не грузится
  • winws + WARP = браузер полностью не работает

Решение

Использовать --wf-iface=<индекс_физического_интерфейса> для привязки WinDivert только к физическому сетевому интерфейсу, исключая TUN.

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

  1. Скопируйте zapret-warp-alt-chrome.bat в директорию запрета (например, D:\zapret\)
  2. Запустите WARP:
    awarp up
  3. Запустите запрет (в отдельном терминале):
    D:\zapret\zapret-warp-alt-chrome.bat
  4. Остановка:
    awarp down
    taskkill /F /IM winws.exe

Как это работает

Bat-файл автоматически определяет сетевые интерфейсы:

  1. Находит индекс TUN-интерфейса (warp0) через netsh int ip show interfaces
  2. Находит индекс физического интерфейса (первый подключённый не-TUN интерфейс)
  3. Добавляет --wf-iface=<индекс_физического> к аргументам winws
  4. WinDivert захватывает пакеты ТОЛЬКО на физическом интерфейсе, игнорируя TUN

Ручное исправление других bat-файлов

Если вы хотите использовать другую стратегию запрета (ALT1, ALT2 и т.д.) с WARP:

Готовый пример: examples/general (ALT11) + WARP.bat (на основе Flowseal/zapret-discord-youtube)

Шаг 1: Добавьте этот код после set "LISTS=%~dp0lists\" и перед cd /d %BIN%:

setlocal enabledelayedexpansion
set "PHY_IDX="
for /f "skip=1 tokens=1" %%a in ('netsh int ip show interfaces 2^>nul ^| findstr /i "connected"') do (
    if not defined PHY_IDX set "PHY_IDX=%%a"
)
set "IFACE_FILTER="
if defined PHY_IDX set "IFACE_FILTER=--wf-iface=!PHY_IDX!"

Шаг 2: Добавьте %IFACE_FILTER% перед --wf-tcp в команде winws:

:: До (ломается с WARP):
start "zapret: %~n0" /min "%BIN%winws.exe" --wf-tcp=80,443,...

:: После (работает с WARP):
start "zapret: %~n0" /min "%BIN%winws.exe" %IFACE_FILTER% --wf-tcp=80,443,...

Траблшутинг

Если всё ещё не работает:

  1. Проверьте, что winws запущен: tasklist | find winws
  2. Проверьте индекс физического интерфейса: netsh int ip show interfaces
  3. Убедитесь, что --wf-iface есть в командной строке winws
  4. Попробуйте запустить winws вручную (не через bat), чтобы увидеть сообщения об ошибках

Планы

  • Warp-in-WARP — два слоя WARP: внешний AmneziaWG (обфускация), внутренний чистый WireGuard. Первый обходит DPI, второй даёт выход с WARP-IP. Для регионов с глубокой блокировкой.
  • SOCKS5 proxy-режим — вместо kernel TUN (админ, Wintun, роуты, DNS, фаерволл) — userspace WireGuard через gVisor netstack. SOCKS5 на 127.0.0.1:8086 без прав администратора. Никаких конфликтов с WinDivert/zapret. Единый бинарник без sidecar. (из warp-plus)
  • LCG-рандомизация IP — ✓ реализовано (см. cmd/ipgen.go)
  • Расширенные CIDR-диапазоны (broad CIDR + --full-as) — ✓ реализовано: 10 подсетей (8180 IP) базово, 26 подсетей (~60k IP) с --full-as. Включает 8 новых /24 из warp-generator.github.io и 15 broad CIDR Cloudflare AS. Находит 29+ эндпоинтов.
  • TLS fingerprint rotation — 3-уровневый fallback для WARP API: uTLS (Chrome fingerprint) → stdlib TLS 1.3 → uTLS Chrome_Auto. Решит проблему keepalive timeout в регионах где stdlib TLS блокирован. (из warp-plus)

Примечания

  • Профили хранятся рядом с бинарником, не в $HOME. Папка profiles/ создаётся автоматически.
  • WARP keepalive может таймаутиться (TLS к api.cloudflareclient.com) — это не критично для работы тоннеля.
  • Сканер без Zapret находит больше эндпоинтов (29 vs 20) — Zapret может rate-limit UDP probe-пакеты.
  • При awarp up вместе с тоннелем автоматически настраиваются: DNS (1.1.1.1), отключение IPv6 на физическом адаптере, метрики, отключение NCSI, очистка zombie-адаптеров.
  • При awarp down все настройки возвращаются в исходное состояние.

Лицензия

MIT

About

CLI tool for Cloudflare WARP VPN tunnel via AmneziaWG (obfuscated WireGuard) on Windows. Features: endpoint scanner, WFP firewall, Zapret (winws) integration.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors