Pull to refresh
157.11

WireGuard заработал в режиме ядра WindowsNT

Reading time3 min
Views12K


Разработчик WireGuard VPN Джейсон Доненфельд выпустил новую версию WireGuardNT, которая работает в режиме ядра WindowsNT (7, 8.1, 10, 11, 2012, 2016, 2019, 2022). Перенос всего кода в ядро значительно повышает пропускную способность туннеля практически на любых соединениях, особенно по WiFi.

Примечание. Чтобы запустить свою программу на уровне ядра Windows и не иметь проблем с Microsoft SmartScreen, разработчику требуется приобрести сертификат подписи кода типа EV, который стоит намного дороже, чем обычный сертификат подписи кода — примерно $2000 за трёхлетний. Хорошо, что у опенсорсного некоммерческого проекта WireGuard есть спонсоры.

WireGuard — свободный и открытый VPN, который превосходит IPsec и OpenVPN за счёт трёх основных факторов: высокая производительность, лучшая безопасность и простота в использовании.

Заявленные преимущества WireGuard:

  • современные криптографические алгоритмы: шифр Curve25519 для ECDH на эллиптических кривых, ChaCha20 для симметричного шифрования с аутентификацией Poly1305 и использованием AEAD-режима блочного шифрования из RFC7539, BLAKE2s для быстрого безопасного хэширования (RFC7693), SipHash для ключей в хэш-таблицах, HKDF для получения ключей, как описано в RFC5869, и др.;
  • компактный читаемый код, который проще исследовать на уязвимости;
  • высокая производительность;
  • чёткая и проработанная спецификация.



Сравнение производительности различных VPN. Источник: WireGuard


Сравнение производительности WireGuard и OpenVPN. Источник: WireGuard

В январе 2020 года после нескольких лет разработки Линус Торвальдс принял WireGuard в основную ветку ядра Linux 5.6. Линус высоко оценил программу с точки зрения качества кода.


Отзыв Линуса можно заносить в резюме

В обычной версии WireGuard для Windows используется реализация WireGuard на Go в userspace. Она привязывается к виртуальному сетевому устройству, большая часть которого также находится в userspace. Джейсон Доненфельд написал собственный виртуальный сетевой интерфейс Wintun, поскольку существующая реализация tap-windows от OpenVPN оставляет желать лучшего.

Wintun определённо лучше tap-windows: даже в проекте OpenVPN такая замена увеличивает пропускную способность туннеля примерно в полтора раза (с 414 до 737 Мбит/с в клиенте OpenVPN 2, с 652 до 904 в OpenVPN 3, в обоих случаях на 7-гигабитном канале). Но при этом мы всё равно не избавляемся от необходимости постоянных контекстных переключений из пространства ядра (реальный сетевой стек) в пространство пользователя (OpenVPN и wireguard-go).

Поэтому для максимальной производительности VPN желательно перенести в ядро весь стек, включая виртуальный адаптер, криптографию и всё остальное. В Linux для этого создаётся модуль DLKM (Dynamically-Loadable Kernel Module), а в Windows — драйвер устройства в ядре. Кстати, проект WireGuardNT начинался именно как прямой порт WireGuard для ядра Linux.


Архитектура ядра WindowsNT

По словам Доненфельда, кодовая база хорошо срослась с нативным кодом ядра и программными интерфейсами NDIS для сетевых драйверов. В итоге получилась «глубоко интегрированная и высокопроизводительная реализация WireGuard для ядра NT, использующая весь спектр возможностей ядра NT и NDIS».

Устранив переключения контекста, удалось значительно повысить производительность. По независимым тестам Ars Technica, на одном и том же оборудовании WireGuardNT даёт на 10−25% больше пропускной способности, чем wireguard-go и Wintun. Другие тестеры говорят даже о росте производительности в несколько раз (с 95 до 600 Мбит/с по WiFi). Сам Джейсон на тестовой Windows-машине зафиксировал производительность 7,5 Гбит/с по VPN.

Каждый может проверить разницу на своём канале. Для этого нужно установить WireGuardNT (последняя версия 0.4.5) и вручную добавить ключ и значение в реестр: regedit от администратора, HKLMSoftware, создать ключ WireGuard, а внутри DWORD-значение ExperimentalKernelDriver.

> reg add HKLM\Software\WireGuard /v ExperimentalKernelDriver /t REG_DWORD /d 1 /f

Если значение ExperimentalKernelDriver установлено в DWORD(1), туннели будут использовать новый код WireGuardNT в ядре, а DWORD(0) запускает старый код wireguard-go/wintun. В будущем код ядра включат по умолчанию.

Вообще, это интересный пример того, как программист-любитель пишет более качественный код для ядра Windows, чем профессионалы из Microsoft. Интересно, сколько человек работает над функцией Always On VPN в Windows Server?




PKI-решения для малого и среднего бизнеса


Свяжитесь с нами: +7 (499) 678 2210, sales-ru@globalsign.com.
Tags:
Hubs:
Total votes 28: ↑28 and ↓0+28
Comments32

Articles

Information

Website
www.globalsign.com
Registered
Founded
1996
Employees
501–1,000 employees
Location
Япония