Wintun driver windows 7 x64

Wintun Network Adapter

TUN Device Driver for Windows

This is a layer 3 TUN driver for Windows 7, 8, 8.1, 10, and 11. Originally created for WireGuard, it is intended to be useful to a wide variety of projects that require layer 3 tunneling devices with implementations primarily in userspace.

Installation

Wintun is deployed as a platform-specific wintun.dll file. Install the wintun.dll file side-by-side with your application. Download the dll from wintun.net, alongside the header file for your application described below.

Usage

Include the wintun.h file in your project simply by copying it there and dynamically load the wintun.dll using LoadLibraryEx() and GetProcAddress() to resolve each function, using the typedefs provided in the header file. The InitializeWintun function in the example.c code provides this in a function that you can simply copy and paste.

With the library setup, Wintun can then be used by first creating an adapter, configuring it, and then setting its status to «up». Adapters have names (e.g. «OfficeNet») and types (e.g. «Wintun»).

WINTUN_ADAPTER_HANDLE Adapter1 = WintunCreateAdapter(L"OfficeNet", L"Wintun", &SomeFixedGUID1);
WINTUN_ADAPTER_HANDLE Adapter2 = WintunCreateAdapter(L"HomeNet", L"Wintun", &SomeFixedGUID2);
WINTUN_ADAPTER_HANDLE Adapter3 = WintunCreateAdapter(L"Data Center", L"Wintun", &SomeFixedGUID3);

After creating an adapter, we can use it by starting a session:

WINTUN_SESSION_HANDLE Session = WintunStartSession(Adapter2, 0x400000);

Then, the WintunAllocateSendPacket and WintunSendPacket functions can be used for sending packets (used by SendPackets in the example.c code):

BYTE *OutgoingPacket = WintunAllocateSendPacket(Session, PacketDataSize);
if (OutgoingPacket)
{
    memcpy(OutgoingPacket, PacketData, PacketDataSize);
    WintunSendPacket(Session, OutgoingPacket);
}
else if (GetLastError() != ERROR_BUFFER_OVERFLOW) // Silently drop packets if the ring is full
    Log(L"Packet write failed");

And the WintunReceivePacket and WintunReleaseReceivePacket functions can be used for receiving packets (used by ReceivePackets in the example.c code):

for (;;)
{
    DWORD IncomingPacketSize;
    BYTE *IncomingPacket = WintunReceivePacket(Session, &IncomingPacketSize);
    if (IncomingPacket)
    {
        DoSomethingWithPacket(IncomingPacket, IncomingPacketSize);
        WintunReleaseReceivePacket(Session, IncomingPacket);
    }
    else if (GetLastError() == ERROR_NO_MORE_ITEMS)
        WaitForSingleObject(WintunGetReadWaitEvent(Session), INFINITE);
    else
    {
        Log(L"Packet read failed");
        break;
    }
}

Some high performance use cases may want to spin on WintunReceivePackets for a number of cycles before falling back to waiting on the read-wait event.

You are highly encouraged to read the example.c short example to see how to put together a simple userspace network tunnel.

The various functions and definitions are documented in the reference below.

Reference

Macro Definitions

WINTUN_MAX_POOL

#define WINTUN_MAX_POOL 256

Maximum pool name length including zero terminator

WINTUN_MIN_RING_CAPACITY

#define WINTUN_MIN_RING_CAPACITY 0x20000 /* 128kiB */

Minimum ring capacity.

WINTUN_MAX_RING_CAPACITY

#define WINTUN_MAX_RING_CAPACITY 0x4000000 /* 64MiB */

Maximum ring capacity.

WINTUN_MAX_IP_PACKET_SIZE

#define WINTUN_MAX_IP_PACKET_SIZE 0xFFFF

Maximum IP packet size

Typedefs

WINTUN_ADAPTER_HANDLE

typedef void* WINTUN_ADAPTER_HANDLE

A handle representing Wintun adapter

WINTUN_ENUM_CALLBACK

typedef BOOL(* WINTUN_ENUM_CALLBACK) (WINTUN_ADAPTER_HANDLE Adapter, LPARAM Param)

Called by WintunEnumAdapters for each adapter in the pool.

Parameters

  • Adapter: Adapter handle, which will be freed when this function returns.
  • Param: An application-defined value passed to the WintunEnumAdapters.

Returns

Non-zero to continue iterating adapters; zero to stop.

WINTUN_LOGGER_CALLBACK

typedef void(* WINTUN_LOGGER_CALLBACK) (WINTUN_LOGGER_LEVEL Level, DWORD64 Timestamp, const WCHAR *Message)

Called by internal logger to report diagnostic messages

Parameters

  • Level: Message level.
  • Timestamp: Message timestamp in in 100ns intervals since 1601-01-01 UTC.
  • Message: Message text.

WINTUN_SESSION_HANDLE

typedef void* WINTUN_SESSION_HANDLE

A handle representing Wintun session

Enumeration Types

WINTUN_LOGGER_LEVEL

enum WINTUN_LOGGER_LEVEL

Determines the level of logging, passed to WINTUN_LOGGER_CALLBACK.

  • WINTUN_LOG_INFO: Informational
  • WINTUN_LOG_WARN: Warning
  • WINTUN_LOG_ERR: Error

Enumerator

Functions

WintunCreateAdapter()

WINTUN_ADAPTER_HANDLE WintunCreateAdapter (const WCHAR * Name, const WCHAR * TunnelType, const GUID * RequestedGUID)

