До кодової бази FreeBSD додано нову реалізацію VPN WireGuard

У дерево вихідних текстів FreeBSD прийнято зміни з новою реалізацією VPN WireGuard, заснованої на коді модуля ядра, спільно підготовленого основними командами розробників FreeBSD і WireGuard за участю Джейсона Доненфілда (Jason A. Donenfeld), автора VPN WireGuard, та Джона Болдуіна. ), відомого розробника 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

Додати коментар або відгук