В ядро Linux 5.6 включили VPN WireGuard

    Сегодня Линус перенёс к себе ветку net-next с VPN-интерфейсами WireGuard. Об этом событии сообщили в списке рассылки WireGuard.



    В данный момент продолжается сбор кода для нового ядра Linux 5.6. WireGuard — быстрый VPN нового поколения, в котором реализована современная криптография. Он изначально разрабатывался как более простая и удобная альтернатива существующим VPN. Автор — канадский специалист по информационной безопасности Джейсон Доненфилд (Jason A. Donenfeld). В августе 2018 года WireGuard удостоился похвалы от Линуса Торвальдса. Примерно в то время началась работа по включению VPN в ядро Linux. Процесс немного затянулся.

    «Вижу, что Джейсон сделал пул-реквест для включения WireGuard в ядро, — писал Линус 2 августа 2018 года. — Могу я просто ещё раз заявить о своей любви к этому VPN и надеяться на скорое слияние? Может, код и не идеален, но я просмотрел его, и по сравнению с ужасами OpenVPN и IPSec, это настоящее произведение искусства».

    Несмотря на пожелание Линуса, слияние затянулось на полтора года. Основная проблема оказалась в привязке к собственным реализациям криптографических функций, которые применялись для повышения производительности. После длительных переговоров в сентябре 2019 года было принято компромиссное решение перевести патчи на имеющиеся в ядре функции Crypto API, к которым у разработчиков WireGuard есть претензии в области производительности и общей безопасности. Но решили нативные криптофункции WireGuard выделить в отдельный низкоуровневые Zinc API и со временем портировать их в ядро. В ноябре разработчики ядра сдержали обещание и согласились перенести в основное ядро часть кода из Zinc. Например, в Crypto API включены подготовленные в WireGuard быстрые реализации алгоритмов ChaCha20 и Poly1305.

    В конце концов, 9 декабря 2019 года Дэвид Миллер (David S. Miller), отвечающий за сетевую подсистему ядра Linux, принял в состав ветки net-next патчи с реализацией VPN-интерфейса от проекта WireGuard.

    А сегодня 29 января 2020 года изменения ушли к Линусу для включения в ядро.



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

    • Простой в использовании.
    • Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.д.
    • Компактный читаемый код, проще исследовать на уязвимости.
    • Высокая производительность.
    • Чёткая и проработанная спецификация.

    Вся основная логика WireGuard занимает менее 4000 строк кода, тогда как OpenVPN и IPSec это сотни тысяч строк.

    «В WireGuard применяется концепция маршрутизации по ключам шифрования, которая подразумевает привязку к каждому сетевому интерфейсу закрытого ключа и применение для связывания открытых ключей. Обмен открытыми ключами для установки соединения производится по аналогии с SSH. Для согласования ключей и соединения без запуска отдельного демона в пространстве пользователя применяется механизм Noise_IK из Noise Protocol Framework, похожий на поддержание authorized_keys в SSH. Передача данных осуществляется через инкапсуляцию в пакеты UDP. Поддерживается смена IP-адреса VPN-сервера (роуминг) без разрыва соединения с автоматической перенастройкой клиента, — пишет Opennet.

    Для шифрования используется потоковый шифр ChaCha20 и алгоритм аутентификации сообщений (MAC) Poly1305, разработанные Дэниелом Бернштейном (Daniel J. Bernstein), Таней Ланге (Tanja Lange) и Питером Швабе (Peter Schwabe). ChaCha20 и Poly1305 позиционируются как более быстрые и безопасные аналоги AES-256-CTR и HMAC, программная реализация которых позволяет добиться фиксированного времени выполнения без задействования специальной аппаратной поддержки. Для генерации совместного секретного ключа применяется протокол Диффи-Хеллмана на эллиптических кривых в реализации Curve25519, также предложенной Дэниелом Бернштейном. Для хеширования используются алгоритм BLAKE2s (RFC7693)».

    Результаты тестов производительности с официального сайта:

    Пропускная способность (мегабит/с)


    Пинг (мс)


    Тестовая конфигурация:


    • Intel Core i7-3820QM и Intel Core i7-5200U
    • Гигабитные карты Intel 82579LM и Intel I218LM
    • Linux 4.6.1
    • Конфигурация WireGuard: 256-битный ChaCha20 с Poly1305 для MAC
    • Первая конфигурация IPsec: 256-битный ChaCha20 с Poly1305 для MAC
    • Вторая конфигурация IPsec: AES-256-GCM-128 (с AES-NI)
    • Конфигурация OpenVPN: эквивалентный шифронабор 256-битного AES с HMAC-SHA2-256, режим UDP
    • Производительность замерялась с помощью iperf3, показан средний результат за 30 минут.

    Теоретически, после интеграции в сетевой стек WireGuard должен работать ещё быстрее. Но в реальности это не обязательно будет так из-за перехода на встроенные в ядро криптографические функции Crypto API. Возможно, не все из них ещё оптимизированы до уровня быстродействия нативного WireGuard.

    «С моей точки зрения, WireGuard вообще идеален для пользователя. Все низкоуровневые решения приняты в спецификации, поэтому процесс подготовки типичной VPN инфраструктуры занимает всего несколько минут. Напутать в конфигурации практически невозможно, — писали на Хабре в 2018 году. — Процесс установки детально описан на официальном сайте, отдельно хочется отметить отличную поддержку OpenWRT. Такой простоты использования и компактности кодовой базы удалось достичь за счёт отказа от дистрибьюции ключей. Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH-ключи».

    Проект WireGuard развивается с 2015 года, он прошёл аудит и формальную верификацию. Поддержка WireGuard интегрирована в NetworkManager и systemd, а патчи для ядра входят в базовый состав дистрибутивов Debian Unstable, Mageia, Alpine, Arch, Gentoo, OpenWrt, NixOS, Subgraph и ALT.
    Дата-центр «Миран»
    Решения для аренды и размещения ИТ-инфраструктуры

    Comments 48

      +10
      Мои поздравления всем. Я долго ждал сегодняшнего дня!
      Использую с недавнего времени. Скорость впечатляет. Но теперь WireGuard в ядре. Это прекрасно
        0
        Скорость действительно наилучшая!
        0
        Да, действительно WireGuard по сравнению OpenVPN и IPSec очень лёгок в настройке. При этом не надо ничем жертвовать (скорость или безопасность). Вроде действительно одни плюсы :)
          +1
          Зависит от области применения. Если все, что вам нужно — это шифрованный туннель, то Wireguard будет неплохим выходом (хотя примерно того же можно достичь и используя ip xfrm). Но у него есть и ряд минусов — например, отсутствие какой-либо PKI или динамического выделения адресов и т.п. А вообще проект хороший, да.
            0
            Но у него есть и ряд минусов — например, отсутствие какой-либо PKI или динамического выделения адресов и т.п.
            Встраивать протокол в другие приложения никто не запрещал, так же как и выносить в них аутентификацию с установлением сессии.
              0
              Встраивать протокол в другие приложения никто не запрещал так же как и выносить в них аутентификацию с установлением сессии.


              Мы все же говорим не о протоколе, а о конкретной реализации. Если так рассуждать, то никто не запрещает и тот же протокол OpenVPN на уровне ядра реализовать.
                0

                Запрещает Линус. И в тексте даже написано, почему.

                  0
                  Что запрещает? dkms?)
                    0

                    «… Могу я просто ещё раз заявить о своей любви к этому VPN и надеяться на скорое слияние? Может, код и не идеален, но я просмотрел его, и по сравнению с ужасами OpenVPN и IPSec, это настоящее произведение искусства».

                      0
                      Вы же, надеюсь, понимаете, что для того, чтобы что-то реализовать на уровне ядра, совершенно необязательно включать его в само ядро. Можно реализовать его в виде модуля dkms. К тому же пример с OpenVPN я привел просто в качестве аналогии.
                        0

                        «Please note that if you make changes to your kernel, you may no longer get support or help from the CentOS development team.» — на сайте CentOS. Подключение модулей dkms воспринимается как произвольная модификация ядра. Я к тому, что эндорсмент от Линуса важен.

                          0
                          Важен, кто ж спорит. Но даже если что-то официально включено в ядро, то не факт, что разработчики дистрибутива включат эту опцию при сборке ядра. А самостоятельная пересборка ведет к тем же последствиям, что и установка dkms-модулей. Да и не факт, что Линус не согласится — IPSec-то хоть и ужасен, но давным-давно пролез в ядро)
          +2
          прошёл аудит и формальную верификацию

          как понимаю формально верифицирован протокол и некоторые используемые библиотеки, но не реализация.
            +1
            В рамках аварийного тестирования приходилось использовать реализацию WireGuard на vyOS для объединения 2 площадок между собой.
            За сутки получилось около 700Гб трафика, какой-то просадки latency по сравнению с L2 тоже не заметил. В целом все довольно неплохо) Дождаться бы реализации wireGuard под RouterOS…
              +3

              Внукам завещаем

              +1
              Но ведь WireGuard это ближе к туннелю, чем к VPN. Что в принципе обходится, но всё-таки немного другая концепция. С IPSec его сравнивать можно, но OpenVPN гораздо развесистее.
              Ну и про удобство для пользователей так себе идея. Логины с паролями — это понятно, а длинющий ключ вводить — то ещё заняте.
                +1

                Ключ нужен только один раз, так как он сохраняется в клиентском приложении. Кроме перепечатывания вручную его можно передать через QR-код, скачиванием файлика .conf или Control+C Control+V.

                  +1
                  Поддержу мнение.
                  Для предоставления корпоративных доступов коллегам вне офиса wireguard мне не помощник.
                  Надеюсь, что это только пока.
                    0
                    Для предоставления корпоративных доступов коллегам вне офиса wireguard мне не помощник.

                    Я правильно понимаю, что дело в необходимости передачи публичных ключей? Или есть и другие причины?

                      +2
                      Если с передачей ключей вопрос как-либо решаемый, то с передачей маршрутов как-то странно.
                      Исходя из конфигов, я не могу клиенту сообщить доступные сети за шлюзом, но сам клиент определяет какие сети он будет использовать через предоставляемый шлюз.
                      А у меня для некоторых по три десятка строчек маршрутов.
                      Это единственный пункт, который мне не позволяет заменить openvpn.

                      Если я ошибаюсь в своих выводах, буду благодарен за ликбез.
                        0
                        На клиенте AllowedIPs = 0.0.0.0/0. Маршрут по умолчанию через тоннель, создаваемый при этой настройке, прибиваем. Нужные маршруты получаем отдельно по BGP, OSPF и т.п.
                        Насколько это реально/удобно деплоить в Вашем случае — смотрите сами. Скорее всего, не очень удобно :)
                          0
                          Скорее всего, не очень удобно

                          В точку. И даже более — это просто невозможно.
                            0
                            Ну если проблема в отсутствии на клиентах поддержки какого-либо протокола динамической маршрутизации — то можно заменить костылём. wg-quick под Linux или Tunsafe под Windows (но не родной виндовый клиент WG почему-то) позволяют дёргать скрипт до/после поднятия интерфейса WG. На Android родное приложение тоже работает через wg-quick, так что тоже должно взлететь.
                            А этот скрипт может, скажем, скачивать с сервера актуальный список маршрутов и добавлять их в систему. Не очень изящное решение, но рабочее.
                              0
                              Спасибо за указание направления куда думать. Проанализирую.
                  0

                  Могу ли я использовать WireGuard для доступа к ресурсам удаленной локальной сети? Другими словами, подключаясь со своего домашнего ноута к серверу WireGuard, буду ли я иметь доступ к ресурсам из локальной сети сервера?
                  И существует ли возможность настроить это все дело таким образом, чтобы заворачивать трафик в тунель только при запрашивании определнных ресурсов (если кто-то знаком с проектом zaborona.help, там такая маршрутизация реализована средствами OpenVPN). Весь трафик по-умолчанию идет напрямую, но если хост находится в опреденном списке, то тогда трафик идет через тунель, такая маршрутизация возможна?

                    0
                    1. NAT на сервере и маршруты на обеих сторонах
                    2. Портянка адресов в параметре AllowedIPs конфига и в маршрутах на клиенте

                      0
                      А можно по подробнее?

                      У меня есть Raspberry Pi и VPS с WireGuard. И хотя с установкой WG ещё разбираюсь, хотелось бы подключаться к своей малинке. Подскажите пожалуйста что мне на VPN WG и Малинке прописывать надо, какие именно файлы менять?
                        0
                        Вам видимо для проброса локалки.
                        Берёте любой гайд из интернета для поднятия VPN-сервера. Правила NAT там уже есть, а на клиенте вместо default в добавляемом после подключения маршруте пишете LAN-подсеть сервера, опционально можно эту же подсеть прописать в клиентском конфиге в AllowedIPs.
                          0
                          И это мне позволит к Raspberry Pi по SSH с интернета подключаться?
                    0
                    А у меня на Nokia 8 почему-то не захотел работать. Не появляется в списке впн и не работает. Может кто сталкивался?
                      0

                      И это прекрасно.

                        0
                        теперь осталось дождаться его в android, а там глядишь через пару лет и микротик подтянется…
                      • UFO just landed and posted this here
                          0
                          А Ipsec, OpenVPN и другие не детектируются?
                          • UFO just landed and posted this here
                            • UFO just landed and posted this here
                                +1
                                спасибо
                            0
                            Всем доброго времени суток! Пользуюсь долгое время OpenVPN для соединения домашней сети с телефоном и компами вне домашней сети. Есть ли смысл переходить на WireGuard для повышения скорости и уменьшения пинга? Нет ли других подводных камней, помимо детектирования DPIем? Я не айтишник, если что. Заранее спасибо за ответы.
                              +1
                              Смотря по каким причинам Вас не устраивает скорость и пинг сейчас. Выше возможностей канала между двумя концами тоннеля никто не прыгнет, и в WireGuard магии тоже никакой нет.

                              По моим наблюдениям, WireGuard сильно выигрывает у OpenVPN при большой latency (длинных пингах) между сторонами тоннеля — скорость просаживается гораздо меньше. Для популярного сценария «обход блокировок», когда VPN-сервер за границей, это важно. Для доступа к своей локальной сети из своего же региона — вряд ли.
                              Если у Вас просадки из-за проблем с производительностью какой-то маломощной железки (домашнего роутера, например) — протестируйте, в зависимости от того, как WireGuard для неё реализован, переход на него может как помочь, так и нет.
                              Точно в любых случаях соединение устанавливается гораздо быстрее, чем с OpenVPN.

                              Из недостатков ещё ограниченные возможности авторизации и маршрутизации. Про это выше в комментах писали. Если для Вас не проблема при любом изменении руками править конфиги всех клиентов — это не должно быть сильной проблемой.

                              В любом случае, поставить и настроить WireGuard для теста — дело простое и быстрое. Попробуйте конкретно в Ваших условиях, сами и поймёте, есть ли выигрыш.
                                0
                                Wireguard ещё сильно выигрывает у OpenVPN по поеданию CPU, а соответственно и батареи на мобильных девайсах. Также есть приятный бонус в виде сохранения сессии при смене IP адреса у клиента.
                              0
                              Ребят, подскажите пожалуйста, а как можно WireGuard подключить к сетям I2P и TOR? Был у меня знакомый, на пару минут продемонстрировал свой WireGuard сервер и я прям со своего браузера мог I2P и TOR сайты открыть.

                              Ещё испытываю трудности с установкой WireGuard на свой сервер, помогите мне пожалуйста с установкой в ЛС.
                                +1
                                Ребят, подскажите пожалуйста, а как можно WireGuard подключить к сетям I2P и TOR? Был у меня знакомый, на пару минут продемонстрировал свой WireGuard сервер и я прям со своего браузера мог I2P и TOR сайты открыть.


                                Точно так же, как и при использовании любого другого VPN-решения, принципиальной разницы здесь нет. Заворачиваешь нужный трафик с помощью iptables REDIRECT на какой-нибудь privoxy, который *.onion отправляет на tor, а *.i2p — на i2p соответственно. Суть примерно такая.

                                Но я бы крайне не советовал так поступать — такая схема открывает широкие возможности для вашей деанонимизации.
                                  0
                                  То есть все манипуляции надо только в iptables проводить, другие файлы трогать не нужно?
                                    0
                                    Конфиг privoxy нужно. Ну и нужен DNS, который будет резолвить onion и i2p зоны в какой-нибудь виртуальный ip-адрес, который потом будет использоваться в правилах iptables.
                                      0
                                      Спасибо, на будущее учтём.
                                    0
                                    широкие возможности для вашей деанонимизации.

                                    а можно подробнее? как вариант, ключевые слова для поиска.

                                Only users with full accounts can post comments. Log in, please.