Creates a new Wintun adapter.

Parameters

  • Name: The requested name of the adapter. Zero-terminated string of up to MAX_ADAPTER_NAME-1 characters.
  • Name: Name of the adapter tunnel type. Zero-terminated string of up to MAX_ADAPTER_NAME-1 characters.
  • RequestedGUID: The GUID of the created network adapter, which then influences NLA generation deterministically. If it is set to NULL, the GUID is chosen by the system at random, and hence a new NLA entry is created for each new adapter. It is called «requested» GUID because the API it uses is completely undocumented, and so there could be minor interesting complications with its usage.

Returns

If the function succeeds, the return value is the adapter handle. Must be released with WintunCloseAdapter. If the function fails, the return value is NULL. To get extended error information, call GetLastError.

WintunOpenAdapter()

WINTUN_ADAPTER_HANDLE WintunOpenAdapter (const WCHAR * Name)

Opens an existing Wintun adapter.

Parameters

  • Name: The requested name of the adapter. Zero-terminated string of up to MAX_ADAPTER_NAME-1 characters.

Returns

If the function succeeds, the return value is adapter handle. Must be released with WintunCloseAdapter. If the function fails, the return value is NULL. To get extended error information, call GetLastError.

WintunCloseAdapter()

void WintunCloseAdapter (WINTUN_ADAPTER_HANDLE Adapter)

Releases Wintun adapter resources and, if adapter was created with WintunCreateAdapter, removes adapter.

Parameters

  • Adapter: Adapter handle obtained with WintunCreateAdapter or WintunOpenAdapter.

WintunDeleteDriver()

BOOL WintunDeleteDriver ()

Deletes the Wintun driver if there are no more adapters in use.

Returns

If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError.

WintunGetAdapterLuid()

void WintunGetAdapterLuid (WINTUN_ADAPTER_HANDLE Adapter, NET_LUID * Luid)

Returns the LUID of the adapter.

Parameters

  • Adapter: Adapter handle obtained with WintunOpenAdapter or WintunCreateAdapter
  • Luid: Pointer to LUID to receive adapter LUID.

WintunGetRunningDriverVersion()

DWORD WintunGetRunningDriverVersion (void )

Determines the version of the Wintun driver currently loaded.

Returns

If the function succeeds, the return value is the version number. If the function fails, the return value is zero. To get extended error information, call GetLastError. Possible errors include the following: ERROR_FILE_NOT_FOUND Wintun not loaded

WintunSetLogger()

void WintunSetLogger (WINTUN_LOGGER_CALLBACK NewLogger)

Sets logger callback function.

Parameters

  • NewLogger: Pointer to callback function to use as a new global logger. NewLogger may be called from various threads concurrently. Should the logging require serialization, you must handle serialization in NewLogger. Set to NULL to disable.

WintunStartSession()

WINTUN_SESSION_HANDLE WintunStartSession (WINTUN_ADAPTER_HANDLE Adapter, DWORD Capacity)

Starts Wintun session.

Parameters

  • Adapter: Adapter handle obtained with WintunOpenAdapter or WintunCreateAdapter
  • Capacity: Rings capacity. Must be between WINTUN_MIN_RING_CAPACITY and WINTUN_MAX_RING_CAPACITY (incl.) Must be a power of two.

Returns

Wintun session handle. Must be released with WintunEndSession. If the function fails, the return value is NULL. To get extended error information, call GetLastError.

WintunEndSession()

void WintunEndSession (WINTUN_SESSION_HANDLE Session)

Ends Wintun session.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession

WintunGetReadWaitEvent()

HANDLE WintunGetReadWaitEvent (WINTUN_SESSION_HANDLE Session)

Gets Wintun session’s read-wait event handle.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession

Returns

Pointer to receive event handle to wait for available data when reading. Should WintunReceivePackets return ERROR_NO_MORE_ITEMS (after spinning on it for a while under heavy load), wait for this event to become signaled before retrying WintunReceivePackets. Do not call CloseHandle on this event — it is managed by the session.

WintunReceivePacket()

BYTE* WintunReceivePacket (WINTUN_SESSION_HANDLE Session, DWORD * PacketSize)

Retrieves one or packet. After the packet content is consumed, call WintunReleaseReceivePacket with Packet returned from this function to release internal buffer. This function is thread-safe.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession
  • PacketSize: Pointer to receive packet size.

Returns

Pointer to layer 3 IPv4 or IPv6 packet. Client may modify its content at will. If the function fails, the return value is NULL. To get extended error information, call GetLastError. Possible errors include the following: ERROR_HANDLE_EOF Wintun adapter is terminating; ERROR_NO_MORE_ITEMS Wintun buffer is exhausted; ERROR_INVALID_DATA Wintun buffer is corrupt

WintunReleaseReceivePacket()

void WintunReleaseReceivePacket (WINTUN_SESSION_HANDLE Session, const BYTE * Packet)

Releases internal buffer after the received packet has been processed by the client. This function is thread-safe.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession
  • Packet: Packet obtained with WintunReceivePacket

WintunAllocateSendPacket()

BYTE* WintunAllocateSendPacket (WINTUN_SESSION_HANDLE Session, DWORD PacketSize)

Allocates memory for a packet to send. After the memory is filled with packet data, call WintunSendPacket to send and release internal buffer. WintunAllocateSendPacket is thread-safe and the WintunAllocateSendPacket order of calls define the packet sending order.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession
  • PacketSize: Exact packet size. Must be less or equal to WINTUN_MAX_IP_PACKET_SIZE.

