В кода на FreeBSD были внесены изменения с новой реализацией VPN WireGuard, основанной на коде модуля ядра, который был совместно разработан основными командами разработчиков FreeBSD и WireGuard с участием Джейсона Доненфилда (Jason A. Donenfeld), создателя WireGuard, и Джона Болдуина (John H. Baldwin), известного разработчика GDB и FreeBSD, который в начале 2000-х годов реализовал поддержку SMP и NUMA в ядре FreeBSD. После принятия драйвера в состав FreeBSD (sys/dev/wg), его разработка и поддержка теперь будет вестись в репозитории FreeBSD.
Перед тем как разрешить использование кода, под контролем организации FreeBSD Foundation было проведено полное рецензирование изменений, в ходе которого также было проанализировано взаимодействие драйвера с другими подсистемами ядра и оценена возможность использования криптографических примитивов, предоставляемых ядром.
Для поддержки необходимых драйверу криптографических алгоритмов было расширено API криптоподсистемы ядра FreeBSD, в которое добавлена обвязка, позволяющая использовать через стандартный крипто-API алгоритмы, не поддерживаемые во FreeBSD, используя необходимые алгоритмы из библиотеки libsodium. Из алгоритмов, встроенных в драйвер, остался только код для вычисления хэшей Blake2, так как предоставляемая во FreeBSD реализация данного алгоритма завязана на фиксированный размер хэша.
Кроме того, в процессе рецензирования была проведена оптимизация кода, что позволило повысить эффективность распределения нагрузки на многоядерных CPU (обеспечена равномерная балансировка привязки задач шифрования и расшифровки пакетов к ядрам CPU). В итоге накладные расходы при обработке пакетов были приближены к реализации драйвера для Linux. В коде также обеспечена возможность использования драйвера ossl для ускорения операций шифрования.
В отличие от предыдущей попытки интеграции WireGuard во FreeBSD, в новой реализации используется штатная утилита wg, а не модифицированная версия ifconfig, что позволило унифицировать настройку в Linux и FreeBSD. Утилита wg, как и драйвер, включена в состав исходных текстов FreeBSD, что стало возможным благодаря изменению лицензии на код wg (код теперь доступен под лицензиями MIT и GPL). Прошлая попытка интеграции WireGuard в FreeBSD была предпринята в 2020 году, но завершилась скандалом, в результате которого уже добавленный код был удалён из-за низкого качества, небрежной работы с буферами, использования заглушек вместо проверок, неполной реализации протокола и нарушения лицензии GPL.
Напомняме, че VPN WireGuard е реализиран на базата на съвременни методи на криптиране, осигурява много висока производителност, лесен е за употреба, лишен е от усложнения и се е доказал в редица големи внедрения, обработващи значителни обеми трафик. Проектът се развива от 2015 г., преминал е одит и формална верификация на приложените методи на криптиране. В WireGuard се прилага концепцията за маршрутизация на база криптографски ключове, която подразбира свързване на всеки мрежов интерфейс с частен ключ и използване за свързване на публични ключове.
Обменът на публични ключове за установяване на връзка се извършва по аналогия с SSH. За съгласуване на ключовете и връзката без да е необходимо стартиране на отделен демон в потребителското пространство се използва механизмът Noise_IK от Noise Protocol Framework, подобен на поддържането на authorized_keys в SSH. Прехвърлянето на данни се осъществява чрез инкапсулация в UDP пакети. Поддържа се смяна IP адреси VPN-сервери (роуминг) без разкъсване на връзката с автоматично преустановяване на клиента.
За шифроване се използва поточен шифър ChaCha20 и алгоритъм за аутентикация на съобщения (MAC) Poly1305, разработени от Даниел Бернщайн (Daniel J. Bernstein), Таня Ланге (Tanja Lange) и Питър Швабе (Peter Schwabe). ChaCha20 и Poly1305 са позиционирани като по-бързи и безопасни алтернативи на AES-256-CTR и HMAC, чиято софтуерна реализация позволява постигане на фиксирано време за изпълнение без необходимост от специална хардуерна поддръжка. За генериране на съвместен таен ключ се прилага протоколът на Дифи-Хелман върху елиптични криви с реализация Curve25519, също предложена от Даниел Бернщайн. За хеширане се използва алгоритъмът BLAKE2s (RFC7693).
Източник: opennet.ru
