Настройка OpenVPN на Windows Server 2012 R2

Настройка OpenVPN на Windows Server 2012 R2

Настройка OpenVPN на Windows Server 2012 R2Дано: Сервер с установленной Windows Server 2012 R2, в интернет смотрит через роутер (NAT)

Задача: Сделать безопасный доступ к серверу из интернета

Для реализации выбрал OpenVPN. Он обеспечит большую безопасность чем RDP проброшенный через NAT. Мы сделаем авторизацию по сертификатам, без них никто не сможет подключиться.

Установка OpenVPN

Последняя версия из Cummunity 2.3.2 оказалась не рабочая из-за криво собранного билда OpenSSL, не правильно генерируются сертификаты.
Берем версию OpenVPN 2.1 rc 22
Далее запускаем инсталятор, выбираем все пункты для установки, соглашаемся с установкой не подписанных драйверов на сетевую карту.

Формирование сертификатов и ключей

Нажимаем Win+R, пишем в строку — cmd. Переходим в каталог OpenVPN:

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

Для Windows x64:

cd C:\Program Files(x86)\OpenVPN\easy-rsa

В этой папке BAT скрипты для генерации ключей. Все команды нужно выполнять, находясь в этой директории, не закрывая окно команд.
Перед каждой командой, кроме init-config.bat, нужно выполнить vars.bat.

  • init-config.bat — начальная инициализация, создаст файлы vars.bat и openssl.cnf
    В файле vars.bat надо установить ВСЕ параметры
set HOME=%ProgramFiles%\OpenVPN\easy-rsa
set KEY_CONFIG=openssl.cnf
set KEY_DIR=keys # путь к папке ключей относительно текущей (..\easy-rsa)
set KEY_SIZE=1024
set KEY_COUNTRY=RU
set KEY_PROVINCE=SZ
set KEY_CITY=Saint-Peterburg
set KEY_ORG=ordinatus
set KEY_EMAIL=zz@zzz.zz
  • vars.bat
  • clean-all.bat # очистка и инициализация папки ключей

Создание master Certificate Authority (CA) certificate & key, выполняется 1 раз

  • vars.bat
  • build-ca.bat # генерация сертификата и ключа — ca.crt, ca.key

Генерация сертификата и ключа для сервера, выполняется 1 раз

  • vars.bat
  • build-key-server ServerName # ServerName — имя сервера. На некоторые доп вопросы можно ответить 2 раза «пусто», на 2 последних — «y»:
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    В результате будет создан ключ ServerName.key, сертификат ServerName.crt, запрос Certificate Signing Request (CSR) ServerName.csr, ?непонятный файл? 01.pem (копия ServerName.csr)

Генерация Diffie Hellman parameters, выполняется 1 раз, нужно только для tls-server

  • vars.bat
  • build-dh # создает файл dh1024.pem

Генерация сертификатов и ключей клиентов:

  • vars.bat
  • build-key client1
  • build-key client2
  • build-key client3 # clientX — название ключа для клиента

ВАЖНО!!! В вопросе «Common Name (eg, your name or your server’s hostname) []:» нужно для каждого ключа указывать УНИКАЛЬНОЕ имя, например, client1, и т.д.
В результате будет создан ключ client1.key, сертификат client1.crt, запрос Certificate Signing Request (CSR) client1.csr, ?непонятный файл? 02.pem (копия client1.csr)

В Итоге:

Ключи *.key # секретная информация, должны распространяться ТОЛЬКО ПО СЕКРЕТНЫМ КАНАЛАМ. Нужны только на соотв. хостах.
сертификаты *.crt # несекретная информация.
запросы серт. *.csr # Certificate Signing Request, нужны для распределённой генерации и сертификации ключей.
dh1024.pem # Diffie Hellman parameters

Вместо использования на клиентах 3-х раздельных файлов (ca, cert, key) можно использовать единый файл формата PKCS12. Для этого надо генерировать ключ клиента командой:
build-key-pkcs12 client1
Будет создан и обычный комплект файлов, и новый файл .p12 — это и есть этот комбинированный файл. Его можно использовать в конфиге клиента одной командой pkcs12 вместо трёх команд ca, cert, key.
Также при генерации этому файлу можно задать пароль для защиты секретного ключа, в таком случае каждый раз при установке соединения будет запрашиваться пароль для доступа к секретному ключу (Внимание! Так нельзя делать при запуске сервиса, т.к. он не сможет запросить пароль и не сможет установить соединение). Следует также иметь ввиду, что пользователь имеет право самостоятельно изменить/удалить/установить пароль защиты секретного ключа.

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

  • vars.bat
  • revoke-full client1
    Будет сгенерирован файл crl.pem в каталоге keys, этот файл и должен быть параметром инструкции «crl-verify crl.pem». Этот файл несекретный, но от несанкционированных изменений должен быть защищён. После отзыва можно сгенерировать новый ключ с тем же CN-именем (Common Name).

Конфигурация сервера

В папке /config/ создаем текстовый документ, server.ovpn со следующим содержимым:

port 1194
# на сайте разработчиков рекомендуется использовать udp в том числе
# по соображениям безопасности, но для нормальной работы удаленной 
# печати, рекомендую использовать tcp
proto tcp
dev tun0
ca "C:\\Program Files (x86)\\OpenVPN\\easy-rsa\\keys\\ca.crt"
cert "C:\\Program Files (x86)\\OpenVPN\\easy-rsa\\keys\\Server.crt"
key "C:\\Program Files (x86)\\OpenVPN\\easy-rsa\\keys\\Server.key" # Этот файл хранить в секрете!
dh "C:\\Program Files (x86)\\OpenVPN\\easy-rsa\\keys\\dh1024.pem"
# включаем TLS аутификацию
# tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
# tls-auth "ta.key" 0
# таймаут до реконекта 
tls-timeout 120
# задаем IP-адрес сервера и маску подсети
server 10.10.10.0 255.255.255.0

# разрешаем использовать одинаковые ключи
duplicate-cn
# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть за OpenVPN сервером (сеть 192.168.0.0/24)
push "route 192.168.0.0 255.255.255.0"
# удерживать соединение (полезно при работе через nat, proxy и т.п.)
keepalive 10 120
# включаем шифрацию пакетов
cipher BF-CBC
# включить сжатие
comp-lzo
# максимум клиентов
max-clients 10
# Не перечитывать ключи после получения
persist-key
# Не закрывать и переоткрывать TUNTAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun
# клиенты могут "видеть" друг друга
client-to-client
status "C:\\Program Files (x86)\\OpenVPN\\log\\openvpn-status.log"
#log "C:\\Program Files (x86)\\OpenVPN\\log\\openvpn.log"
#log-append "C:\\Program Files (x86)\\OpenVPN\\log\\openvpn.log"
# уровень детализации отчетов
verb 3

Сохраняем, закрываем, жмем на него правой кнопкой мыши и выбираем «Start with OpenVPN» или можно запустить OpenVPN GUI.

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