Returns

Returns pointer to memory where to prepare layer 3 IPv4 or IPv6 packet for sending. If the function fails, the return value is NULL. To get extended error information, call GetLastError. Possible errors include the following: ERROR_HANDLE_EOF Wintun adapter is terminating; ERROR_BUFFER_OVERFLOW Wintun buffer is full;

WintunSendPacket()

void WintunSendPacket (WINTUN_SESSION_HANDLE Session, const BYTE * Packet)

Sends the packet and releases internal buffer. WintunSendPacket is thread-safe, but the WintunAllocateSendPacket order of calls define the packet sending order. This means the packet is not guaranteed to be sent in the WintunSendPacket yet.

Parameters

  • Session: Wintun session handle obtained with WintunStartSession
  • Packet: Packet obtained with WintunAllocateSendPacket

Building

Do not distribute drivers or files named «Wintun», as they will most certainly clash with official deployments. Instead distribute wintun.dll as downloaded from wintun.net.

General requirements:

  • Visual Studio 2019 with Windows SDK
  • Windows Driver Kit

wintun.sln may be opened in Visual Studio for development and building. Be sure to run bcdedit /set testsigning on and then reboot before to enable unsigned driver loading. The default run sequence (F5) in Visual Studio will build the example project and its dependencies.

License

The entire contents of the repository, including all documentation and example code, is «Copyright © 2018-2021 WireGuard LLC. All Rights Reserved.» Source code is licensed under the GPLv2. Prebuilt binaries from wintun.net are released under a more permissive license suitable for more forms of software contained inside of the .zip files distributed there.

Вчера обнаружил, что на мой домашний сервер пытаются подобрать пароль к RDP. Спросил наших безопасников с работы, да, порт сканировали, но пароль подбирают не они… Надо что-то делать с этим, и я даже знаю что.

Ударим шифрованием по злобным брутфорсерам! Ставим OpenVPN 2.5.1 сервер на Windows Server 2016.

  • Встретимся с Easy-RSA 3.
  • Решим неочевидный баг с директорией временных файлов.
  • Освоим OpenVPN Connect, в том числе на Android.
  • Запилим адаптер OpenVPN WinTun.

Установка OpenVPN Server

Скачиваем дистрибутив для установки OpenVPN:

Community Downloads

vpn

Доступна версия OpenVPN 2.5.1. Скачиваю Windows 64-bit MSI installer, файл OpenVPN-2.5.1-I601-amd64.msi.

vpn

Запускаем инсталлятор OpenVPN.

vpn

Открывается мастер установки, предлагают выбрать тип установки, естественно, нажимаем Customize. Установка по умолчанию нас не устроит.

vpn

OpenVPN GUI отключаю. Мне нужно, чтобы OpenVPN на сервере работал автоматически.

vpn

А OpenVPN Service, наоборот, включаю. OpenVPN у меня будет работать как служба Windows.

Документацию и примеры конфигурации оставляю. Конфигурационные примеры будут использоваться в качестве шаблонов.

vpn

Начиная с версии OpenVPN 2.5 появилась поддержка драйвера WinTUN от разработчиков WireGuard. Говорят, что работает быстрее чем TAP-Windows6. Поэтому драйвер TAP-Windows6 отключаю и включаю Wintun.

ПРИМЕЧАНИЕ: для включения драйвера Wintun необходимо в файле конфигурации сервера включить параметр:

windows-driver wintun

vpn

Утилиты OpenSSL EasyRSA 3 Certificate Management Scripts включаю. Install Now.

vpn

Начинается процесс установки OpenVPN.

openvpn

Установка успешно завершена. Close.

vpn

Установка выполнена в директорию C:\Program Files\OpenVPN.

vpn

После установки у нас появляется новый сетевой адаптер Wintun Userspace Tunnel.

vpn

Адаптер отключён.

Создание ключей и сертификатов

Запускаем командную строку под администратором и переходим в рабочую директорию C:\Program Files\OpenVPN\easy-rsa.

cd C:\Program Files\OpenVPN\easy-rsa

В этой папке есть всё необходимое для генерации сертификатов.

vpn

Для работы в Windows нас интересует файл EasyRSA-Start.bat.

vpn

Выполняем EasyRSA-Start.bat.

vpn

Запускается оболочка EasyRSA Shell.

Инициализируем новую конфигурацию:

./easyrsa init-pki

vpn

Появляется новая директория C:\Program Files\OpenVPN\easy-rsa\pki.

vpn

Генерируем ключ и сертификат центра сертификации. Внимание, сейчас мы наступим на грабли, исправим ошибку и снова вернёмся к генерации файлов для центра сертификации.

./easyrsa build-ca

Нас попросят для раза ввести пароль. Придумываем и вводим.

vpn

Получаем ошибку.

Extra arguments given.
genrsa: Use -help for summary.

Easy-RSA error:

Failed create CA private key

Исправим этот баг. Мне не совсем понятно, почему нельзя было всё сделать сразу по-человечески, чтобы люди не встречали эту ошибку. Копируем файл C:\Program Files\OpenVPN\easy-rsa\vars.example, называем копию C:\Program Files\OpenVPN\easy-rsa\vars.

vpn

Редактируем C:\Program Files\OpenVPN\easy-rsa\vars. В данном файле можно много чего прописать, но я не буду на этом сейчас останавливаться подробно. Находим строку:

