Usque — это реимплементация с открытым исходным кодом режима MASQUE из клиента Cloudflare WARP. Он использует протокол Connnect-IP (RFC 9484) и поставляется с множеством режимов работы, включая нативный туннель (в настоящее время только Linux), прокси SOCKS5 и HTTP-прокси.

Установка

Вы можете скачать последнюю версию со страницы релизов. На данный момент предоставляются бинарные файлы для Android (arm64), Linux (armv5,armv6,armv7,arm64,amd64), Windows (arm64,amd64) и Darwin (arm64,amd64). Однако протестирован был только бинарный файл для Linux amd64. Если у вас другая платформа, вы можете собрать проект из исходного кода.

Распакуйте архив, и вы найдете бинарный файл с именем usque в корневой директории. Вы можете переместить этот бинарный файл в директорию, указанную в вашей переменной PATH, чтобы сделать его доступным отовсюду.

Сборка из исходного кода

Поскольку инструмент написан на Go, это должно быть довольно просто.

  1. Убедитесь, что у вас установлен Go. Вы можете скачать его отсюда. Требуется как минимум Go 1.24.1.
  2. Клонируйте этот репозиторий и перейдите в корневую директорию проекта.
  3. Соберите проект с помощью следующей команды:
CGO_ENABLED=0 go build -ldflags="-s -w" .
  1. Это создаст бинарный файл usque в текущей директории.

Если вы хотите выполнить кросскомпиляцию, установите переменные окружения GOOS и GOARCH соответствующим образом. Например, чтобы собрать проект для Windows на системе Linux:

GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" .

Docker

Вы можете развернуть инструмент с помощью Docker. Dockerfile предоставляется в репозитории. Чтобы собрать образ, выполните:

docker build -t usque:latest .

Пример использования *(запускает SOCKS-прокси и открывает его на порту 1080)*:

docker run -it --rm -p 1080:1080 usque:latest socks

Использование

$ ./usque --help
Неофициальный CLI для Cloudflare Warp, который использует протокол MASQUE и предоставляет туннель в виде различных сервисов.

Usage:
usque [command]

Available Commands:
completion Generate the autocompletion script for the specified shell
enroll Enrolls a MASQUE private key and switches mode
help Help about any command
http-proxy Expose Warp as an HTTP proxy with CONNECT support
nativetun Expose Warp as a native TUN device
portfw Forward ports through a MASQUE tunnel
register Register a new client and enroll a device key
socks Expose Warp as a SOCKS5 proxy

Flags:
-c, --config string config file (default is config.json) (default "config.json")
-h, --help help for usque

Use "usque [command] --help" for more information about a command.

Прежде чем что-либо делать, вам нужно зарегистрироваться.

Регистрация

Существует удобная (хотя и не слишком функционально богатая) подкоманда register, которая создает новую учетную запись Warp, готовую к использованию. Она также выполняет регистрацию устройства и активацию MASQUE-ключа. Вызовите ее один раз, и она создаст рабочую конфигурацию для будущего использования в модулях.

Простой пример:

$ ./usque register
[!TIP]
Если вы хотите указать имя для устройства, вы можете сделать это, указав -n <имя-устройства>.
[!TIP]
Если вы хотите зарегистрироваться через ZeroTrust, вам нужно получить токен команды и указать его с помощью --jwt <токен-команды>.
Посетите https://<домен-команды>/warp и завершите процесс аутентификации.
Получите токен команды из исходного кода страницы или выполните следующую команду в консоли браузера:console.log(document.querySelector("meta[http-equiv='refresh']").content.split("=")[2]).

Если вы не столкнулись с ограничением частоты запросов (rate limiting) или другой ошибкой, вы должны увидеть сообщение Successful registration и рабочую конфигурацию. В случае определенных проблем, таких как rate limiting, вам может потребоваться подождать и повторить попытку.

Активация устройства (Enrolling)

Хотя команда регистрации также обрабатывает активацию устройства, в некоторых случаях вы можете захотеть повторно активировать старый ключ, найденный в конфигурации. Это полезно при миграции с одного устройства на другое, когда на сервере все еще зарегистрирован старый клиентский ключ. Или если ваша учетная запись использовала WireGuard, и вы хотите переключиться на MASQUE.

[!NOTE]
Эта команда обновляет вашу конфигурацию данными, загруженными с серверов Cloudflare, поэтому убедитесь, что у вас есть резервные копии.
[!TIP]
При использовании ZeroTrust эта команда может обновить конфигурацию с новыми назначенными адресами IPv4 и IPv6. Это полезно, потому что IPv6, похоже, не работает там, если IPv6 в конфигурации не актуален. На персональном WARP это, похоже, не затрагивает.
$ ./usque enroll

Режим Нативного Туннеля (для Продвинутых Пользователей, только Linux и Windows!)

Нативный туннель, вероятно, самый эффективный режим работы (на данный момент).

В Linux

