Разработчик 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
от администратора, 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?
PKI-решения для малого и среднего бизнеса
Свяжитесь с нами: +7 (499) 678 2210, sales-ru@globalsign.com.
Комментарии (31)
Iv38
17.08.2021 02:38+2Очень даже хорошая новость.
А если у тебя есть такой добрый отзыв от беспощадного Линуса к пулл-реквесту в ядро, то резюме, в общем-то, можно уже и не писать. Хед-хантеры и так удавят друг-друга.
mrbaranovskyi
17.08.2021 08:58+1хех... я из-за него начал смотреть на Rust... Если уж этот "м*дак" (может так не показаться, но это в положительном ключе) это одобрил, то видимо на это есть причины.
symbix
17.08.2021 03:01+11Вообще, это интересный пример того, как программист-любитель пишет более качественный код для ядра Windows, чем профессионалы из Microsoft.
Я бы не стал называть Джейсона любителем. Он и до создания wireguard был уже известным специалистом, с OSS проектами и собственным микробизнесом в области безопасности. И уж точно его квалификация на порядок выше среднего индуса на окладе в MIcrosoft.
mwizard
17.08.2021 03:19+6Стало неприятным открытием, что теперь в Windows, точно так же, как и в macOS, невозможно загрузить самоподписанный драйвер, даже добавив свой собственный CA. 2000 долларов за возможность запустить свой собственный код на своей собственной машине, как замечательно...
RaymanOne
17.08.2021 06:55+2А пробовали перевести Windows в режим TESTSIGNING?
mwizard
17.08.2021 11:05+1Не соглашусь, это не то же самое.
TESTSIGNING, как и отключение SIP в macOS, позволяет запускать любые драйвера, в том числе подписанные левыми сертификатами каких-нибудь абстрактных вирусописателей.
Это не то же самое, что и запускать драйвера, подписанные моим сертификатом. Я не хочу отказываться от механизмов безопасности ОС — пусть они служат на благо, но меня удручает то, что мое мнение не принимается во внимание. Я должен либо платить, либо согласиться с тем, что будет запущен произвольный код, независимо от его подписи.
RaymanOne
17.08.2021 11:53+5Изначально писали что невозможно загрузить без денег. А невозможно только в пользовательском режиме. А как отделить ваш сертификат от не вашего? А если он подделан? Как в MacOS с этим делом?
mwizard
09.09.2021 20:17В macOS невозможно без денег и договора с Apple (чтобы получить особый entitlement в сертификат подписи), безотносительно режима. Чтобы отличить мой сертификат от не моего, достаточно проследить его цепочку подписей - если она заканчивается на моем CA, то это мой сертификат. Если не заканчивается, или имеются нарушения подписей посредии, то это не мой сертификат.
Мой CA я согласен добавить через csrutil из безопасного режима, как это происходит для отключения SIP. Вот только Apple не согласна. Раньше можно было добавить CA в системное хранилище ключей и использовать его для верификации подписи драйвера, больше нельзя.
Насчет того, что сертификат может быть подделан - как можно подделать сертификат?
RaymanOne
10.09.2021 15:44В macOS невозможно без денег и договора с Apple, безотносительно режима.
Получается на Windows ситуация лучше?
Насчет того, что сертификат может быть подделан - как можно подделать сертификат?
Тут нет компетенции к сожалению, мало ли что поддается взлому...
mwizard
11.09.2021 16:39Получается на Windows ситуация лучше?
Так ведь и на Windows ситуация точно такая же -- без денег никак. Хочешь свой драйвер -- нельзя, можно только вовсе отключить все проверки и сидеть с голой задницей, что в macOS (`csrutil enable --without kext`), что в Windows (TESTSIGNING). В результате может быть загружен совершенно любой драйвер совершенно любой малвари, а не тот, который утвержден моей криптографической подписью.
Тут нет компетенции к сожалению, мало ли что поддается взлому...
Для того, чтобы взломать типичный корневой сертификат с RSA-ключом в 4096 бит, не хватит времени жизни Вселенной. Если Вы считаете, что сертификаты легко подделываются, значит, можно подделать корневой сертификат Apple или Microsoft и подписывать произвольный код и так.
K10
22.09.2021 04:59Мой CA я согласен добавить через csrutil из безопасного режима
Если можете добавить вы, то может добавить и малварь.
mwizard
28.09.2021 12:15+1Не сможет, для этого нужно иметь физический доступ, т.к. использование csrutil подразумевает перезагрузку в recovery mode, которая отличается от обычного другими флагами в nvram. Если малварь может перезагрузиться в recovery, то эта малварь - я.
speller
17.08.2021 07:17Пробовал эту штуку. Очень понравилось. Реально быстро и просто. Но порог вхождения выше простого юзера, поскольку требует начальной настройки, которая может оказаться нетривиальной. Оно реально просто, когда знаешь. А когда не знаешь - можно убить несколько дней на Гугл. Особенно, если клиент или сервер за натом. Документация по настройке на сайте wireguard очень скудная. Спасают только бложики и stackoverflow. И даже если вроде начало работать и пошли пинги, то легко можно тут же упороться в MTU.
remzalp
17.08.2021 08:06+1У меня скорее была проблема - "вот эти две команды запустить и пять строчек в конфиг добавить - И ВСЁ????", в итоге долго и старательно пытался понять что еще донастроить нужно.
speller
17.08.2021 09:02Да, такая же хрень. По описанию всё просто, а когда оно не работает, то фиг пойми, почему.
cepera_ang
17.08.2021 18:56+1Попробуйте tailscale — тот же wireguard как транспорт + человеческий интерфейс вокруг.
Supervadim
18.08.2021 16:00Любопытный проект, спасибо! Но не внушает доверия, что выпуск ключей в третьих руках.
На скорую руку погуглив, нашел реализацию центрального сервера headscale. Не пробовали?
cepera_ang
18.08.2021 19:51Не пробовал, потому что и так приходится доверять всем направо и налево, а у tailscale как минимум клиент опенсорсный и приватная часть ключа локальные машины покидать не должна, такое бы сразу кто-нибудь заметил (наверное) :)
speller
17.08.2021 07:22Ещё очень понравилось, что есть клиенты подо всё. Лучший, как мне кажется - под планшеты. А мой телек теперь легко и непринужденно показывает нетфликс для другой страны в 4к. Главное - срастить конфиг для своего случая и потом клонировать для остальных своих устройств.
bankinobi
17.08.2021 08:19+2Теперь wireguard клиент не будет требовать админских прав при подключении?
yurybx
17.08.2021 08:50+1Подскажите, можно ли в WireGuard настроить жёсткую привязку клиентов к их индивидуальным IP-адресам? Насколько эта привязка надёжна? Может ли клиент обойти её и получить другой IP-адрес?
Belibak
17.08.2021 21:37+1Да, в конфиге сервера для каждого клиенского ключа задается ip, или диапазон. В клиентском конфиге он же. Сейчас попробовал менять адрес на клиенте, не пускает.
Maks_K2
17.08.2021 09:40У каждого клиента свой ключ для подключению к серверу
На сервере прописывается диапазон адресов от куда может подключится клиент
Ни что не мешает задать конкретный адресс
Arenoros
18.08.2021 11:04Может кто знает как на win машине создать два одновременных подключения к разным vpn серверам?
symbix
18.08.2021 16:22Судя по вот этому коммиту, в последней версии 0.4.5 никаких проблем с этим быть не должно.
SerpentFly
18.08.2021 22:51примерно $2000 за трёхлетний
Да, после того как Digicert перестал давать 50% скидку через портал hdev, действительно стало дороговато. Могли бы и сразу написать, что EV сертификат от Globalsign более чем в два раза дешевле обходится.
aborouhin
У меня в версии 0.4.5 галочка «Test experimental kernel driver» появилась прямо в GUI. По умолчанию снята, поставил, работает, по скорости в моём случае (VPN-сервер в Адстердаме) даёт прирост процентов на 5-10 (на чистоту эксперимента не претендую, на результат могли влиять и другие факторы и просто случайные отклонения, я всего лишь прогнал раз 10 подряд Speedtest с новой опцией и без неё).