#set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI"

И заменяем её на:

set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI/temp"

vpn

Собственно, ошибка и заключалась в том, что оболочка по какой-то причине не могла создать временный файл.

Генерируем ключ и сертификат центра сертификации:

./easyrsa build-ca

Нас попросят для раза ввести пароль. Придумываем и вводим. После нас просят указать Common Name для центра сертификации, указываю «internet-lab.ru».

vpn

Операция проходит успешно.

vpn

Создаётся сертификат центра сертификации:

  • C:\Program Files\OpenVPN\easy-rsa\pki\ca.crt

Сертификат создаётся на 10 лет, это значение можно переопределить в файле vars.

vpn

И ключ центра сертификации:

  • C:\Program Files\OpenVPN\easy-rsa\pki\private\ca.key

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

Генерируем ключ и запрос на сертификат сервера, назовём сервер именем «server«:

./easyrsa gen-req server nopass

Нас просят указать Common Name для сервера, указываю «internet-lab.ru».

vpn

Операция проходит успешно.

vpn

Создаётся запрос на сертификат сервера:

  • C:\Program Files\OpenVPN\easy-rsa\pki\reqs\server.req

vpn

И ключ сервера:

  • C:\Program Files\OpenVPN\easy-rsa\pki\private\server.key

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

Для создания сертификата сервера нужно подписать запрос на сертификат:

./easyrsa sign-req server server

Для подписи нужно ввести слово «yes» и указать пароль от центра сертификации.

vpn

Создаётся сертификат сервера:

  • C:\Program Files\OpenVPN\easy-rsa\pki\issued\server.crt

Сертификат сервера создаётся на 825 дней, это значение можно переопределить в файле vars.

vpn

Теперь создадим клиентский сертификат. По хорошему клиентский ключ следует запаролить, чтобы исключить утечку при передаче. Для этого есть несколько способов.

Первый

  1. На клиентской машине генерируем запрос на сертификат клиента и ключ без пароля:

    ./easyrsa init-pki
    ./easyrsa gen-req client nopass
  2. Переносим REQ файл запроса на сертификат клиента на машину с нашим CA, импортируем, подписываем, отсылаем сгенерированный сертификат CRT обратно клиенту:
    ./easyrsa import-req /path/to/client.req client
    ./easyrsa sign-req client client

Второй

  1. а машине с CA генерируем сертификат клиента и ключ с паролем:

    ./easyrsa gen-req client
    ./easyrsa sign-req client client
  2. Переносим файлы клиенту, сообщаем пароль. Клиент снимает пароль с полученного ключа:
    openssl rsa -in client.key -out clientnew.key

Третий

Но поскольку я генерирую ключ сам для себя, то воспользуюсь небезопасным третьим способом.

Генерируем ключ и запрос на сертификат клиента, назовём клиента именем «client«:

./easyrsa gen-req client nopass

Нас просят указать Common Name для клиента, указываю «v.pupkin».

vpn

Операция проходит успешно.

vpn

Создаётся запрос на сертификат клиента:

  • C:\Program Files\OpenVPN\easy-rsa\pki\reqs\client.req

vpn

И ключ клиента:

  • C:\Program Files\OpenVPN\easy-rsa\pki\private\client.key

Для создания сертификата клиента нужно подписать запрос на сертификат:

./easyrsa sign-req client client

Для подписи нужно ввести слово «yes» и указать пароль от центра сертификации.

vpn

Создаётся сертификат клиента:

  • C:\Program Files\OpenVPN\easy-rsa\pki\issued\client.crt

Сертификат сервера создаётся на 825 дней, это значение можно переопределить в файле vars.

vpn

Генерируем ключ Диффи-Хеллмана:

./easyrsa gen-dh

vpn

Операция займёт некоторое время.

vpn

Создаётся файл:

  • C:\Program Files\OpenVPN\easy-rsa\pki\dh.pem

vpn

Я на сервере собираюсь использовать tls-auth для дополнительной проверки целостности, это обеспечит дополнительный уровень безопасности протокола SSL/TLS при создании соединения:

  • Сканирование прослушиваемых VPN-сервером портов
  • Инициация SSL/TLS-соединения несанкционированной машиной на раннем этапе
  • DoS-атаки и флуд на порты OpenVPN
  • Переполнение буфера SSL/TLS

При использовании tls-auth на клиенте не понадобится ключ Диффи-Хеллмана, но пусть будет. Генерируем ключ tls-auth. Для этого запускаем командную строку под администратором и выполняем:

cd C:\Program Files\OpenVPN\bin
openvpn --genkey secret ta.key

vpn

В папке C:\Program Files\OpenVPN\bin создаётся файл ta.key.

vpn

Переносим его в папку C:\Program Files\OpenVPN\easy-rsa\pki.

vpn

Минимальный набор сертификатов сгенерирован.

Настройка OpenVPN сервера

Создадим конфигурационный файл сервера C:\Program Files\OpenVPN\config-auto\server.ovpn:

copy "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"

vpn

Открываем блокнотом и редактируем:

notepad "C:\Program Files\OpenVPN\config-auto\server.ovpn"

Лучше изучить конфигурационный файл, я предлагаю свой вариант конфига:

