Перейти к содержанию

OpenVPN на Windows Server 2022: ручная установка и настройка с нуля

В этой статье рассмотрим установку и настройку OpenVPN Server 2.7 на Windows Server 2022. По пути разберёмся, из каких компонентов состоит OpenVPN, зачем нужен каждый файл и что делает каждый важный параметр конфигурации.

Что получится в результате

После выполнения всех шагов вы получите полностью настроенный OpenVPN-сервер на Windows Server 2022.

Будут настроены:

  • OpenVPN Server;
  • OpenSSL;
  • Easy-RSA;
  • собственный центр сертификации (CA);
  • серверный сертификат;
  • первый клиентский сертификат;
  • защита служебного обмена с помощью tls-crypt;
  • автоматический запуск службы OpenVPN;
  • маршрутизация Windows;
  • правило брандмауэра Windows;
  • готовый клиентский профиль .ovpn.

После этого останется только импортировать профиль в OpenVPN Connect и подключиться к локальной сети через Интернет.


В примерах используется такая схема:

Windows Server с OpenVPN: 192.168.10.10
Локальная сеть:           192.168.10.0/24
Внутренний DNS:           192.168.10.5

VPN-сеть:                 192.168.254.0/24
Внешний адрес:            vpn.example.com
Порт OpenVPN:             UDP 1194
Первый клиент:            test1

Если у вас другие адреса, меняйте их прямо в командах и конфигурационных файлах в тех местах, где они встречаются.

Все команды PowerShell должны выполняться от имени администратора.


1. Устанавливаем OpenVPN

Создаём временный каталог и скачиваем установщик OpenVPN 2.7.4.

New-Item -ItemType Directory -Path C:\OpenVPN-Deploy -Force | Out-Null
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
(New-Object System.Net.WebClient).DownloadFile("https://swupdate.openvpn.org/community/releases/OpenVPN-2.7.4-I002-amd64.msi","C:\OpenVPN-Deploy\OpenVPN-2.7.4-I002-amd64.msi")

Перед установкой проверяем цифровую подпись файла:

Get-AuthenticodeSignature "C:\OpenVPN-Deploy\OpenVPN-2.7.4-I002-amd64.msi"

В строке Status должно быть:

Valid

Теперь уже можно установить OpenVPN, TAP-драйвер, OpenSSL и Easy-RSA:

Start-Process msiexec.exe -ArgumentList '/i "C:\OpenVPN-Deploy\OpenVPN-2.7.4-I002-amd64.msi" /qn /norestart INSTALLDIR="C:\OpenVPN" ADDLOCAL=OpenVPN,OpenVPN.GUI,OpenVPN.Service,Drivers,Drivers.TAPWindows6,OpenSSL,EasyRSA /L*v "C:\OpenVPN-Deploy\openvpn-install.log"' -Wait

После завершения установки достаточно убедиться, что появились файлы в каталоге C:\OpenVPN\, служба OpenVPNService, а в списке сетевых адаптеров — TAP-Windows Adapter.

Во время установки OpenVPN автоматически создаёт несколько рабочих каталогов. В дальнейшем чаще всего используются следующие:

C:\OpenVPN\config-auto — здесь находится конфигурация сервера. Служба OpenVPNService автоматически запускает все файлы .ovpn, расположенные в этом каталоге.

C:\OpenVPN\easy-rsa\pki — здесь будут храниться инфраструктура сертификатов (PKI): сертификат центра сертификации (CA), серверные и клиентские сертификаты, закрытые ключи и список отозванных сертификатов (CRL). Это один из самых важных каталогов OpenVPN.

C:\ProgramData\OpenVPN\Log — здесь находятся журналы работы OpenVPN. Если сервер не запускается или возникают проблемы с подключением клиентов, в первую очередь следует проверить именно этот каталог.


2. Готовим удобный запуск Easy-RSA

Easy-RSA — это набор утилит для создания центра сертификации (CA), выпуска и отзыва сертификатов OpenVPN. В Windows она запускается через sh.exe и использует служебные программы из собственного каталога.

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

Создайте файл C:\OpenVPN\easy-rsa\easyrsa-run.cmd со следующим содержимым:

@echo off
setlocal EnableExtensions

