Wintun userspace tunnel что это
WireGuard заработал в режиме ядра WindowsNT
Разработчик WireGuard VPN Джейсон Доненфельд выпустил новую версию WireGuardNT, которая работает в режиме ядра WindowsNT (7, 8.1, 10, 11, 2012, 2016, 2019, 2022). Перенос всего кода в ядро значительно повышает пропускную способность туннеля практически на любых соединениях, особенно по WiFi.
Сравнение производительности различных 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.
Вообще, это интересный пример того, как программист-любитель пишет более качественный код для ядра Windows, чем профессионалы из Microsoft. Интересно, сколько человек работает над функцией Always On VPN в Windows Server?
WireGuard Server на Windows
Подозреваю, что я не один такой, кто держит дома в режиме 24/7 маленький и тихий системный блок с Windows в качестве сервера, на который можно зайти по RDP (с того же смартфона) и несколько переживает в связи с количеством «неслучайных» попыток к нему подключиться. Задача не новая и вполне себе решаемая, например можно рассмотреть следующие варианты:
Не очень понятно, можно ли зайти со смартфона (для iPhone вероятно понадобится какой-то гибридный RDP клиент).
Поддерживается только TCP, а RDP уже довольно давно умеет использовать преимущества UDP.
Обновления Windows имеют необъяснимое свойство отключать OpenSSH, не знаю с чем это связано, но несколько за год раз такое было.
Настроить VPN непосредственно на маршрутизаторе. В целом, решение рабочее и минусы тут довольно субъективные:
Не хочется вешать на маршрутизатор дополнительную «необязательную» нагрузку.
Открывается дополнительный вектор атаки непосредственно на маршрутизатор.
Требует определенных технических навыков.
Дополнительно установить Raspberry Pi и на нем настроить VPN (можно ещё много чего на ней запустить). До сих пор пользуюсь, отличный вариант, если есть необходимые навыки и немного денег на «малинку».
Скорее для полноты картины, чем для реального домашнего использования, можно установить Hyper-V на нашу машинку с Windows, создать виртуальную машину с Linux и на нем настроить VPN. Как и в предыдущем случае:
Требует определенных технических навыков.
Могут возникнуть проблемы при отключении питания (виртуальная машина окажется в состоянии Saved и VPN будет недоступен).
Ну и наконец, можно установить сервер VPN непосредственно на Windows. Выбор конкретного VPN дело глубоко личное, но мне последние пару лет посчастливилось изрядно поработать с WireGuard и даже реализовать специализированного клиента для Wandera, в связи с этим выбор был очевиден.
Предварительные изыскания
Я думаю, это ни для кого не новость, что WireGuard уже больше года как включен в основную ветку ядра Linux. С Windows не все так радужно, однако в силу специфики протокола официальный WireGuard для Windows вполне себе выполняет функцию сервера, ему не хватает только NAT. Благодаря Henry Chang и его вдохновленному им micahmo примерно известно как сделать это стандартными средствами Windows. Честно говоря, процесс выглядит немного сложновато, хотя надо отдать должное micahmo, который его частично автоматизировал. Помимо этого, меня заинтересовал следующий комментарий под оригинальным постом:
I have a Win10 machine that I plan to use as a wireguard server. This machine has a main internet network adapter + OpenVPN client connection that is used for selected routes.
If I understand correctly described above wireguard VPN setup will only allow my wireguard clients to access main internet interface but not the OpenVPN connection, please correct me I’m wrong.
Is there a way for a wireguard client to use all available connections and honor existing routes configuration on wireguard server?
Думаю, что полный перевод не требуется, суть состоит в том, чтобы WireGuard использовал для выхода не какой-то один определенный интерфейс (это единственный вариант с Windows Internet Connection Sharing), а тот из них который определен согласно действующей таблице маршрутизации.
Итак, сформулируем задачу
Максимально упростить процесс установки и настройки WireGuard. Давление на компании предоставляющие услуги VPN нарастает и, согласитесь, было бы неплохо, если бы любой пользователь Windows мог бы:
Настроить WireGuard на сервере расположенном облаке, не погружаясь в особенности реализации. Я не призываю к обходу блокировок уважаемого Роскомнадзора, но это так же может быть необходимо, чтобы обойти географические ограничения на какие-то продукты или услуги. Например, до недавнего времени, Ghidra нельзя было скачать с российского IP адреса. Сайт и сейчас вас не пустит, но сам дизассемблер можно скачать с Github. Или цена (валюта расчетов) на авиабилеты может варьироваться в зависимости от страны, с IP которой Вы зашли на сайт авиакомпании. Или можем вспомнить недавнюю историю с «неофициально» ввезенными телевизорами Samsung, у которых «неожиданно» отключилась функция Smart TV. Вернуть телевизор к нормальной жизни можно было только подключив его через европейский VPN. И это только то, что я сходу смог вспомнить.
Установить WireGuard на домашнем Windows сервере и получить постоянный защищенный доступ в собственную сеть и пользоваться ВСЕМИ сервисами доступными ему дома независимо от того в какой точке мира он находится. Например, понравилась мне Яндекс Станция (это не реклама, я действительно их довольно много приобрел для себя, для семьи, в подарки друзьям), да так, что я даже одну привез на Тенерифе. И тут выяснилась удивительная подробность, Яндекс-музыка работает за границей, а вот КиноПоиск ссылается на географические ограничения и отказывается работать. Было бы обидно, но настроил WireGuard клиента на роутере Keenetic и подключил Яндекс станцию через домашний VPN в России. А еще не так уж давно я проделывал что-то подобное для Amazon Fire Stick, чтобы нормально пользоваться подпиской Prime. Могу ошибаться, но кажется где-то читал, что и сам WireGuard был изначально придуман, чтобы смотреть американский Netflix из Австралии.
Использовать некую альтернативу Internet Connection Sharing со всем уважением к имеющейся сетевой конфигурации.
WireSock Gateway
Основная работа выполняется сервисом Wiresock Service, который поддерживает два режима работы: NAT и Proxy.
Первый это классический NAT, сервис включает маршрутизацию (для некоторых типов соединений начиная с Windows 7 встроенная маршрутизация не работает, и они маршрутизируются «вручную»), определяет внешний интерфейс «по умолчанию» на котором и занимается подменой адресов во входящих/исходящих пакетах. Получает почти то же самое, что дает встроенный Internet Connection Sharing, но без ограничений на адреса клиентской сети.
Таким образом, основные задачи вроде бы выполнены. И если к проекту будет интерес, то ему есть куда развиваться, например:
На данный момент (v.1.0.2.4) отсутствует поддержка IPv6.
«Белые» IPv4 постепенно становятся редкостью, поэтому хотелось бы организовать работу WireGuard сервера за NAT (или даже multi-NAT) Интернет-провайдера. Здесь правда без внешнего сервиса (с «белым» IP) обойтись не удастся.
WireGuard — прекрасный VPN будущего?
Наступило время, когда VPN уже не является каким-то экзотическим инструментом бородатых сисадминов. Задачи у пользователей разные, но факт в том, что VPN стал нужен вообще всем.
Проблема текущих VPN решений в том, что их тяжело правильно настроить, дорого обслуживать, а так же в них полно legacy кода сомнительного качества.
Несколько лет назад канадский специалист по информационной безопасности Jason A. Donenfeld решил, что хватит это терпеть, и начал работу над WireGuard. Сейчас WireGuard готовится к включению в состав ядра Linux, он даже получил похвалы от Линуса Торвальдса и в американском сенате.
Заявленные преимущества WireGuard над другими VPN решениями:
Неужели найдена серебрянная пуля? OpenVPN и IPSec пора закапывать? Я решил с этим разобраться, а заодно сделал скрипт для автоматической установки личного VPN сервера.
Принципы работы
Принципы работы можно описать примерно так:
Вся основная логика WireGuard занимает менее 4 тысяч строк кода, тогда как OpenVPN и IPSec имеют сотни тысяч строк. Для поддержки современных криптоалгоритмов предлагается включить в состав ядра Linux новый криптографический API Zinc. В данный момент идет обсуждение, насколько это удачная идея.
Производительность
Максимальное преимущество в производительности (по сравнению с OpenVPN и IPSec) будет заметно на Linux системах, так как там WireGuard реализован в виде модуля ядра. Кроме этого поддерживаются macOS, Android, iOS, FreeBSD и OpenBSD, но в них WireGuard выполняется в userspace со всеми вытекающими последствиями для производительности. Поддержку Windows обещают добавить в ближайшем будущем.
Результаты бенчмарков с официального сайта:
Мой опыт использования
Я не эксперт по настройке VPN. Однажды настраивал OpenVPN ручками и это было очень муторно, а IPSec даже и не пытался. Слишком много решений нужно принимать, очень легко выстрелить себе в ногу. Поэтому я всегда пользовался готовыми скриптами для настройки сервера.
Так вот, WireGuard, с моей точки зрения, вообще идеален для пользователя. Все низкоуровневые решения приняты в спецификации, поэтому процесс подготовки типичной VPN инфраструктуры занимает всего несколько минут. Нафакапить в конфигурации практически невозможно.
Процесс установки детально описан на официальном сайте, отдельно хочется отметить отличную поддержку OpenWRT.
Генерируются ключи шифрования утилитой wg :
Далее, нужно создать серверный конфиг /etc/wireguard/wg0.conf со следующим содержанием:
и поднять туннель скриптом wg-quick :
На клиентской машине, создать конфиг /etc/wireguard/wg0.conf :
И точно так же поднять туннель:
Осталось настроить NAT на сервере, чтобы клиенты могли выходить в Интернет, и все готово!
Такую простоту использования и компактность кодовой базы удалось достичь за счет отказа от функционала дистрибьюции ключей. Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH ключи. Но в связи с этим возникает проблема: WireGuard будет не так просто внедрять в некоторых уже существующих сетях.
Из недостатков стоит отметить, что WireGuard не заработает через HTTP proxy, поскольку в качестве транспорта есть только протокол UDP. Возникает вопрос, возможно ли будет обфусцировать протокол? Конечно, это не прямая задача VPN, но для OpenVPN, например, существуют способы маскировки под HTTPS, что помогает жителям тоталитарных стран полноценно пользоваться Интернетом.
Выводы
Подводя итог, это очень интересный и перспективный проект, можно уже сейчас использовать его на личных серверах. Какой профит? Высокая производительность на Linux системах, простота настройки и поддержки, компактная и читабельная кодовая база. Однако, бросаться переводить комплексную инфраструктуру на WireGuard еще рано, стоит подождать включение в состав ядра Linux.
Для экономии своего (и вашего) времени я разработал автоматический установщик WireGuard. С его помощью можно поднять личный VPN для себя и своих знакомых даже ничего в этом не понимая.
OpenVPN 2.5.1 сервер на Windows
Вчера обнаружил, что на мой домашний сервер пытаются подобрать пароль к RDP. Спросил наших безопасников с работы, да, порт сканировали, но пароль подбирают не они. Надо что-то делать с этим, и я даже знаю что.
Ударим шифрованием по злобным брутфорсерам! Ставим OpenVPN 2.5.1 сервер на Windows Server 2016.
Установка OpenVPN Server
Скачиваем дистрибутив для установки OpenVPN:
Доступна версия OpenVPN 2.5.1. Скачиваю Windows 64-bit MSI installer, файл OpenVPN-2.5.1-I601-amd64.msi.
Запускаем инсталлятор OpenVPN.
Открывается мастер установки, предлагают выбрать тип установки, естественно, нажимаем Customize. Установка по умолчанию нас не устроит.
OpenVPN GUI отключаю. Мне нужно, чтобы OpenVPN на сервере работал автоматически.
А OpenVPN Service, наоборот, включаю. OpenVPN у меня будет работать как служба Windows.
Документацию и примеры конфигурации оставляю. Конфигурационные примеры будут использоваться в качестве шаблонов.
Начиная с версии OpenVPN 2.5 появилась поддержка драйвера WinTUN от разработчиков WireGuard. Говорят, что работает быстрее чем TAP-Windows6. Поэтому драйвер TAP-Windows6 отключаю и включаю Wintun.
ПРИМЕЧАНИЕ: для включения драйвера Wintun необходимо в файле конфигурации сервера включить параметр:
Утилиты OpenSSL EasyRSA 3 Certificate Management Scripts включаю. Install Now.
Начинается процесс установки OpenVPN.
Установка успешно завершена. Close.
Установка выполнена в директорию C:\Program Files\OpenVPN.
После установки у нас появляется новый сетевой адаптер Wintun Userspace Tunnel.
Создание ключей и сертификатов
Запускаем командную строку под администратором и переходим в рабочую директорию C:\Program Files\OpenVPN\easy-rsa.
В этой папке есть всё необходимое для генерации сертификатов.
Для работы в Windows нас интересует файл EasyRSA-Start.bat.
Запускается оболочка EasyRSA Shell.
Инициализируем новую конфигурацию:
Появляется новая директория C:\Program Files\OpenVPN\easy-rsa\pki.
Генерируем ключ и сертификат центра сертификации. Внимание, сейчас мы наступим на грабли, исправим ошибку и снова вернёмся к генерации файлов для центра сертификации.
Нас попросят для раза ввести пароль. Придумываем и вводим.
Failed create CA private key
Исправим этот баг. Мне не совсем понятно, почему нельзя было всё сделать сразу по-человечески, чтобы люди не встречали эту ошибку. Копируем файл C:\Program Files\OpenVPN\easy-rsa\vars.example, называем копию C:\Program Files\OpenVPN\easy-rsa\vars.
Редактируем C:\Program Files\OpenVPN\easy-rsa\vars. В данном файле можно много чего прописать, но я не буду на этом сейчас останавливаться подробно. Находим строку:
Собственно, ошибка и заключалась в том, что оболочка по какой-то причине не могла создать временный файл.
Генерируем ключ и сертификат центра сертификации:
Нас попросят для раза ввести пароль. Придумываем и вводим. После нас просят указать Common Name для центра сертификации, указываю «internet-lab.ru».
Операция проходит успешно.
Создаётся сертификат центра сертификации:
Сертификат создаётся на 10 лет, это значение можно переопределить в файле vars.
И ключ центра сертификации:
Ключ секретный, никому не показываем. он будет храниться на сервере.
Генерируем ключ и запрос на сертификат сервера, назовём сервер именем «server«:
Нас просят указать Common Name для сервера, указываю «internet-lab.ru».
Операция проходит успешно.
Создаётся запрос на сертификат сервера:
Ключ секретный, никому не показываем. он будет храниться на сервере.
Для создания сертификата сервера нужно подписать запрос на сертификат:
Для подписи нужно ввести слово «yes» и указать пароль от центра сертификации.
Создаётся сертификат сервера:
Сертификат сервера создаётся на 825 дней, это значение можно переопределить в файле vars.
Теперь создадим клиентский сертификат. По хорошему клиентский ключ следует запаролить, чтобы исключить утечку при передаче. Для этого есть несколько способов.
Первый
На клиентской машине генерируем запрос на сертификат клиента и ключ без пароля:
Второй
а машине с CA генерируем сертификат клиента и ключ с паролем:
Третий
Но поскольку я генерирую ключ сам для себя, то воспользуюсь небезопасным третьим способом.
Генерируем ключ и запрос на сертификат клиента, назовём клиента именем «client«:
Нас просят указать Common Name для клиента, указываю «v.pupkin».
Операция проходит успешно.
Создаётся запрос на сертификат клиента:
Для создания сертификата клиента нужно подписать запрос на сертификат:
Для подписи нужно ввести слово «yes» и указать пароль от центра сертификации.
Создаётся сертификат клиента:
Сертификат сервера создаётся на 825 дней, это значение можно переопределить в файле vars.
Генерируем ключ Диффи-Хеллмана:
Операция займёт некоторое время.
Я на сервере собираюсь использовать tls-auth для дополнительной проверки целостности, это обеспечит дополнительный уровень безопасности протокола SSL/TLS при создании соединения:
При использовании tls-auth на клиенте не понадобится ключ Диффи-Хеллмана, но пусть будет. Генерируем ключ tls-auth. Для этого запускаем командную строку под администратором и выполняем:
В папке C:\Program Files\OpenVPN\bin создаётся файл ta.key.
Переносим его в папку C:\Program Files\OpenVPN\easy-rsa\pki.
Минимальный набор сертификатов сгенерирован.
Настройка OpenVPN сервера
Создадим конфигурационный файл сервера C:\Program Files\OpenVPN\config-auto\server.ovpn:
Открываем блокнотом и редактируем:
Лучше изучить конфигурационный файл, я предлагаю свой вариант конфига:
У меня здесь указаны пути к ключам и сертификатам, используется порт TCP 1194. Параметр duplicate-cn позволяет подключаться всем клиентам по одному общему сертификату, но это небезопасно и не рекомендуется. Используйте только в тестовых целях. Я использую для того, чтобы с помощью одного и того же сертификата подключиться к OpenVPN серверу и с клиентской машины и со смартфона. Параметр windows-driver wintun подключает использование драйвера WinTun. И что им стоило этот параметр указать в примере конфигурации? Остальное по умолчанию.
ВНИМАНИЕ: в конфигурационных файлах допускается в путях использование прямого слеша:
ca «C:/Program Files/OpenVPN/easy-rsa/pki/ca.crt»
или двойного обратного слеша:
ca «C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt»
Запуск OpenVPN сервера
Переходим к службам:
Находим службу OpenVPNService.
Настраиваем на автоматический запуск при загрузке сервера.
Запускаем (перезапускаем) службу.
Согласно настройкам сервера в папке C:\Program Files\OpenVPN\log должны появиться логи. Это один из инструментов администратора OpenVPN сервера.
Активировался сетевой адаптер OpenVPN Wintun.
Согласно настройкам сервера IP адрес 10.8.0.1.
Проверяем поднялся ли порт tcp 1194:
Порт должен прослушиваться.
Настройка firewall
Теперь нужно настроить firewall. Открываем Windows Defender Firewall with Advanced Security.
Переходим в Inbound Rules.
Создаём правило — New Rule.
Тип правила — Port. Next.
Протоколы и порты — TCP 1194. Как в настройках сервера. Next.
Действия — Allow the connection. Next.
Для всех сетей. Next.
Указываем название правила — OpenVPN. Next.
Правило создано, теперь firewall не блокирует входящие TCP соединения на 1194 порту.
Настройка OpenVPN клиента на ПК Windows
На компьютере клиента устанавливаем OpenVPN Connect.
Я скачиваю версию для Windows.
Принимаем лицензионное соглашение. Next.
OpenVPN Connect устанавливается.
Установка завершена. Finish.
На рабочем столе появляется иконка OpenVPN Connect.
На сервере файл примера конфигурации client.ovpn копируем как internet-lab.ru.ovpn.
Здесь нужно указать протокол, порт адрес сервера и прочие параметры. Пути к ключам и сертификатам относительные.
Создаём директорию, например, C:\openvpn. Копируем в неё с сервера файлы:
Запускаем OpenVPN Connect.
Agree. Переключаемся на File.
Перетаскиваем мышкой в окно файл C:\openvpn\internet-lab.ru.ovpn, или указываем через кнопку Browse.
Ставим галку «Connect after import».
Соединение с OpenVPN сервером установлено.
В логах сервера видим, что соединился юзер v.pupkin.
Настройка OpenVPN клиента на смартфоне Android
Копируем на телефон все те же файлы, что и для клиента.