port 1194
proto tcp
dev tun
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"  # This file should be kept secret
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
duplicate-cn
keepalive 10 120
tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key" 0 # This file is secret
cipher AES-256-GCM
persist-key
persist-tun
status "C:\\Program Files\\OpenVPN\\log\\status.log"
log         "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
verb 4
mute 20
windows-driver wintun

У меня здесь указаны пути к ключам и сертификатам, используется порт 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 сервера

Переходим к службам:

services.msc

vpn

Находим службу OpenVPNService.

vpn

Настраиваем на автоматический запуск при загрузке сервера.

vpn

Запускаем (перезапускаем) службу.

Согласно настройкам сервера в папке C:\Program Files\OpenVPN\log должны появиться логи. Это один из инструментов администратора OpenVPN сервера.

vpn

Активировался сетевой адаптер OpenVPN Wintun.

vpn

Согласно настройкам сервера IP адрес 10.8.0.1.

vpn

Проверяем поднялся ли порт tcp 1194:

netstat -tan | find "1194"

Порт должен прослушиваться.

vpn

Настройка firewall

Теперь нужно настроить firewall. Открываем Windows Defender Firewall with Advanced Security.

vpn

Переходим в Inbound Rules.

vpn

Создаём правило — New Rule…

vpn

Тип правила — Port. Next.

vpn

Протоколы и порты — TCP 1194. Как в настройках сервера. Next.

vpn

Действия — Allow the connection. Next.

vpn

Для всех сетей. Next.

vpn

Указываем название правила — OpenVPN. Next.

Правило создано, теперь firewall не блокирует входящие TCP соединения на 1194 порту.

Настройка OpenVPN клиента на ПК Windows

На компьютере клиента устанавливаем OpenVPN Connect.

Get OpenVPN

vpn

Я скачиваю версию для Windows.

vpn

Запускаем установку.

vpn

Next.

vpn

Принимаем лицензионное соглашение. Next.

vpn

Install.

vpn

OpenVPN Connect устанавливается.

vpn

Установка завершена. Finish.

vpn

На рабочем столе появляется иконка OpenVPN Connect.

На сервере файл примера конфигурации client.ovpn копируем как internet-lab.ru.ovpn.

vpn

И редактируем:

client
dev tun
proto tcp
remote internet-lab.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
verb 0
connect-retry-max 25

Здесь нужно указать протокол, порт адрес сервера и прочие параметры. Пути к ключам и сертификатам относительные.

Создаём директорию, например, C:\openvpn. Копируем в неё с сервера файлы:

  • ca.crt
  • client.crt
  • client.key
  • dh.pem
  • ta.key
  • internet-lab.ru.ovpn

vpn

Запускаем OpenVPN Connect.

vpn

Agree. Переключаемся на File.

vpn

Перетаскиваем мышкой в окно файл C:\openvpn\internet-lab.ru.ovpn, или указываем через кнопку Browse.

vpn

Ставим галку «Connect after import».

vpn

Коннектимся.

vpn

Соединение с OpenVPN сервером установлено.

vpn

В логах сервера видим, что соединился юзер v.pupkin.

Настройка OpenVPN клиента на смартфоне Android

Копируем на телефон все те же файлы, что и для клиента.

vpn

Устанавливаем приложение OpenVPN Connect.

vpn

Запускаем.

vpn

Agree.

vpn

Выбираем File. Указываем путь к файлу internet-lab.ru.ovpn.

vpn

Import.

vpn

Ставим галку «Connect after import».

vpn

Соединение с OpenVPN сервером установлено.

vpn

В логах сервера видим, что соединился второй юзер v.pupkin.

Отзыв сертификата

cd C:\Program Files\OpenVPN\easy-rsa
EasyRSA-Start.bat
./easyrsa revoke client

Ссылки

Установка OpenVPN сервера на Windows

Branch Commit message Author Age
master driver: fix spelling mistakes in comments Jason A. Donenfeld 17 months
sr/group-ndis-indicates driver: accumulate up to 16 receive NBLs before indicating Simon Rozman 23 months
sr/cetcompat props: Opt-in for Hardware-enforced Stack Protection Simon Rozman 2 years
sr/sdv driver: workaround SDV failure with code analysis Simon Rozman 2 years
jd/netsetup2-guid-compare api: check netsetup2 key when trying to determine if GUID is duplicated Jason A. Donenfeld 2 years
sr/api-improvements Allow packet over-allocation on send Simon Rozman 2 years
sr/simons-wild-n-crazy-printf api: implement %r format type for logging registry path Simon Rozman 3 years
 
Tag Download Author Age
0.14.1 wintun-0.14.1.tar.xz  wintun-0.14.1.zip   Jason A. Donenfeld 24 months
0.14 wintun-0.14.tar.xz  wintun-0.14.zip   Jason A. Donenfeld 24 months
0.13 wintun-0.13.tar.xz  wintun-0.13.zip   Jason A. Donenfeld 2 years
0.12 wintun-0.12.tar.xz  wintun-0.12.zip   Jason A. Donenfeld 2 years
0.11 wintun-0.11.tar.xz  wintun-0.11.zip   Jason A. Donenfeld 2 years
0.10.5 wintun-0.10.5.tar.xz  wintun-0.10.5.zip   Jason A. Donenfeld 2 years
0.10.4 wintun-0.10.4.tar.xz  wintun-0.10.4.zip   Jason A. Donenfeld 2 years
0.10.3 wintun-0.10.3.tar.xz  wintun-0.10.3.zip   Jason A. Donenfeld 2 years
0.10.2 wintun-0.10.2.tar.xz  wintun-0.10.2.zip   Simon Rozman 3 years
0.10.1 wintun-0.10.1.tar.xz  wintun-0.10.1.zip   Jason A. Donenfeld 3 years
[…]
 