set "ER=C:\OpenVPN\easy-rsa"
set "PATH=C:\OpenVPN\bin;%ER%\bin;%PATH%"

"%ER%\bin\sh.exe" -lc "cd 'C:/OpenVPN/easy-rsa' || exit 111; ./easyrsa %*; exit $?" 2>&1
exit /b %errorlevel%

Сохраняем и проверяем:

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --version"

Дальше через этот файл будем создавать центр сертификации, серверный сертификат и клиентские сертификаты.


3. Настраиваем параметры сертификатов

В каталоге

C:\OpenVPN\easy-rsa

создайте файл vars (без расширения) со следующим содержимым:

set_var EASYRSA_DN "cn_only"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_CURVE "prime256v1"
set_var EASYRSA_DIGEST "sha256"

set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 825
set_var EASYRSA_CRL_DAYS 30

set_var EASYRSA_REQ_COUNTRY    "RU"
set_var EASYRSA_REQ_PROVINCE   "Region"
set_var EASYRSA_REQ_CITY       "City"
set_var EASYRSA_REQ_ORG        "Example Organization"
set_var EASYRSA_REQ_EMAIL      "vpn-admin@example.invalid"
set_var EASYRSA_REQ_OU         "VPN"

Что здесь важно:

  • EASYRSA_ALGO "ec" — создаём сертификаты на эллиптических кривых вместо RSA;
  • prime256v1 — используем стандартную криптографическую кривую, поддерживаемую всеми современными клиентами OpenVPN;
  • sha256 — алгоритм подписи сертификатов;
  • EASYRSA_CA_EXPIRE 3650 — центр сертификации действует 10 лет;
  • EASYRSA_CERT_EXPIRE 825 — серверные и клиентские сертификаты действуют 825 дней;
  • EASYRSA_CRL_DAYS 30 — список отозванных сертификатов действует 30 дней.

Поля страны, региона, города, организации и электронной почты можно заменить своими или оставить условными.


4. Создаём PKI

PKI — это каталог, в котором Easy-RSA хранит:

  • центр сертификации;
  • закрытый ключ центра сертификации;
  • выпущенные сертификаты;
  • закрытые ключи серверов и клиентов;
  • список отозванных сертификатов.

Создаём структуру PKI:

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" init-pki"

Вариант 1. CA с паролем

Так безопаснее. Easy-RSA попросит придумать пароль:

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" build-ca"

Вариант 2. CA без пароля

Так проще, но закрытый ключ CA нужно особенно хорошо защищать:

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --batch build-ca nopass"

В примерах этой статьи используется CA без пароля.

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

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --batch build-server-full server nopass"

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

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

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --batch gen-crl"

CRL — это список сертификатов, которым сервер больше не должен доверять. Например, если ноутбук потерян или сотрудник уволился, его сертификат отзывается, после чего обновлённый CRL запрещает этому клиенту подключаться.

После выполнения команд проверьте наличие файлов в Проводнике:

C:\OpenVPN\easy-rsa\pki\ca.crt
C:\OpenVPN\easy-rsa\pki\private\ca.key
C:\OpenVPN\easy-rsa\pki\issued\server.crt
C:\OpenVPN\easy-rsa\pki\private\server.key
C:\OpenVPN\easy-rsa\pki\crl.pem

Файл ca.key — самый важный файл всей PKI. Получив его, можно выпускать новые доверенные сертификаты. Сделайте резервную копию и ограничьте к нему доступ. Никогда не копируйте его на клиентские устройства и не храните рядом с клиентскими профилями.


5. Создаём ключ tls-crypt

tls-crypt защищает служебный обмен OpenVPN до установления VPN-соединения.

Создаём ключ:

C:\OpenVPN\bin\openvpn.exe --genkey secret C:\OpenVPN\easy-rsa\tls-crypt.key

После выполнения должен появиться файл:

C:\OpenVPN\easy-rsa\tls-crypt.key

Этот же ключ позже будет встроен в клиентский профиль.


6. Создаём конфигурацию сервера

Открываем файл:

notepad C:\OpenVPN\config-auto\server.ovpn

Вставляем конфигурацию и при необходимости заменяем адреса локальной сети, DNS-сервера, VPN-подсети, порт и другие параметры на свои:

