Cloudflare опубликовал реализацию VPN WireGuard на языке Rust

28 марта 2019 года

Компания Cloudflare представила BoringTun, новую реализацию VPN WireGuard, написанную на языке Rust и работающую целиком в пространстве пользователя. Код проекта распространяется под лицензией BSD. В текущем виде BoringTun уже вполне пригоден для экспериментов и начального внедрения (час назад выпущен первый релиз), но пока не рекомендован для повсеместного применения так как ещё не завершён внутренний аудит безопасности кода.

Проект включает в себя исполняемый файл boringtun с обособленной реализацией WireGuard для Linux и macOS, а также библиотеку, которая может использоваться для интеграции функциональности клиента WireGuard в произвольные приложения для любых платформ, включая iOS и Android. Библиотека предоставляет только элементы протокола WireGuard без сопутствующих механизмов туннелирования. Протокол WireGuard спроектирован с оглядкой на простоту и уход от усложнений, что положительно сказывается на надёжности и позволяет достаточно быстро создавать с нуля альтернативные реализации.

Перед созданием нового проекта компанией Cloudflare были проанализированы существующие реализации WireGuard:

  • Эталонный WireGuard на языке Си (GPLv2), поставляемый в форме модуля для ядра Linux. Обладает самой высокой производительностью, но завязан на ядре Linux и не может применяться обособленно;
  • wireguard-go - реализация в пространстве пользователя, написанная на языке Go и поставляемая под лицензией MIT. Проект может применяться в различных ОС, но пока находится на стадии разработки (официального релиза ещё не было, только промежуточные тестовые выпуски);
  • TunSafe - написан на C++ и поставляется под лицензией AGPL. Включает только VPN-клиент и использует подмножество протокола WireGuard. Доступен для Windows, Linux, FreeBSD, Android и iOS, но рассчитан на подключение к централизованному провайдеру VPN (Архивная копия от 29 марта 2020 на Wayback Machine) (на предоставляемом разработчиками сервере используется собственный модуль TunSafe для ядра Linux, но клиент может соединяться к серверам на базе обычного WireGuard);
  • wireguard-rs - реализация на Rust, находящаяся на начальном этапе разработки, ограниченная пока поддержкой macOS, не полностью поддерживающая протокол и поставляемая под лицензией GPLv2.

Среди предъявляемых Cloudflare требований к VPN были работа в пространстве пользователя, многоплатформенность и высокая производительность. Наиболее близко к указанным требованиям подходил wireguard-go, но тесты производительности показали, что скорость его работы очень сильно отстаёт от базовой реализации, работающей на уровне ядра. Узким местом оказался язык Go, который прекрасно подходит для создания серверных приложений, но не оптимален для обработки больших потоков raw-пакетов.

Уже имея опыт разработки высокопроизводительной реализации протокола QUIC на языке Rust, компания Cloudflare приняла решение создать собственную реализацию WireGuard на языке Rust. Язык Rust оказался оптимальным решением, так как сравним с С++ по производительности, но при этом защищает от проблем, возникающих из-за низкоуровневой работы с памятью, и предоставляет средства для достижения высокого параллелизма выполнения заданий. Существующий проект Wireguard-rs не был использован из-за очень сырого кода и лицензии GPLv2 (Cloudflare предпочёл разрешительную лицензию BSD).

Напомним, что в WireGuard применяется концепция маршрутизации по ключам шифрования, которая подразумевает привязку к каждому сетевому интерфейсу закрытого ключа и применение для связывания открытых ключей. Обмен открытыми ключами для установки соединения производится по аналогии с SSH. Для согласования ключей и соединения применяется механизм Noise_IK из Noise Protocol Framework, похожий на поддержание authorized_keys в SSH и не требующий запуска отдельного демона в пространстве пользователя. Передача данных осуществляется через инкапсуляцию в пакеты UDP. Поддерживается смена IP-адреса VPN-сервера (роуминг) без разрыва соединения и автоматической перенастройкой клиента.

Для защиты канала связи в WireGuard используется потоковый шифр ChaCha20 и алгоритм аутентификации сообщений (MAC) Poly1305, разработанные Дэниелом Бернштейном ( Daniel J. Bernstein), Таней Ланге (Tanja Lange) и Питером Швабе (Peter Schwabe). ChaCha20 и Poly1305 позиционируются как более быстрые и безопасные аналоги AES-256-CTR и HMAC, программная реализация которых позволяет добиться фиксированного времени выполнения без задействования специальной аппаратной поддержки. Для генерации совместного секретного ключа применяется протокол Диффи-Хеллмана на эллиптических кривых в реализации Curve25519, также предложенной Дэниелом Бернштейном. Для хэширования используются алгоритм BLAKE2s (RFC7693).

Источники

править
 
 
Creative Commons
Эта статья содержит материалы из статьи «Cloudflare опубликовал реализацию VPN WireGuard на языке Rust», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots в архив и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.