Он требует наличия устройства TUN в системе. Это означает, что ваше ядро должно поддерживать загрузку модуля tun.ko. Также требуется iproute2. Хотя туннель все равно работает в пользовательском пространстве, трафик напрямую инжектируется в сетевой стек ядра, поэтому вы увидите реальный сетевой интерфейс и сможете туннелировать любой IP (Уровень 3) трафик, который поддерживает WARP. Поскольку он создает реальный сетевой интерфейс и также пытается установить IP-адреса, скорее всего, потребуются права root.

В Windows

Он требует наличия файла wintun.dll в той же директории, что и бинарный файл usque.exe. Затем он позаботится о поднятии интерфейса и установке IP-адресов. Обычно для этого также требуются права администратора.

Чтобы поднять нативный туннель, выполните:

$ sudo ./usque nativetun

Если не указано иное, в Linux вы должны увидеть интерфейс tun0(или tun1,tun2 и т.д.). В Windows интерфейс обычно называется usque. Если вы не отключили IPv4 и IPv6 внутри туннеля с помощью флагов CLI (в Linux), вы также должны увидеть предустановленные IPv4 и IPv6 адреса на этом интерфейсе. Этого должно быть достаточно для работы приложений, которые могут направлять трафик через определенный сетевой интерфейс. Например,ping:

$ ping -I tun0 1.1

Или curl:

$ curl --interface tun0 https://cloudflare.com/cdn-cgi/trace

Должны работать. Однако инструмент не устанавливает никаких маршрутов. Если они вам нужны, вам придется сделать это вручную. Например, чтобы направить весь трафик через туннель, вам нужно убедиться, что адрес, используемый для связи с туннелем, направлен через ваш обычный сетевой интерфейс. Для этого откройте config.json и проверьте адрес конечной точки (endpoint). Если вы планируете подключаться к конечной точке Cloudflare используя IPv4, вы, скорее всего, увидите это:

"endpoint_v4": "162.159.198.1"

Запомните это для следующих шагов.

Маршруты в Linux

Предполагая, что ваш обычный сетевой интерфейс —eth0, а адрес шлюза —192.168.1.1, вы можете добавить маршрут так:

$ sudo ip route add 162.159.198.1/32 via 192.168.1.1 dev eth0

После этого вы можете добавить маршрут по умолчанию для интерфейса tun0 как для IPv4, так и для IPv6:

$ sudo ip route add default dev tun0 && sudo ip -6 route add default dev tun0

Маршруты в Windows

Сначала определите индекс интерфейса для вашего обычного сетевого адаптера, выполнив:

route print

Найдите правильный номер индекса в Списке интерфейсов (Interface List).

Прежде чем добавлять маршруты по умолчанию, определите шлюз для вашего туннельного интерфейса, выполнив:

ipconfig

Найдите адаптер с именем usque(или другим именем вашего туннельного интерфейса) и запишите его адрес шлюза.

Предполагая:

  • Конечная точка туннеля:162.159.198.1
  • Шлюз:192.168.1.1
  • Индекс интерфейса:12
  • Туннельный интерфейс:usque(замените на фактическое имя или индекс вашего туннельного интерфейса)

Выполните следующие команды в Командной строке с повышенными привилегиями (Запуск от имени администратора):

route add 162.159.198.1 mask 255.255.255.255 192.168.1.1 metric 1 if 12

Затем добавьте маршруты по умолчанию для направления всего трафика через туннель:

route add 0.0.0.0 mask 0.0.0.0 [ШЛЮЗ_ТУННЕЛЯ] metric 1 if [ИНДЕКС_ТУННЕЛЬНОГО_ИНТЕРФЕЙСА]
route add ::/0 [ШЛЮЗ_ТУННЕЛЯ] metric 1 if [ИНДЕКС_ТУННЕЛЬНОГО_ИНТЕРФЕЙСА]
[!NOTE]
Замените [ШЛЮЗ_ТУННЕЛЯ] и [ИНДЕКС_ТУННЕЛЬНОГО_ИНТЕРФЕЙСА] на реальные значения для вашего туннельного адаптера. Вы можете получить их, проверив ipconfig и route print.
[!CAUTION]
Всегда будьте осторожны с маршрутами по умолчанию, особенно если вы запускаете это на headless машине. Очень легко заблокировать себе доступ к текущей сессии. Я предлагаю использовать сетевые пространства имен (network namespaces) в Linux в качестве более безопасной среды для экспериментов или запасную VM с физическим доступом или последовательной консолью.
В Windows вы можете сначала установить определенные маршруты, например, на 8.8.8.8/32, чтобы убедиться, что туннель работает, прежде чем добавлять маршрут по умолчанию.

Режим Прокси SOCKS5 (простой, кроссплатформенный)