port 1194
proto udp4
dev tun
disable-dco

topology subnet
server 192.168.254.0 255.255.255.0

ca "C:/OpenVPN/easy-rsa/pki/ca.crt"
cert "C:/OpenVPN/easy-rsa/pki/issued/server.crt"
key "C:/OpenVPN/easy-rsa/pki/private/server.key"
crl-verify "C:/OpenVPN/easy-rsa/pki/crl.pem"
tls-crypt "C:/OpenVPN/easy-rsa/tls-crypt.key"

data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
remote-cert-tls client

keepalive 10 60
explicit-exit-notify 1
persist-tun

push "route 192.168.10.0 255.255.255.0"
push "dhcp-option DNS 192.168.10.5"

client-config-dir "C:/OpenVPN/ccd"

status-version 3
status "C:/ProgramData/OpenVPN/Log/status.log" 10
log-append "C:/ProgramData/OpenVPN/Log/server.log"
verb 3

Назначение основных параметров:

  • port 1194 — порт OpenVPN;
  • proto udp4 — UDP только по IPv4;
  • dev tun — маршрутизируемый VPN-интерфейс;
  • disable-dco — отключает использование DCO-драйвера, так как в этой статье используется TAP-драйвер;
  • topology subnet — клиенты получают обычные адреса из VPN-подсети;
  • server ... — VPN-подсеть;
  • ca, cert, key — сертификат CA, сертификат сервера и закрытый ключ сервера;
  • crl-verify — проверка списка отозванных сертификатов;
  • tls-crypt — защита служебного трафика;
  • data-ciphers — разрешённые алгоритмы шифрования;
  • cipher — совместимое значение для клиентов, которые ещё используют старый параметр;
  • auth SHA256 — проверка целостности служебных сообщений;
  • tls-version-min 1.2 — запрет старых версий TLS;
  • remote-cert-tls client — сервер принимает только клиентские сертификаты;
  • keepalive 10 60 — сервер каждые 10с проверяет доступность клиента и разрывает соединение через 60с при отсутствии ответа;
  • explicit-exit-notify 1 — уведомление UDP-клиента при штатном завершении;
  • persist-tun — не удалять VPN-интерфейс при перезапуске процесса;
  • push "route ..." — передать клиенту маршрут в локальную сеть;
  • push "dhcp-option DNS ..." — передать клиенту внутренний DNS;
  • client-config-dir — каталог индивидуальных настроек клиентов;
  • status — файл текущих подключений;
  • log-append — журнал сервера;
  • verb 3 — обычный уровень подробности журнала.

Сохраняем файл.


7. Включаем маршрутизацию Windows

По умолчанию Windows Server не пересылает пакеты между сетевыми интерфейсами.

OpenVPN-клиент сможет подключиться к серверу, но без маршрутизации Windows пакеты из VPN-сети не попадут в локальную сеть.

Для этого достаточно изменить один параметр реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

IPEnableRouter = 1 (DWORD)

Если параметр IPEnableRouter отсутствует, создайте его вручную.

После изменения параметра необходимо перезагрузить сервер. Только после перезагрузки Windows начнёт выполнять маршрутизацию.


8. Разрешаем OpenVPN в брандмауэре Windows

Открываем:

Брандмауэр Защитника Windows в режиме повышенной безопасности

Переходим:

Правила для входящих подключений → Создать правило

Создаём правило:

Тип правила:       Для программы
Программа:         C:\OpenVPN\bin\openvpn.exe
Протокол:          UDP
Локальный порт:    1194
Действие:          Разрешить подключение
Профили:           Доменный, Частный, Публичный
Имя:               OpenVPN Server UDP 1194

9. Настраиваем службу OpenVPN

Откройте services.msc, найдите службу OpenVPNService и установите тип запуска Автоматически.

Также рекомендуется настроить автоматический перезапуск службы при сбоях:

sc.exe failure OpenVPNService reset= 86400 actions= restart/60000/restart/60000/restart/60000
sc.exe failureflag OpenVPNService 1

После этого Windows будет автоматически пытаться восстановить работу OpenVPN при его аварийном завершении.


10. Выпускаем сертификат клиента

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

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --batch build-client-full test1 nopass"

