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).
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.