Если вы просто хотите развернуть туннель в виде быстрого прокси и ваш клиент поддерживает SOCKS5, этот режим для вас. Он поддерживает как IPv4, так и IPv6. TCP и UDP тоже! Он также кроссплатформенный и не требует специальных модулей ядра или прав root. Однако он эмулирует весь сетевой стек в пользовательском пространстве, поэтому может быть ресурсоемким.

Чтобы запустить прокси SOCKS5, выполните:

$ ./usque socks

По умолчанию это запустит прокси SOCKS5 на 0.0.0.0:1080без аутентификации. Вы можете выбрать привязку к конкретному адресу и порту, указав -b и -p соответственно. Вы также можете включить аутентификацию, указав -u и -w для имени пользователя и пароля. Например:

$ ./usque socks -b 127.0.0.1 -p 8080 -u myuser -w mypass

Запустит прокси SOCKS5, доступный только на 127.0.0.1:8080 с именем пользователя myuser и паролем mypass.

Протестируйте прокси с curl:

curl -x socks5://myuser:mypass@localhost:8080 https://cloudflare.com/cdn-cgi/trace
[!NOTE]
Поскольку прокси эмулирует собственный сетевой стек, обычно можно сказать, что пользователи не смогут получить доступ к внутренним IP-адресам и службам, к которым имеет доступ хост, используя прокси. Однако внутренняя сеть WARP доступна для них без фильтрации. Если у вас включены ZeroTrust и Gateway, пользователи вашего прокси могут иметь возможность достигать друг друга, так как ручная фильтрация не применяется. Внутри туннеля они смогут подключаться к любым TCP- или UDP-сервисам.
[!CAUTION]
Локальный трафик SOCKS5 не шифруется, поскольку SOCKS5 не поддерживает шифрование. Вам, вероятно, не следует передавать секреты государственной важности с одного устройства на другое в публичном WiFi, где запущен usque.
[!NOTE]
На данный момент поддерживается только одна пара user:pass.

Режим HTTP-Прокси (простой, кроссплатформенный)

Еще один простой режим работы — режим HTTP-прокси. Почти все клиенты поддерживают HTTP-прокси. Обычный незашифрованный HTTP-трафик, отправленный на этот прокси, будет просто перенаправлен в сеть WARP. Для HTTPS и любого другого TCP-трафика прокси предоставляет метод HTTP CONNECT. Этот режим кроссплатформенный и не требует специальных модулей ядра или прав root. Однако он эмулирует весь сетевой стек в пользовательском пространстве, поэтому может быть ресурсоемким.

Чтобы запустить HTTP-прокси, выполните:

$ ./usque http-proxy

По умолчанию это запустит HTTP-прокси на 0.0.0.0:8000без аутентификации. Вы можете выбрать привязку к конкретному адресу и порту, указав -b и -p соответственно. Вы также можете включить аутентификацию, указав -u и -w для имени пользователя и пароля. Например:

$ ./usque http-proxy -b 127.0.0.1 -p 8080 -u myuser -w mypass

Запустит HTTP-прокси, доступный только на 127.0.0.1:8080 с именем пользователя myuser и паролем mypass.

Протестируйте прокси с curl:

curl -x http://myuser:mypass@localhost:8080 https://cloudflare.com/cdn-cgi/trace
[!NOTE]
Поскольку прокси эмулирует собственную сетевую стеку, обычно можно сказать, что пользователи не смогут получить доступ к внутренним IP-адресам и службам, к которым имеет доступ хост, используя прокси. Однако внутренняя сеть WARP доступна для них без фильтрации. Если у вас включены ZeroTrust и Gateway, пользователи вашего прокси могут иметь возможность достигать друг друга, так как ручная фильтрация не применяется. Внутри туннеля они смогут подключаться к любым TCP-сервисам.
[!CAUTION]
Локальный HTTP-трафик не шифруется, поскольку HTTP не поддерживает шифрование, а HTTPS не реализован. Добавить его должно быть несложно, но мне это пока не нужно. Вам, вероятно, не следует передавать секреты государственной важности с одного устройства на другое в публичном WiFi, где запущен usque.
[!NOTE]
На данный момент поддерживается только одна пара user:pass.

Режим Проброса Порта (для Продвинутых Пользователей, кроссплатформенный)

В то время как большинство других режимов предоставляют туннель тем или иным способом, этот режим предназначен для более сложных случаев использования. Представьте его себе как проброс портов в SSH. Он позволяет пробрасывать определенный порт с хоста в сеть WARP или из сети WARP на хост.

Зачем это может понадобиться? Для обычного WARP эта функция довольно бесполезна. Фактически, команда registration этого инструмента не может даже правильно ее настроить. Однако при некоторой ручной настройке и при условии, что у вас есть сеть ZeroTrust, вы можете настроить связь между устройствами WARP. Каждое устройство будет иметь уникальный внутренний IPv4 и IPv6 адрес и сможет связываться друг с другом таким образом. Однако из коробки это так не работает, поэтому следуйте официальному руководству, чтобы настроить это. Как только у вас это заработает, вы можете использовать эту функцию для проброса портов в сеть WARP и из нее.