После выпуска нового сертификата обновляем CRL:

cmd.exe /d /c ""C:\OpenVPN\easy-rsa\easyrsa-run.cmd" --batch gen-crl"

Убедитесь, что появились следующие файлы:

C:\OpenVPN\easy-rsa\pki\issued\test1.crt
C:\OpenVPN\easy-rsa\pki\private\test1.key

Для другого пользователя замените test1 на уникальное имя, например:

ivanov-laptop
director-phone
service-notebook

Один сертификат лучше выдавать одному конкретному устройству. Тогда при потере устройства можно отозвать только его сертификат.


11. Создаём клиентский профиль

Клиенту нужны:

  • адрес сервера;
  • параметры шифрования;
  • сертификат центра сертификации;
  • его собственный сертификат;
  • его закрытый ключ;
  • ключ tls-crypt.

Можно передавать все файлы отдельно, но гораздо удобнее объединить их в один профиль .ovpn. Такой файл импортируется в OpenVPN Connect целиком.

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

Сначала создаём заготовку:

notepad C:\OpenVPN\test1.ovpn

Вставляем:

client
dev tun
proto udp4
remote vpn.example.com 1194

nobind
resolv-retry infinite
remote-cert-tls server

data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

verb 3

<ca>
СЮДА ВСТАВИТЬ СОДЕРЖИМОЕ C:\OpenVPN\easy-rsa\pki\ca.crt
</ca>

<cert>
СЮДА ВСТАВИТЬ СОДЕРЖИМОЕ C:\OpenVPN\easy-rsa\pki\issued\test1.crt
</cert>

<key>
СЮДА ВСТАВИТЬ СОДЕРЖИМОЕ C:\OpenVPN\easy-rsa\pki\private\test1.key
</key>

<tls-crypt>
СЮДА ВСТАВИТЬ СОДЕРЖИМОЕ C:\OpenVPN\easy-rsa\tls-crypt.key
</tls-crypt>

В строке:

remote vpn.example.com 1194

Замените vpn.example.com на публичный IP-адрес или DNS-имя вашего интернет-канала (маршрутизатора, через который опубликован OpenVPN).

Откройте каждый файл обычным Блокнотом, полностью скопируйте его содержимое и вставьте между соответствующими тегами.

Например, внутри блока <ca> должны находиться строки от:

-----BEGIN CERTIFICATE-----

до:

-----END CERTIFICATE-----

Каждый блок должен содержать полное содержимое соответствующего файла, включая строки BEGIN и END.

После заполнения сохраните профиль:

C:\OpenVPN\test1.ovpn

12. Запускаем сервер и читаем журнал

Перезапускаем службу:

Restart-Service OpenVPNService -Force

Ждём примерно 15 секунд.

Проверяем службу через:

services.msc

Состояние OpenVPNService должно быть:

Выполняется

Проверяем журнал:

C:\ProgramData\OpenVPN\Log\server.log

Открываем его Блокнотом и ищем строку:

Initialization Sequence Completed

Эта строка означает, что сервер прочитал конфигурацию, создал VPN-интерфейс и начал слушать порт.

Если служба остановилась или этой строки нет, смотрим последние строки server.log. Обычно там прямо указан неверный путь, параметр или отсутствующий файл.


13. Настраиваем маршрутизатор

В качестве маршрутизатора в этой статье используется MikroTik. Если у вас маршрутизатор другого производителя, необходимо выполнить аналогичные настройки средствами вашего оборудования.

В любом случае требуется выполнить две задачи:

  • перенаправить входящие UDP-подключения на порт 1194 на сервер OpenVPN;
  • добавить маршрут до VPN-подсети через сервер OpenVPN.

Для MikroTik эти настройки выглядят следующим образом.

Перенаправляем входящие подключения UDP 1194 на Windows Server:

/ip firewall nat add chain=dstnat protocol=udp dst-port=1194 action=dst-nat to-addresses=192.168.10.10 to-ports=1194 comment="OpenVPN UDP 1194"

Замените 192.168.10.10 на локальный IP-адрес вашего сервера OpenVPN.

Добавляем маршрут до VPN-подсети:

/ip route add dst-address=192.168.254.0/24 gateway=192.168.10.10 comment="OpenVPN clients"

