Разработчик 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.

Комментарии (31)


  1. aborouhin
    17.08.2021 02:07

    У меня в версии 0.4.5 галочка «Test experimental kernel driver» появилась прямо в GUI. По умолчанию снята, поставил, работает, по скорости в моём случае (VPN-сервер в Адстердаме) даёт прирост процентов на 5-10 (на чистоту эксперимента не претендую, на результат могли влиять и другие факторы и просто случайные отклонения, я всего лишь прогнал раз 10 подряд Speedtest с новой опцией и без неё).


  1. Iv38
    17.08.2021 02:38
    +2

    Очень даже хорошая новость.

    А если у тебя есть такой добрый отзыв от беспощадного Линуса к пулл-реквесту в ядро, то резюме, в общем-то, можно уже и не писать. Хед-хантеры и так удавят друг-друга.


    1. mrbaranovskyi
      17.08.2021 08:58
      +1

      хех... я из-за него начал смотреть на Rust... Если уж этот "м*дак" (может так не показаться, но это в положительном ключе) это одобрил, то видимо на это есть причины.


  1. symbix
    17.08.2021 03:01
    +11

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

    Я бы не стал называть Джейсона любителем. Он и до создания wireguard был уже известным специалистом, с OSS проектами и собственным микробизнесом в области безопасности. И уж точно его квалификация на порядок выше среднего индуса на окладе в MIcrosoft.


  1. mwizard
    17.08.2021 03:19
    +6

    Стало неприятным открытием, что теперь в Windows, точно так же, как и в macOS, невозможно загрузить самоподписанный драйвер, даже добавив свой собственный CA. 2000 долларов за возможность запустить свой собственный код на своей собственной машине, как замечательно...


    1. RaymanOne
      17.08.2021 06:55
      +2

      А пробовали перевести Windows в режим TESTSIGNING?


      1. mwizard
        17.08.2021 11:05
        +1

        Не соглашусь, это не то же самое.

        TESTSIGNING, как и отключение SIP в macOS, позволяет запускать любые драйвера, в том числе подписанные левыми сертификатами каких-нибудь абстрактных вирусописателей.

        Это не то же самое, что и запускать драйвера, подписанные моим сертификатом. Я не хочу отказываться от механизмов безопасности ОС — пусть они служат на благо, но меня удручает то, что мое мнение не принимается во внимание. Я должен либо платить, либо согласиться с тем, что будет запущен произвольный код, независимо от его подписи.


        1. RaymanOne
          17.08.2021 11:53
          +5

          Изначально писали что невозможно загрузить без денег. А невозможно только в пользовательском режиме. А как отделить ваш сертификат от не вашего? А если он подделан? Как в MacOS с этим делом?


          1. mwizard
            09.09.2021 20:17

            В macOS невозможно без денег и договора с Apple (чтобы получить особый entitlement в сертификат подписи), безотносительно режима. Чтобы отличить мой сертификат от не моего, достаточно проследить его цепочку подписей - если она заканчивается на моем CA, то это мой сертификат. Если не заканчивается, или имеются нарушения подписей посредии, то это не мой сертификат.

            Мой CA я согласен добавить через csrutil из безопасного режима, как это происходит для отключения SIP. Вот только Apple не согласна. Раньше можно было добавить CA в системное хранилище ключей и использовать его для верификации подписи драйвера, больше нельзя.

            Насчет того, что сертификат может быть подделан - как можно подделать сертификат?


            1. RaymanOne
              10.09.2021 15:44

              В macOS невозможно без денег и договора с Apple, безотносительно режима.

              Получается на Windows ситуация лучше?

              Насчет того, что сертификат может быть подделан - как можно подделать сертификат?

              Тут нет компетенции к сожалению, мало ли что поддается взлому...


              1. mwizard
                11.09.2021 16:39

                Получается на Windows ситуация лучше?

                Так ведь и на Windows ситуация точно такая же -- без денег никак. Хочешь свой драйвер -- нельзя, можно только вовсе отключить все проверки и сидеть с голой задницей, что в macOS (`csrutil enable --without kext`), что в Windows (TESTSIGNING). В результате может быть загружен совершенно любой драйвер совершенно любой малвари, а не тот, который утвержден моей криптографической подписью.

                Тут нет компетенции к сожалению, мало ли что поддается взлому...

                Для того, чтобы взломать типичный корневой сертификат с RSA-ключом в 4096 бит, не хватит времени жизни Вселенной. Если Вы считаете, что сертификаты легко подделываются, значит, можно подделать корневой сертификат Apple или Microsoft и подписывать произвольный код и так.


            1. K10
              22.09.2021 04:59

              Мой CA я согласен добавить через csrutil из безопасного режима

              Если можете добавить вы, то может добавить и малварь.


              1. mwizard
                28.09.2021 12:15
                +1

                Не сможет, для этого нужно иметь физический доступ, т.к. использование csrutil подразумевает перезагрузку в recovery mode, которая отличается от обычного другими флагами в nvram. Если малварь может перезагрузиться в recovery, то эта малварь - я.


        1. atd
          17.08.2021 15:32
          +2

          Можно включить testsigning, впихнуть свой драйвер, потом выключить. Другие левые дрова больше не пролезут, а ваш продолжит работать.


          1. qw1
            20.08.2021 11:30

            Для переключения TestSigning требуется перезагрузка, насколько я знаю.


          1. mwizard
            09.09.2021 20:11

            Не продолжит, самоподписанный/неподписанный драйвер отправится на мороз после перезагрузки.


  1. speller
    17.08.2021 07:17

    Пробовал эту штуку. Очень понравилось. Реально быстро и просто. Но порог вхождения выше простого юзера, поскольку требует начальной настройки, которая может оказаться нетривиальной. Оно реально просто, когда знаешь. А когда не знаешь - можно убить несколько дней на Гугл. Особенно, если клиент или сервер за натом. Документация по настройке на сайте wireguard очень скудная. Спасают только бложики и stackoverflow. И даже если вроде начало работать и пошли пинги, то легко можно тут же упороться в MTU.


    1. remzalp
      17.08.2021 08:06
      +1

      У меня скорее была проблема - "вот эти две команды запустить и пять строчек в конфиг добавить - И ВСЁ????", в итоге долго и старательно пытался понять что еще донастроить нужно.


      1. speller
        17.08.2021 09:02

        Да, такая же хрень. По описанию всё просто, а когда оно не работает, то фиг пойми, почему.


      1. cepera_ang
        17.08.2021 18:56
        +1

        Попробуйте tailscale — тот же wireguard как транспорт + человеческий интерфейс вокруг.


        1. Supervadim
          18.08.2021 16:00

          Любопытный проект, спасибо! Но не внушает доверия, что выпуск ключей в третьих руках.

          На скорую руку погуглив, нашел реализацию центрального сервера headscale. Не пробовали?


          1. cepera_ang
            18.08.2021 19:51

            Не пробовал, потому что и так приходится доверять всем направо и налево, а у tailscale как минимум клиент опенсорсный и приватная часть ключа локальные машины покидать не должна, такое бы сразу кто-нибудь заметил (наверное) :)


  1. speller
    17.08.2021 07:22

    Ещё очень понравилось, что есть клиенты подо всё. Лучший, как мне кажется - под планшеты. А мой телек теперь легко и непринужденно показывает нетфликс для другой страны в 4к. Главное - срастить конфиг для своего случая и потом клонировать для остальных своих устройств.


  1. bankinobi
    17.08.2021 08:19
    +2

    Теперь wireguard клиент не будет требовать админских прав при подключении?


    1. lunacyrcus
      18.08.2021 01:32
      +3

      Теперь он их будет сам раздавать (шуточка)


  1. yurybx
    17.08.2021 08:50
    +1

    Подскажите, можно ли в WireGuard настроить жёсткую привязку клиентов к их индивидуальным IP-адресам? Насколько эта привязка надёжна? Может ли клиент обойти её и получить другой IP-адрес?


    1. Belibak
      17.08.2021 21:37
      +1

      Да, в конфиге сервера для каждого клиенского ключа задается ip, или диапазон. В клиентском конфиге он же. Сейчас попробовал менять адрес на клиенте, не пускает.


  1. Maks_K2
    17.08.2021 09:40

    У каждого клиента свой ключ для подключению к серверу
    На сервере прописывается диапазон адресов от куда может подключится клиент
    Ни что не мешает задать конкретный адресс


  1. Arenoros
    18.08.2021 11:04

    Может кто знает как на win машине создать два одновременных подключения к разным vpn серверам?


    1. symbix
      18.08.2021 16:22

      Судя по вот этому коммиту, в последней версии 0.4.5 никаких проблем с этим быть не должно.


  1. SerpentFly
    18.08.2021 22:51

    примерно $2000 за трёхлетний

    Да, после того как Digicert перестал давать 50% скидку через портал hdev, действительно стало дороговато. Могли бы и сразу написать, что EV сертификат от Globalsign более чем в два раза дешевле обходится. ​