[!TIP]
Для правильной работы этого режима очень важно иметь актуальные IP-адреса в конфигурации. Запуск процесса активации (enrollment) перед установкой проброса должен установить правильные IP.

Этот режим кроссплатформенный и не требует специальных модулей ядра или прав root. Однако он эмулирует весь сетевой стек в пользовательском пространстве, поэтому может быть ресурсоемким.

Что касается настройки. Допустим, у вас в конфигурации есть это:

"ipv4": "100.96.0.3"

Это означает, что внутренний IPv4-адрес вашего устройства —100.96.0.3. Вы запускаете веб-сервер на хост-машине на порту 8080. Затем есть другое устройство с внутренним IPv4-адресом 100.96.0.2, которое также предоставляет веб-сервер на порту 8081. Вы хотите пробросить порт 8080 хоста в сеть WARP и порт 8081 из сети WARP на хост. Чтобы настроить это, выполните:

$ ./usque portfw -R 100.96.0.3:8080:localhost:8080 -L localhost:8081:100.96.0.2:8081
[!TIP]
Синтаксис не совсем такой, как в SSH. Я предлагаю указывать синтаксис, как в примере, предпочтительно с IP-адресами, а не с именами хостов.
[!TIP]
Поддерживается любое количество портов. Вы можете объединить несколько портов, если укажете флаг и соответствующий аргумент один за другим.

Конфигурация

Для простоты инструмент использует файл конфигурации JSON. Файл по умолчанию —config.json в текущей директории. Вы можете указать другой файл с помощью флага -c. Это будет учитываться всеми подкомандами. Без файла конфигурации будет работать только подкоманда register.

Пример конфигурации:

{
"private_key": "M...redacted...==",
"endpoint_v4": "162.159.198.1",
"endpoint_v6": "2606:4700:103::",
"endpoint_pub_key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIaU7MToJm9NKp8YfGxR6r+/h4mcG\n7SxI8tsW8OR1A5tv/zCzVbCRRh2t87/kxnP6lAy0lkr7qYwu+ox+k3dr6w==\n-----END PUBLIC KEY-----\n",
"license": "A...redacted...Z",
"id": "00000000-0000-0000-0000-000000000000",
"access_token": "00000000-0000-0000-0000-000000000000",
"ipv4": "172.16.0.2",
"ipv6": "2606:redacted:1"
}

Поля

  • private_key: Закрытый ключ ECDSA в кодировке Base64 на кривой NIST P-256 в формате ASN.1 DER. Конфиденциально. Используется для аутентификации устройства.
  • endpoint_v4: IPv4-адрес конечной точки Cloudflare WARP. Публично. Используется для подключения к сети WARP.
  • endpoint_v6: IPv6-адрес конечной точки Cloudflare WARP. Публично. Используется для подключения к сети WARP.
  • endpoint_pub_key: Открытый ключ ECDSA в кодировке Base64 на кривой NIST P-256 в формате PEM. Публично. Используется для гарантии того, что мы действительно общаемся с конечной точкой Cloudflare WARP, а не подвергаемся атаке MiTM.
  • license: Лицензия, возвращенная сервером для нашей учетной записи. Конфиденциально. С ее помощью можно привязать несколько устройств к одной учетной записи.
  • id: Идентификатор устройства, выданный нам сервером. Публично. Используется для идентификации устройства и API-вызовов.
  • access_token: Токен доступа, выданный нам сервером при регистрации/входе. Конфиденциально.Используется для API-вызовов.
  • ipv4: Внутренний IPv4-адрес, назначенный устройству сетью Cloudflare WARP. Публично. Назначается интерфейсу устройства и также используется для связи между устройствами в режиме проброса портов.
  • ipv6: Внутренний IPv6-адрес, назначенный устройству сетью Cloudflare WARP. Публично. Назначается интерфейсу устройства и также используется для связи между устройствами в режиме проброса портов.

Поддержка ZeroTrust

На мой взгляд, ZeroTrust — это корпоративная версия WARP от Cloudflare. Подробное объяснение выходит за рамки этого README.

Хотя инструмент не сможет вас аутентифицировать в ZeroTrust (поскольку для входа требуется SSO), практика показывает, что вы можете заставить соединение работать, если очень захотите. Для этого вам нужно выполнить ./usque register --jwt <jwt> или вручную собрать файл конфигурации. Если вы выберете ручное создание конфигурации, я предлагаю использовать команду register для получения конфигурации персонального WARP. Оставьте все поля неизменными, кроме access_token и id. Что касается того, как их получить, проявите творческий подход. Например, оба они могут быть извлечены из /var/lib/cloudflare-warp/reg.json, если используется официальный клиент WARP на Linux. Или существующие идентификаторы устройств перечислены в панели управления ZeroTrust. Как только они будут на месте, вы можете использовать команду enroll для обновления конфигурации новыми данными. Вы увидите, что поле license пустое. Это нормально. ZeroTrust не использует лицензии (насколько мне известно).

