![](https://habrastorage.org/webt/73/ng/ly/73nglywmhoiuha-zqbqxezmb8wc.png)
Разработчик 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, и др.;
- компактный читаемый код, который проще исследовать на уязвимости;
- высокая производительность;
- чёткая и проработанная спецификация.
![](https://habrastorage.org/webt/f8/xd/jc/f8xdjcqx5ewst8bo6oc6lv4yopw.png)
Сравнение производительности различных VPN. Источник: WireGuard
![](https://habrastorage.org/webt/sr/07/ry/sr07ryette8vptpzkszmnl380ly.png)
Сравнение производительности WireGuard и OpenVPN. Источник: WireGuard
В январе 2020 года после нескольких лет разработки Линус Торвальдс принял WireGuard в основную ветку ядра Linux 5.6. Линус высоко оценил программу с точки зрения качества кода.
![](https://habrastorage.org/webt/df/bg/8s/dfbg8ska6euiiygmp61iyzu5lco.png)
Отзыв Линуса можно заносить в резюме
В обычной версии 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.
![](https://habrastorage.org/webt/m6/m3/g1/m6m3g1chng6wbqkchmckdjpj7d4.gif)
Архитектура ядра 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
от администратора, HKLM
→Software
, создать ключ 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?
![](https://habrastorage.org/webt/t_/mj/di/t_mjdil1-hcik5q18eg_sgm8uua.jpeg)
PKI-решения для малого и среднего бизнеса
Свяжитесь с нами: +7 (499) 678 2210, sales-ru@globalsign.com.