Без этого маршрута устройства локальной сети не смогут отправлять ответный трафик VPN-клиентам.


14. Устанавливаем клиент и проверяем подключение

Важно. Первый тест рекомендуется выполнять из внешней сети. Проверка из той же локальной сети через публичный IP-адрес может не работать из-за настроек маршрутизатора (NAT Loopback/Hairpin NAT).

Проще всего выполнить первый тест с телефона через мобильный Интернет.

На телефоне

  1. Установите OpenVPN Connect.
  2. Передайте на телефон файл test1.ovpn.
  3. Откройте файл через OpenVPN Connect.
  4. Подтвердите импорт профиля.
  5. Отключите Wi-Fi, чтобы телефон использовал мобильный Интернет.
  6. Нажмите подключение.
  7. Разрешите создание VPN-подключения.

После подключения в OpenVPN Connect не должно быть ошибок проверки сертификата или tls-crypt.

На Windows

  1. Установите OpenVPN Connect.
  2. Откройте программу.
  3. Выберите импорт профиля из файла.
  4. Укажите test1.ovpn.
  5. Подключитесь из сети, которая не является локальной сетью сервера.

Что проверять после подключения

Сначала проверяем сам VPN-интерфейс сервера:

ping 192.168.254.1

Потом локальный адрес Windows Server:

ping 192.168.10.10

Затем проверяем адрес шлюза локальной сети. В нашем примере это MikroTik:

ping 192.168.10.1

Потом любой разрешённый компьютер локальной сети:

ping 192.168.10.20

После этого проверяем DNS:

ping internal-server.example.local

И только затем проверяем нужный прикладной доступ, например RDP:

mstsc

Вводим имя или адрес компьютера локальной сети.

Порядок проверки важен:

  1. 192.168.254.1 — работает сам VPN;
  2. адрес Windows Server — работает маршрутизация до локального интерфейса сервера;
  3. адрес MikroTik — работает выход из VPN в локальную сеть;
  4. другой компьютер — работает обратный маршрут;
  5. DNS-имя — клиент получил и использует внутренний DNS;
  6. RDP или другой сервис — работает конечное приложение.

Если VPN подключается, но пинги в локальную сеть не проходят, проверьте:

  • перезагружался ли Windows Server после изменения IPEnableRouter;
  • есть ли на MikroTik маршрут к 192.168.254.0/24;
  • указан ли в server.ovpn правильный маршрут локальной сети;
  • разрешает ли брандмауэр целевого компьютера обращения из 192.168.254.0/24;
  • не пересекается ли локальная сеть клиента с локальной сетью офиса.

15. Резервная копия

После завершения настройки рекомендуется сразу сделать резервную копию следующих файлов и каталогов:

C:\OpenVPN\config-auto\server.ovpn
C:\OpenVPN\easy-rsa\pki
C:\OpenVPN\easy-rsa\tls-crypt.key

Именно эти файлы и каталоги являются основой вашего VPN-сервера.

Каталог pki содержит центр сертификации (CA), закрытые ключи, серверные и клиентские сертификаты, а также список отозванных сертификатов (CRL).

Файл tls-crypt.key используется одновременно сервером и всеми клиентами для защиты служебного обмена OpenVPN.

Файл server.ovpn содержит всю конфигурацию сервера.

При потере каталога pki вы больше не сможете выпускать новые клиентские сертификаты, отзывать существующие и обновлять список CRL.

При потере tls-crypt.key все клиентские профили придётся выпустить заново.

При потере server.ovpn сервер не сможет запуститься с прежней конфигурацией.

Не храните резервную копию на этом же VPN-сервере. Сохраните её на другом сервере, NAS или внешнем носителе.

После создания резервной копии временный каталог C:\OpenVPN-Deploy, использовавшийся только для установки OpenVPN, можно удалить. Дальнейшая работа с OpenVPN выполняется уже из каталога C:\OpenVPN.


На этом первоначальная настройка OpenVPN завершена.

В дальнейшем администратору обычно приходится выпускать новые клиентские сертификаты, отзывать скомпрометированные сертификаты, обновлять список отозванных сертификатов (CRL) и сопровождать работающий VPN-сервер.

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