Связь Warp-to-Warp поддерживается всеми режимами этого инструмента, если вы правильно ее настроили. Прокси и туннели могут достигать сервисов, предоставляемых на других устройствах, а проброс портов может использоваться для перенаправления портов в сеть WARP и из нее.

[!TIP]
Похоже, что эти туннели получают доступ к сети warp=plus с лучшей маршрутизацией. Однако, как только включается Proxy — что требуется для связи Warp-to-Warp — соединение понижается до warp=on. Это приводит к снижению производительности (хотя обычно все еще довольно высокой).
[!TIP]
По умолчанию Cloudflare логирует большинство запросов. Вы можете захотеть отключить это, чтобы сохранить сомнительную веру в немного большую приватность. 👀
[!WARNING]
Вы должны переподключиться после внесения изменений, чтобы они вступили в силу.
[!NOTE]
Вам, вероятно, следует установить SNI в zt-masque.cloudflareclient.com, указав -s zt-masque.cloudflareclient.com при использовании любого режима, связанного с туннельным соединением. Значение по умолчанию consumer-masque.cloudflareclient.com также работает, но не рекомендуется.

Производительность

Проект все еще находится на ранних стадиях разработки (я рад, что мне вообще удалось заставить его работать), и производительность не была приоритетом. На самом деле я даже не слишком хорошо знаком с Go. Официальный клиент (по крайней мере, на Linux и Android) реализован на Rust с помощью потрясающего проекта quiche. В отличие от него, этот инструмент написан на Go и использует хорошо поддерживаемую библиотеку quic-go, которая предлагает широкую поддержку протокола QUIC. Однако она поддерживает только алгоритм управления перегрузкой reno и не является самой производительной реализацией, особенно в сетевых средах с высокой задержкой.

Многие другие функции, такие как happy eyeballs, также отсутствуют.

Так что да, производительность может быть не самой лучшей. Однако мне удалось выжать 833.60 Mbps на скачивании и 772.88 Mbps на загрузке на соединении 1 Gbps с Warp+ при первой попытке с использованием режима SOCKS5-прокси с Firefox и speedtest.net. Тест проводился на конфигурации с AMD Ryzen 7 5700U,16 ГБ ОЗУ на Arch Linux. Для меня этого достаточно. Я уверен, что есть возможности для улучшения. Но помните, что все это работает в пользовательском пространстве; режим SOCKS даже эмулирует собственную сетевую стеку. Использование ЦП составило около 26%.

Я слышал, что производительность в Windows хуже. У меня нет машины с Windows для тестирования. Если она у вас есть, пожалуйста, сообщите о вашем опыте.

Тюнинг Производительности

Linux/BSD

quic-go корректно предупредит вас, если значение установлено слишком маленьким на вашей машине. Но размер буфера UDP по умолчанию в Linux довольно мал. Вы можете увеличить его, выполнив:

$ sudo sysctl -w net.core.rmem_max=7500000
$ sudo sysctl -w net.core.wmem_max=7500000

Обратитесь к документации quic-go для лучшего объяснения.

DNS

По умолчанию все режимы, кроме режима нативного туннеля, будут использовать Quad9 для разрешения DNS-запросов. Хотя это кажется странным выбором для клиента Cloudflare, я предпочитаю их 1.1.1.1 из-за их заявлений о конфиденциальности. Я считаю, что это достойный вариант по умолчанию. Однако 1.1.1.1 обычно имеет лучшую производительность. Вы можете изменить DNS-сервер, используемый инструментом, указав флаг -d.

Например:

$ ./usque socks -d 1.1.1.1 -d 1.0.0.1 -d 2606:4700:4700::1111 -d 2606:4700:4700::1001

Нативные туннели не настраивают DNS. Будет использоваться то, что установлено в вашей системе. Маршрутизация DNS-пакетов в туннель или куда-либо еще также полностью зависит от вас.

Использование инструмента как библиотеки

На данный момент это в первую очередь CLI-инструмент. Однако были приложены некоторые усилия для документирования и предоставления определенных функций, которые можно использовать для создания собственных приложений. Я не рекомендую этого делать пока что, потому что реализация довольно нестабильна, и API может измениться. Я также не сделал абстракцию лучшим образом, потому что моей основной целью было заставить его работать, а второй целью — сделать что-то легко читаемое. Поэтому вместо того, чтобы использовать его напрямую как библиотеку, люди могут форкать и добавлять дополнительную функциональность по своему желанию. Я открыт для PR, которые делают код более модульным и простым в использовании в качестве библиотеки.

В качестве отправной точки вы можете обратиться к пакету api/. Для примеров взгляните на пакет cmd/.

