Для включения в состав ветки net-next, на основе которой формируется начинка сетевой подсистемы для будущего выпуска ядра Linux, предложен (https://lkml.org/lkml/2018/10/6/137) набор патчей с седьмой версией VPN-интерфейса от проекта WireGuard (https://www.wireguard.io/). Проект предлагает минималистичную реализацию VPN на основе современных методов шифрования, очень быструю, простую в использовании и лишённую усложнений. WireGuard развивается с 2015 года, прошёл аудит и формальную верификацию (https://www.wireguard.com/formal-verification/) применяемых методов шифрования. VPN уже хорошо зарекомендовал себя в ряде крупных внедрений, обрабатывающих большие объёмы трафика.
В WireGuard применяется концепция маршрутизации по ключам шифрования, которая подразумевает привязку к каждому сетевому интерфейсу закрытого ключа и применение для связывания открытых ключей. Обмен открытыми ключами для установки соединения производится по аналогии с SSH. Для согласования ключей и соединения без запуска отдельного демона в пространстве пользователя применяется механизм Noise_IK из Noise Protocol Framework (http://noiseprotocol.org/), похожий на поддержание authorized_keys в SSH. Передача данных осуществляется через инкапсуляцию в пакеты UDP. Поддерживается смена IP-адреса VPN-сервера (руминг) без разрыва соединения и автоматической перенастройкой клиента.
Для шифрования используется (https://www.wireguard.io/protocol/) потоковый шифр ChaCha20 (http://cr.yp.to/chacha.html) и алгоритм аутентификации сообщений (MAC) Poly1305 (http://cr.yp.to/mac.html), разработанные Дэниелом Бернштейном (Daniel J. Bernstein (http://cr.yp.to/djb.html)), Таней Ланге
(Tanja Lange) и Питером Швабе (Peter Schwabe). ChaCha20 и Poly1305 позиционируются как более быстрые и безопасные аналоги AES-256-CTR и HMAC, программная реализация которых позволяет добиться фиксированного времени выполнения без задействования специальной аппаратной поддержки. Для генерации совместного секретного ключа применяется протокол Диффи-Хеллмана на эллиптических кривых в реализации Curve25519 (http://cr.yp.to/ecdh.html), также предложенной Дэниелом Бернштейном. Для хэширования используются алгоритм BLAKE2s (RFC7693) (https://www.opennet.ru/opennews/art.shtml?num=35676).
Кроме применения быстрых алгоритмов для повышения производительности было решено отказаться от использования предоставляемого ядром crypto API, который достаточно медленный из-за дополнительной буферизации. Собственные реализации примитивов ChaCha20, Poly1305, Blake2s и Curve25519 вынесены в отдельную библиотеку Zinc (https://www.opennet.ru/opennews/art.shtml?num=49064), которая может дополнить текущий crypto API и предоставить основу для будущей переработки.
При тестировании (https://www.wireguard.com/performance/) производительности WireGuard продемонстрировал в 3.9 раза более высокую пропускную способность и в 3.8 раз более высокую отзывчивость, по сравнению с OpenVPN (256-bit AES c HMAC-SHA2-256). По сравнению с IPsec (256-bit ChaCha20+Poly1305 и AES-256-GCM-128) в WireGuard наблюдается небольшое опережение по производительности (13-18%) и снижению задержек (21-23%).
URL: https://lkml.org/lkml/2018/10/6/137
Новость: https://www.opennet.ru/opennews/art.shtml?num=49401