Age Commit message Author Files Lines
2022-05-23 driver: fix spelling mistakes in commentsHEADmaster Jason A. Donenfeld 1 -2/+2
2022-04-22 README: mention Windows 11 Simon Rozman 1 -1/+1
2021-12-03 api: header: silence MSVC warnings for MSVC only Simon Rozman 1 -3/+7
2021-10-25 proj: stop building for arm32 Simon Rozman 1 -3/+2
2021-10-17 driver: address Code Analysis warning Simon Rozman 1 -0/+1
2021-10-17 driver: allow ring registration from kernel Simon Rozman 1 -4/+4
2021-10-17 driver: address Code Analysis warnings Simon Rozman 1 -1/+2
2021-10-17 version: bump0.14.1 Jason A. Donenfeld 1 -1/+1
2021-10-15 api: main: avoid excessive function cast Jason A. Donenfeld 1 -4/+3
2021-10-15 example: remove overly specific casts Jason A. Donenfeld 1 -10/+5
[…]
 
Clone
https://git.zx2c4.com/wintun
git://git.zx2c4.com/wintun
ssh://git@git.zx2c4.com/wintun

Copyright © 1996 – 2023 Jason A. Donenfeld. All Rights Reverse Engineered.

OpenVPN – это набор open source программ, который заслуженно является одним из самых популярных и легких решений для реализации защищенной VPN сети. OpenVPN позволяет объединить в единую сеть сервер и клиентов (даже находящиеся за NAT или файерволами), или объединить сети удаленных офисов. Серверную часть OpenVPN можно развернуть практически на всех доступных операционных системах (пример настройки OpenVPN на Linux). Вы можете установить OpenVPN сервер даже на обычный компьютер с десктопной редакцией Windows 10.

В этой статье, мы покажем, как установить OpenVPN сервер на компьютер с Windows 10, настроить OpenVPN клиент на другом Windows хосте и установить защищенное VPN подключение.

Содержание:

  • Установка службы OpenVPN сервера в Windows
  • Создаем ключи шифрования и сертификаты для OpenVPN
  • Конфигурационный файл OpenVPN сервера в Windows
  • Настройка OpenVPN клиента в Windows

Установка службы OpenVPN сервера в Windows