Известные Проблемы

  • удаленная сторона разрывает соединение: Если вы неактивны какое-то время, удаленная сторона может разорвать соединение с ошибкой H3_NO_ERROR. Подобное поведение наблюдалось ранее в их хорошо изученной реализации WireGuard, где длинные открытые соединения без значительной сетевой активности разрывались. Официальные приложения просто переподключаются, когда это происходит, поэтому я реализовал аналогичное поведение. Так что если вы видите разрывы соединения, не волнуйтесь, это, вероятно, просто удаленная сторона. Инструмент переподключится автоматически.
  • взаимодействие с Cloudflare API ограничено: Это также преднамеренно. Основное внимание инструмента — MASQUE. Если вам нужна лучшая поддержка, я предлагаю официальный клиент или wgcf.
  • нет поддержки WireGuard: Это клиент MASQUE. Если вам нужен WireGuard, используйте официальный клиент или wgcf.
  • нет поддержки DoH и т.д.: Да, официальные клиенты предоставляют много дополнительных функций, связанных с DNS. Я хотел оставить этот инструмент легковесным. Вероятно, они не будут поддерживаться мной. Если хотите, вы можете использовать сторонние DoH-клиенты и настроить их на использование туннельного интерфейса. DNS через Warp уже должен работать во всех режимах, кроме режима нативного туннеля, поскольку все DNS-запросы, сделанные внутри туннеля, будут проходить через туннель (если вы не используете флаг -l).
  • медленные начальные скорости: Вы можете испытывать медленные скорости при открытии нового соединения, которые могут постепенно увеличиваться со временем. Это связано с алгоритмом управления перегрузкой reno, используемым quic-go. Это не самый производительный алгоритм, особенно не для сред с высокой задержкой. Нам придется подождать поддержки различных алгоритмов управления перегрузкой и посмотреть, как они сравниваются. Например, существует открытая проблема для BBR.
  • нативные туннели поддерживают только Linux: Это связано с тем, что мы зависим от устройства TUN. Хотя оно существует в Android, без root-прав его сложно использовать в текущей форме. Поддержка Windows была бы осуществима, но у меня нет опыта работы с Windows API относительно того, как назначать IP-адреса сетевым интерфейсам. Поддержка BSD и macOS не определена. Все эти платформы пока не поддерживаются, потому что у меня нет возможности их тестировать, и я не хочу делиться непроверенным кодом. PR приветствуются.

Разное

Обход цензуры

Вряд ли есть способ отличить трафик MASQUE от другого трафика HTTP/3. Однако QUIC требует TLS v1.3, поэтому мы отправляем ClientHello с client-masque.cloudflareclient.com в поле SNI. Некоторые файрволы могут блокировать это. Вы можете изменить SNI, указав флаг -s на любой домен (исходя из моего опыта), и соединение все равно будет работать. Обратите внимание, что это определенно не предполагаемый вариант использования Cloudflare (просто приятный побочный эффект). И прежде чем пытаться обойти что-либо, вы должны убедиться, что не нарушаете никаких законов. Лично я вижу в этом явное преимущество для сокрытия факта подключения к Warp от MiTM-атак.

Стоит ли заменять WireGuard на это?

Это зависит от ваших потребностей. 😊 WireGuard — отличный протокол, и его современная/быстрая криптография плюс возможность поддержки в режиме ядра — это замечательные вещи. Если он работает для вас, я не думаю, что вам стоит переключаться.

MASQUE работает в пользовательском пространстве, как и QUIC, лежащий в его основе протокол, что делает реализацию более медленной. Хотя у него также есть определенные преимущества, такие как полноценная поддержка TLS (WireGuard поставляется с фиксированным набором шифров), регулируемое управление перегрузкой, более продвинутые параметры настройки, он также более сложен.

В конечном счете, если вы довольны WireGuard, я не вижу причин для перехода. Если вы довольны Warp, но хотите использовать его на платформе, которая не имеет официальной поддержки, этот инструмент может быть для вас.

Почему вы все равно можете переключиться?

  • появились сообщения, что WARP+ больше не работает через WireGuard: Я видел сообщения, что WARP+ больше не работает через WireGuard. Хотя я не могу этого подтвердить, я читал отчеты, что для некоторых это так (см.). С этим инструментом это, кажется, работает для меня, поэтому я считаю это возможной альтернативой.
  • вы хотите использовать WARP на платформе, не имеющей официальной поддержки: Этот инструмент кроссплатформенный и с открытым исходным кодом, поэтому вы можете использовать его на любой платформе, поддерживающей Go. Это включает Windows, macOS, BSD, Linux, Android, iOS и т.д. Я надеюсь, что он будет работать на всех из них.
  • некоторые сети блокируют WireGuard: Некоторые сети блокируют WireGuard, но не блокируют QUIC.
  • вы любознательный тип: Вы любознательный тип и хотите экспериментировать с крутыми новыми технологиями. MASQUE — это новый и интересный подход... Так почему бы и нет? 😊

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

Этот документ был бы большим и слишком ужасающим для среднего читателя, если бы я включил все детали протокола и проведенного мной исследования. Если вы один из немногих, кого интересуют некоторые детали, пожалуйста, обратитесь к файлу RESEARCH.md. В нем в формате, похожем на блог, суммируются проведенные мной исследования и детали протокола. В будущем я планирую написать ясный и сжатый документ по протоколу, который будет связан здесь.

Почему это было создано?

В основном потому, что я хотел поэкспериментировать с крутыми новыми технологиями, и MASQUE привлек мое внимание. Я был шокирован, увидев, что там не так много реализаций с открытым исходным кодом, на самом деле я не видел много практических применений connect-ip в открытом доступе. Я хотел это изменить и немного "прорекламировать".

Во-вторых, я довольно часто полагаюсь на WARP для сайтов, проксируемых через Cloudflare, поскольку пиринг между моим ISP и обычными сайтами, защищенными Cloudflare, не самый лучший. С WARP+ я получаю лучшие маршруты и более высокие скорости. Однако реализация WireGuard в официальном клиенте работает в пользовательском пространстве, поэтому я использовал wgcf вместо этого, чтобы запускать ее в режиме ядра. В последнее время он часто работал некорректно; по какой-то причине мне приходилось переподключаться несколько раз, когда я хотел его использовать. Он начинал работать после нескольких попыток, но это было раздражающе. В репозитории wgcf есть несколько открытых проблем, связанных с этим, например, эта и эта. WireGuard также был заблокирован в локальном WiFi поезда, а MASQUE — нет.

Затем я переключился на официальный клиент и MASQUE, которые работали гораздо надежнее. Однако все приложение довольно тяжелое (260 MiB в сжатом виде для Android на момент написания этого). Cloudflare One, корпоративная версия, намного легче...

Но в любом случае, я обнаружил, что приложение использует слишком много памяти, и это была даже не худшая часть.

Я понял это, случайно сидя в поезде и просматривая интернет с включенным Warp. Время от времени он падал и отключал весь VPN-профиль, оставляя мой трафик открытым для локального WiFi. Это было довольно неприятно и стало последней каплей, которая заставила меня начать этот проект.

Хотя он еще не решает проблему переподключения, это запланировано. И с шагом вперед в виде открытия исходного кода этого проекта, я надеюсь, что сообщество поможет мне сделать этот инструмент лучше и надежнее.

Почему вы форкнули connect-ip-go?

Потому что реализация Cloudflare не совсем соответствует RFC 9484, и она не будет работать без прямого исправления (monkey patching) библиотеки. Найдите мою, возможно, некрасивую, но, надеюсь, работающую версию здесь.

Почему такое название?

Очевидно, я не планировал называть его warp,cloudflare или что-то подобное, чтобы уменьшить конфликты или чтобы пользователи не стучались не в те двери за поддержкой из-за моих ошибочных попыток реализации.

Поскольку основная технология — MASQUE, я хотел придумать что-то короткое, запоминающееся и уникальное, но все же связанное с основной технологией. У меня было забавные 4 года латыни в школе, поэтому я подумал, что идеальное название —usque. Если я могу доверять своей проржавевшей памяти, это означает весь путь, до конца. Я подумал, что это хорошо подходит, потому что это инструмент, который туннелирует весь путь до сети Cloudflare. Мы также пройдем долгий путь, пока это станет стабильным. Вы поняли идею... 😊 Это также (надеюсь) достаточно уникально, чтобы не конфликтовать с другими проектами.

Вклад в проект

Вклад приветствуется. На самом деле я студент университета с очень ограниченным временем и ресурсами. Пока что инструмент в основном реализует мои потребности и идеи, но я хотел бы видеть, как он растет и становится более стабильным, с множеством интересных функций в будущем. Если у вас есть какие-либо идеи, предложения, сообщения об ошибках или даже код, не стесняйтесь открывать issue или pull request. Я сделаю все возможное, чтобы ответить вам.

Благодарности