Скачайте MSI установщик OpenVPN для вашей версии Windows с официального сайта (https://openvpn.net/community-downloads/). В нашем случае это OpenVPN-2.5.5-I602-amd64.msi (https://swupdate.openvpn.org/community/releases/OpenVPN-2.5.5-I602-amd64.msi).

Запустите установку.

Если вы планируете, OpenVPN сервер работал в автоматическом режиме, можно не устанавливать OpenVPN GUI. Обязательно установите OpenVPN Services.

установка openvpn сервера в windows 10

Начиная с версии OpenVPN 2.5, поддерживается драйвер WinTun от разработчиков WireGuard. Считается, что этот драйвер работает быстрее чем классический OpenVPN драйвер TAP. Установите драйвер Wintun, откажитесь от установки TAP-Windows6.

Установите OpenSSL утилиту EasyRSA Certificate Management Scripts.

WinTun драйвер openvpn

Запустите установку.

По умолчанию OpenVPN устаналивается в каталог C:\Program Files\OpenVPN.

После окончания установки появится новый сетевой адаптер типа Wintun Userspace Tunnel. Этот адаптер отключен, если служба OpenVPN не запущена.

сетевой адаптер Wintun Userspace Tunnel

Создаем ключи шифрования и сертификаты для OpenVPN

OpenVPN основан на шифровании OpenSSL. Это означает, что для обмена трафиком между клиентом и серверов VPN нужно сгенерировать ключи и сертификаты с использованием RSA3.

Откройте командную строку и перейдите в каталог easy-rsa:

cd C:\Program Files\OpenVPN\easy-rsa

Создайте копию файла:

copy vars.example vars

Откройте файл vars с помощью любого текстового редактора. Проверьте пути к рабочим директориям.

Обязательно поправьте переменную EASYRSA_TEMP_DIR следующим образом:

set_var EASYRSA_TEMP_DIR "$EASYRSA_PKI/temp"

EASYRSA_TEMP_DIR

Можете заполнить поля для сертификатов (опционально)

set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "MSK"
set_var EASYRSA_REQ_CITY "MSK"
set_var EASYRSA_REQ_ORG "IT-Company"
set_var EASYRSA_REQ_EMAIL " [email protected] "
set_var EASYRSA_REQ_OU " IT department "

конфигурационный файл vars при установке сертфикатов easyrsa

Срок действия сертификатов задается с помощью:

#set_var EASYRSA_CA_EXPIRE 3650
#set_var EASYRSA_CERT_EXPIRE 825

Сохраните файл и выполните команду:

EasyRSA-Start.bat

Следующие команды выполняются в среде EasyRSA Shell:

Инициализация PKI:

./easyrsa init-pki

Должна появится надпись:

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: C:/Program Files/OpenVPN/easy-rsa/pki

Теперь нужно сгенерировать корневой CA:

./easyrsa build-ca

Задайте дважды пароль для CA:

CA creation complete and you may now import and sign cert requests.

Данная команда сформировала:

  • Корневой сертификат центра сертификации: «C:\Program Files\OpenVPN\easy-rsa\pki\ca.crt»
  • Ключ центра сертификации «C:\Program Files\OpenVPN\easy-rsa\pki\private\ca.key»

Теперь нужно сгенерировать запрос сертификата и ключ для вашего сервера OpenVPN:

./easyrsa gen-req server nopass

Утилита сгенерирует два файла:

req: C:/Program Files/OpenVPN/easy-rsa/pki/reqs/server.req
key: C:/Program Files/OpenVPN/easy-rsa/pki/private/server.key

Подпишем запрос на выпуск сертификата сервера с помощью нашего CA:

./easyrsa sign-req server server

Подтвердите правильность данных, набрав yes.

Затем введите пароль CA от корневого CA.

В каталоге issued появится сертификат сервера («C:\Program Files\OpenVPN\easy-rsa\pki\issued\server.crt»)

сертификат сервера openvpn

Теперь можно создать ключи Диффи-Хеллмана (займет длительное время):
./easyrsa gen-dh

Для дополнительной защиты VPN сервера желательно включить tls-auth. Данная технология позволяет использовать подписи HMAC к handshake-пакетам SSL/TLS, инициируя дополнительную проверку целостности. Пакеты без такой подписи будут отбрасываться VPN сервером. Это защитит вас от сканирования порта VPN сервера, DoS атак, переполнения буфера SSL/TLS.

Сгенерируйте ключ tls-auth:

cd C:\Program Files\OpenVPN\bin
openvpn --genkey secret ta.key

Должен появиться файл «C:\Program Files\OpenVPN\bin\ta.key». Переместите его в каталог C:\Program Files\OpenVPN\easy-rsa\pki

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

Есть несколько способов генерации ключей и передачи их клиентам. В следующем примере, мы создадим на сервере ключ клиента и защитим его паролем:

./easyrsa gen-req kbuldogov
./easyrsa sign-req client kbuldogov

пароль для защиты ключа клиента easyrsa

Данный ключ («C:\Program Files\OpenVPN\easy-rsa\pki\private\kbuldogov.key») нужно передать клиенту и сообщить пароль. Клиент может снять защиту паролем для ключа:

openssl rsa -in "C:\Program Files\OpenVPN\easy-rsa\pki\private\kbuldogov.key"-out "C:\Program Files\OpenVPN\easy-rsa\pki\private\kbuldogov_use.key"

снять защиту паролем с ключа клиента

Если вы хотите сгенерировать ключ, не защищенный паролем, нужно выполнить команду:

./easyrsa gen-req имяклиента nopass

На сервере с OpenVPN вы можете создать неограниченное количество ключей и сертификатов для пользователей. Аналогичным образом сформируйте ключи и сертфикаты для других клиентов.

Вы можете отохвать скомпрометированные сертификаты клиентов:
cd C:\Program Files\OpenVPN\easy-rsa
EasyRSA-Start.bat
./easyrsa revoke kbuldogov

Итак, мы сгенерировали набор ключей и сертификатов для OpenVPN сервера. Теперь можно настроить и запустить службу OpenVPN.

Конфигурационный файл OpenVPN сервера в Windows

Скопируйте типовой конфигурационный файл OpenVPN сервера:

copy "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"

Откройте файл server.ovpn в любом текстовом редакторе и внесите свои настройки. Я использую следующий конфиг для OpenVPN:

# Указываем порт, протокол и устройство
port 1194
proto udp
dev tun
# Указываем пути к сертификатам сервера
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
# Указываем настройки IP сети, адреса из которой будет будут получать VPN клиенты
server 10.24.1.0 255.255.255.0
#если нужно разрешить клиентам подключаться под одним ключом, нужвно включить опцию duplicate-cn (не рекомендуется)
#duplicate-cn
# TLS защита
tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key" 0
cipher AES-256-GCM
# Другая параметры
keepalive 20 60
persist-key
persist-tun
status "C:\\Program Files\\OpenVPN\\log\\status.log"
log "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
verb 3
mute 20
windows-driver wintun

Сохраните файл.

OpenVPN позволяет использовать как TCP, так и UDP для подключения. В этом примере я запустил OpenVPN на 1194 UDP. Рекомендуется использовать протокол UDP, это оптимально как с точки зрения производительности, так и безопасности.

Не забудьте открыть на файерволе порты для указанного вами порта OpenVPN на клиенте и на сервере. Можно открыть порты в Windows Defender с помощью PowerShell.
Правило для сервера:

New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP –LocalPort 1194 -Action Allow

Правило для клиента:

New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP –LocalPort 1194 -Action Allow

Теперь нужно запустить службу OpenVPN и изменить тип ее запуска на автоматический. Воспользуйтесь таким командами PowerShell, чтобы включить службу:

Set-Service OpenVPNService –startuptype automatic –passthru
Get-Service OpenVPNService| Start-Service

запуск службы OpenVPNService

Откройте панель управления, и убедитесь, что виртуальный сетевой адаптер OpenVPN Wintun теперь активен. Если нет, смотрите лог «C:\Program Files\OpenVPN\log\server.log»

сетевой адаптер openvpn wintun

Если при запуске OpenVPN вы видите в логе ошибку:

Options error: In C:\Program Files\OpenVPN\config-auto\server.ovpn:1: Maximum option line length (256) exceeded, line starts with..

Смените в файле server.ovpn символы переноса строки на Windows CRLF (в notepad++ нужно выбрать Edit -> EOL Conversion -> Windows CR LF). Сохраните файл, перезапустите службу OpevVPNService.

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

Включить опцию IPEnableRouter в реестре (включает IP маршрутизацию в Windows, в том числе включает маршрутизацию меду сетями Hyper-V): reg add «HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters» /v IPEnableRouter /t REG_DWORD /d 1 /f

Добавьте в конфгурационный файл сервера OpenVPN маршруты до внутренней IP сети:

push "route 10.24.1.0 255.255.255.0"
push "route 192.168.100.0 255.255.255.0"

Если нужно, назначьте клиенту адреса DNS серверов:

push "dhcp-option DNS 192.168.100.11"
push "dhcp-option DNS 192.168.100.12"

Если нужно завернуть все запросы клиента (в том числе Интернет трафик) на ваш OpenVPN сервер, добавьте опцию:

push "redirect-gateway def1"

Настройка OpenVPN клиента в Windows

Создайте на сервере шаблонный конфигурационный файла для клиента VPN (на базе iшаблона client.ovpn) со следующими параметрами (имя файла kbuldovov.ovpn)

client
dev tun
proto udp
remote your_vpn_server_address 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert kbuldogov.crt
key kbuldogov.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
connect-retry-max 25
verb 3

В директиве remote указывается публичный IP адрес или DNS имя вашего сервера OpenVPN.

Скачайте и установите клиент OpenVPN Connect для Windows (https://openvpn.net/downloads/openvpn-connect-v3-windows.msi).

установка openvpn connect в windows

Теперь на компьютер с клиентом OpenVPN нужно с сервера скопировать файлы:

  • ca.crt
  • kbuldogov.crt
  • kbuldogov.key
  • dh.pem
  • ta.key
  • kbuldogov.ovpn

импорт конфигурации клиента ovpn в openvpn клиент

Теперь импортируйте файл с профилем *.ovpn и попробуйте подключиться к вашему VPN серверу.

Если все настроено правильно, появится такая картинка. подключение к openvpn установлено

Проверьте теперь лог OpenVPN на клиенте «C:\Program Files\OpenVPN Connect\agent.log»

Mon Dec 27 08:09:30 2021 proxy_auto_config_url
Mon Dec 27 08:09:31 2021 TUN SETUP
TAP ADAPTERS:
guid='{25EE4A55-BE90-45A0-88A1-8FA8FEF24C42}' index=22 name='Local Area Connection'
Open TAP device "Local Area Connection" PATH="\\.\Global\{25EE4A55-BE90-45A0-88A1-8FA8FEF24C42}.tap" SUCCEEDED
TAP-Windows Driver Version 9.24
ActionDeleteAllRoutesOnInterface iface_index=22
netsh interface ip set interface 22 metric=1
Ok.
netsh interface ip set address 22 static 10.24.1.6 255.255.255.252 gateway=10.24.1.5 store=active
IPHelper: add route 10.24.1.1/32 22 10.24.1.5 metric=-1

Клиент успешно подключится к OpenVPN серверу и получил IP адрес 10.24.1.6.

Проверьте теперь лог на сервере («C:\Program Files\OpenVPN\log\openvpn.log»). Здесь также видно, что клиент с сертификатом kbuldogov успешно подключится к вашему серверу.

2021-12-27 08:09:35 192.168.13.202:55648 [kbuldogov] Peer Connection Initiated with [AF_INET6]::ffff:192.168.13.202:55648
2021-12-27 08:09:35 kbuldogov/192.168.13.202:55648 MULTI_sva: pool returned IPv4=10.24.1.6, IPv6=(Not enabled)
2021-12-27 08:09:35 kbuldogov/192.168.13.202:55648 MULTI: Learn: 10.24.1.6 -> kbuldogov/192.168.13.202:55648
2021-12-27 08:09:35 kbuldogov/192.168.13.202:55648 MULTI: primary virtual IP for kbuldogov/192.168.13.202:55648: 10.24.1.6

Starting with the version 4.4 of our Windows VPN client app, we added support for the WinTun driver, an alternative to the classic Tap driver provided by OpenVPN.  

You can enable support for it in the Advanced tab > Use wintun driver if installed  

Wintun driver installation

The driver is not automatically installed, so you need to install it separately. There are 2 ways to do so:  

1. Download OpenVPN GUI from http://staging.openvpn.net/openvpn2/ and when you install it, check only the Wintun driver installation  
2. Run the wintun.bat install script from our software’s «Tap» subfolder (e.g. C:\Program Files (x86)\VPN.AC Client\Tap)  

AdvantagesUsing the Wintun driver instead of classic Tap network adapter could give a speed boost with OpenVPN connections, over ~200Mbps which has always been the upper limit with the Tap driver. Use it only if your broadband speed is higher than 200 Mbps, else it wouldn’t make a difference.  

Disadvantages— Establishing a connection using the Wintun driver takes a longer time due to the delays/wait times when setting up the IP on the virtual interface. In our testing, the delay adds an extra ~10 seconds when establishing the connection.  
— The driver is still in experimental phase and it has bugs. For instance, we found that in some scenarios it’s impossible to establish a connection unless the wintun virtual network adapter’s name is changed.

  • Winzip 64 bit windows 10 активированный
  • Winsxs что это за папка windows 10 можно ли удалить
  • Winx игра для windows скачать
  • Winx club как запустить на windows 10
  • Wintohdd как установить windows 10