Этот инструмент не существовал бы без следующих невероятных проектов. Пожалуйста, поставьте им звезды, если вам нравится этот проект!

  • Cloudflare Blogs - У них есть интересные идеи, задокументированные в их блогах. Я почерпнул некоторые знания оттуда.
  • cobra - Мощная библиотека CLI для Go. Используется для CLI-интерфейса. Абсолютно обожаю ее.
  • connect-ip-go - ~~Единственная реализация с открытым исходным кодом для RFC 9484, которую я смог найти.~~ (это уже не так, см.) Все наше IP-туннелирование зависит от этого. Мы сильно полагаемся на мой форк этого проекта.
  • Frida - Это была огромная помощь для динамического анализа официального клиента. Я мог видеть, что происходит в приложении в реальном времени, и сбрасывать определенные значения.
  • frida-interception-and-unpinning - Очень хорошо справляется с отключением закрепления сертификатов (cert. pinning), так что я мог изучить, как приложение совершает API-вызовы.
  • friTap - За исключительно хорошо написанный и простой в использовании скрипт Frida, который можно использовать для легкого дампа TLS-секретов.
  • Go - Язык программирования Go. Я не профессиональный разработчик, но мне удалось заставить это работать на Go. Это отличный язык.
  • go-socks5 - Отличная библиотека SOCKS5 для Go. Используется для режима SOCKS5-прокси. Научила меня многому о протоколе SOCKS.
  • gvisor - Gvisor — отличный инструмент для запуска ненадежного кода в безопасной среде. Они также реализуют полную сетевую стеку в пользовательском пространстве. Это делает возможным работу всех прокси-режимов без root и кроссплатформенно.
  • IDA Free - Отличная вещь для работы с rust-бинарниками. Помогла многое понять в официальном клиенте.
  • JADX-GUI - Отличная вещь для работы с Android APK. Помогла многое понять в официальном клиенте.
  • masque-go - Хотя я в итоге не использовал ее, так как она предназначена для connect-udp подобных RFC 9298 совместимых MASQUE-серверов, она была отличной отправной точкой, пока я исследовал тему.
  • mitmproxy - Очень полезен для перехвата API-вызовов, совершаемых официальным клиентом.
  • netlink - Отличная библиотека для взаимодействия с сетевой стекой Linux с помощью iproute2. Используется для режима нативного туннеля в Linux.
  • quic-go - Мощная библиотека QUIC для Go, используется для многих вещей, от установления соединения до его поддержания.
  • uritemplate - Отличная библиотека для разбора URI-шаблонов. Используется как утилита для передачи правильного URI конечной точки в connect-ip-go.
  • water - Библиотека TUN/TAP для Go. Используется для режима нативного туннеля. Научила меня всему, что я знаю об устройствах TUN/TAP.
  • wireguard-go - Библиотека WireGuard для Go. Также очень широко используется проектом для создания виртуальных tun-сетей без root, потому что ее реализация netstack очень проста в использовании.
  • wireshark - Я использовал Wireshark для отладки как официального клиента, так и этого инструмента на начальных этапах разработки. Настоящий швейцарский нож для сетевой отладки.

Особая благодарность @monkeywave, одному из контрибьюторов friTap, который помог мне расшифровать последнюю часть информации, необходимой для того, чтобы заставить этот инструмент работать. Фактически, если бы не они, я, вероятно, отказался бы от этого проекта. Они помогли мне и терпеливо направляли меня через процесс дампа TLS-секретов из официального клиента. Эту проблему стоит почитать, если вам интересно. Один из лучших опытов, которые у меня были в сообществе open-source. Спасибо!

Еще одна благодарность @marten-seemann за поддержку всей экосистемы quic-go. Я также открыл там несколько issues и всегда получал полезный ответ. Спасибо!

Отказ от ответственности

Пожалуйста, НЕ используйте этот инструмент для злоупотреблений. В конечном итоге вы вредите Cloudflare, что, вероятно, несправедливо, поскольку вы получаете эти вещи даже бесплатно, во-вторых, вы, скорее всего, добьетесь санкций для этого инструмента и испортите удовольствие всем.

Инструмент имитирует определенные свойства официальных клиентов, в основном это делается для стабильности и совместимости. Я никогда не собирался делать этот инструмент неотличимым от официальных клиентов. Это означает, что если они захотят обнаружить этот инструмент, они смогут. Я не несу ответственности за любые последствия, которые могут возникнуть в результате использования этого инструмента. Это полностью ваша собственная ответственность. Я не несу ответственности за любой ущерб, который может произойти с вашей системой или вашей сетью. Этот инструмент предоставляется как есть, без каких-либо гарантий. Используйте на свой страх и риск.

Хотя инструмент был создан с учетом соображений безопасности, я не эксперт по безопасности и не IT-профессионал. Я просто любитель, и это просто хобби-проект. Еще раз, используйте на свой страх и риск. Однако отчеты о безопасности приветствуются. Не стесняйтесь открывать issue с вашими контактными данными, и я свяжусь с вами, чтобы вы могли поделиться своими находками В ЧАСТНОМ ПОРЯДКЕ. Когда будет достаточно времени, чтобы исправить проблему, я укажу вас в примечаниях к выпуску, и находки могут быть обнародованы. Я ценю любую помощь в том, чтобы сделать этот инструмент более безопасным.

Этот инструмент никак не связан с Cloudflare. Инструмент не был одобрен или проверен Cloudflare. Это независимый исследовательский проект. Cloudflare Warp, Warp+, 1.1.1.1™, Cloudflare Access™, Cloudflare Gateway™ и Cloudflare One™ являются зарегистрированными товарными знаками/словесными обозначениями Cloudflare, Inc. Если вы сотрудник Cloudflare и считаете, что этот проект каким-либо образом вреден, пожалуйста, откройте issue, и я сделаю все возможное, чтобы связаться с вами и решить проблему.