OpenVPN сервер на Windows: как настроить

OpenVPN сервер на Windows: как настроить OpenVpn Server

В этой статье кратко и без лишнего описано, то, как быстро настроить OpenVPN сервер в Windows и сконфигурировать OpenVPN клиента.

Бывает необходимо построить защищенную, шифрованную связь между компьютерами без лишних затрат на оборудование и ПО.

В этом поможет такая бесплатная и известная программа, как OpenVPN - свободная реализация технологии виртуальной частной сети (VPN).

Установка OpenVPN Server на Windows

  • Качаем инсталлятор OpenVPN: openvpn.net/index.php/open-source/downloads
  • Устанавливаем: обязательно отметьте все пункты птичками, на предложение установить драйвер отвечаем утвердительно.

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

  • Запускаем консоль (командную строку) из под администратора
  • Переходим в папку куда установили OpenVPN: cd "C:\Program Files\OpenVPN\easy-rsa"
  • Запускаем: init-config.bat
  • В папке "C:\Program Files\OpenVPN\easy-rsa" появится файл vars.bat, открываем его в блокноте.

Вот содержимое файла, которое вышло у меня:

@echo off
rem Edit this variable to point to
rem the openssl.cnf file included
rem with easy-rsa.

set HOME=%ProgramFiles%\OpenVPN\easy-rsa
set KEY_CONFIG=openssl-1.0.0.cnf

rem Edit this variable to point to
rem your soon-to-be-created key
rem directory.
rem
rem WARNING: clean-all will do
rem a rm -rf on this directory
rem so make sure you define
rem it correctly!
set KEY_DIR=keys

rem Increase this to 2048 if you
rem are paranoid. This will slow
rem down TLS negotiation performance
rem as well as the one-time DH parms
rem generation process.
set KEY_SIZE=1024

rem These are the default values for fields
rem which will be placed in the certificate.
rem Change these to reflect your site.
rem Don't leave any of these parms blank.

set KEY_COUNTRY=UA
set KEY_PROVINCE=Kiev
set KEY_CITY=Kiev
set KEY_ORG=OpenVPN
set KEY_EMAIL=elims@pochta.com
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=ouou
set PKCS11_MODULE_PATH=changeme
set PKCS11_PIN=1234

 

В следующих строках указал вот такие данные:

set KEY_COUNTRY=UA
set KEY_PROVINCE=Kiev
set KEY_CITY=Kiev
set KEY_ORG=OpenVPN
set KEY_EMAIL=elims@pochta.com
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=ouou

Укажите что-либо свое, в строках где есть "server" ничего не меняйте.

В этой же папке открываем файл "openssl-1.0.0.cnf" и ищем строчку default_days 365, ставим 3650: теперь сертификаты будут действительны на протяжении 10 лет.

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

  • cd "C:\Program Files\OpenVPN\easy-rsa"
  • vars
  • clean-all - в ответ должно написать два раза «Скопировано файлов: 1». Значит, все хорошо
  • build-dh - создаст ключ Диффи-Хельмана.
  • build-ca - создаст основной сертификат. Будут заданы вопросы, просто нажимаем Enter пока работа команды не завершится.
  • build-key-server server - опять таки будут вопросы: жмем Enter, когда увидим два вопроса «Sign the certificate?» и «1 out of 1 certificate requests certified, commit?», жмем Y. Сертификаты для сервера созданы.
  • build-key client - создаем сертификат клиента.
    • Жмем Enter, но...
    • При вопросе Common Name (eg, your name or your server's hostname) нужно ввести client.
    • В конце также два раза Y.
    • Для каждого клиента создается новый сертификат, только с другим именем, например, build-key client1 и также указывать его в common name.
  • Из папки C:\OpenVPN\easy-rsa\keys копируем файлы: ca.crt, dh1024.pem, server.crt, server.key в папку C:\OpenVPN\config.

Создаем конфигурационные файлы для OpenVPN

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

В папке "C:\Program Files\OpenVPN\config", создаем текстовой документ server.ovpn - это будет конфиг сервера, вставляем в файл текст:

dev tun # Поднимаем L3-туннель
proto udp # Протокол
port 12345 # Порт который слушает впн
# Ключи и сертификаты:
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
topology subnet # Грубо говоря экономим адреса
server 10.9.0.0 255.255.255.0 # Пул адресов
cipher AES-128-CBC # Метод шифрования
comp-lzo # Сжатие
mssfix # Немного улучшит пинг
keepalive 10 120 # Время жизни клиентов, если не откликнулся — отключает
verb 3 # Уровень отладки

Пробуем запустить сервер: Кликаем на рабочем столе по ярлыку OpenVPN Gui или запускаем файл "C:\Program Files\OpenVPN\bin\openvpn-gui.exe".

В панели задач возле к появится серый значок, кликаем по нему дважды, если через 10-20 секунд он загорелся зеленым, значит, все хорошо, если нет, тогда смотрим лог в папке log.

Конфигурация клиента OpenVPN

На компьютере клиента тоже устанавливаем OpenVPN, все галочки можно не отмечать.

Копируем из папки "C:\Program Files\OpenVPN\easy-rsa" на компьютере с сервером файлы:

  • ca.crt
  • client.crt
  • client.key

на компьютер с OpenVPN клиентом в папку C:\Program Files\OpenVPN\config. В этой же папке создаем файл client.ovpn, в котором прописываем:

client
dev tun
proto udp
remote АДРЕС_СЕРВЕРА 12345 # Адрес и порт сервера
ca ca.crt
cert client.crt
key client.key
cipher AES-128-CBC
nobind
comp-lzo
persist-key
persist-tun
verb 3

На клиентском компьютере запускаем OpenVPN Gui или client.ovpn.

Если подключились, пробуем проверить связь: в командной строке набираем ping 10.9.0.1. Если пинг проходит, значит все настроено верно.

На OpenVPN сервере можно настроить автоматический запуск OpenVPN службы:

  • переходим в Панель Управления - Администрирование - Службы
  • Ищем OpenVPN Service и выставляем тип запуска "Автоматически"

Ошибка "WARNING: can't open config file: /etc/ssl/openssl.cnf "

Если при попытке создать сертификат для OpenVpn вы видите эту ошибку, то скорее всего вы не запустили перед этим действием bat-файл OpenVPN\easy-rsa\vars.bat.

Описание команд и параметров OpenVPN

Команды без -- (двумя знаками дефиса) перед командой должны быть использованы в конфигурационном файле, команды с -- в начале используются только из командной строки.

  • remote < host > - определяет удаленный конец туннеля. Могут использоваться записи IP и DNS.
  • local < host > - определяет локальный ip или имя хоста, на котором будет работать OpenVPN. Актуально, если на локальной машине несколько адресов.
  • dev < device > - определяет какой использовать тип устройства tun или tap. Например: dev tun или dev tap. Так же можно явно указывать номер виртуального интрефейса, например tun0.
  • port < port number > - указывает на каком порту будет работать OpenVPN (локально и удаленно).
  • proto < proto > - какой протокол будет использоваться. Возможные значения: udp, tcp, tcp-client, tcp-server.
    • tcp-client - сам пытается установить соединение
    • tcp-server - только ждет подключений
    • Использование протокола udp VPN будет работать чуть быстрее, чем tcp. Но в плане стабильности работы лучше выбирать tcp (как показывает практика, VPN-соединение более устойчиво)
  • remote-random - если указана данная опция и в random перечисленно несколько удаленных хостов, то OpenVPN в случайном порядке будет к ним подключаться. Применяется для балансировки нагрузки.
  • float - позволяет удаленному хосту изменять IP во время работы туннеля. Соединение при этом не разрывается.
  • ipchange < cmd > - выполняет скрипт или команду указанную в < cmd >, если IP сменился. Пример: ipchange script-ip.sh
  • connect-retry < seconds > - пробует переподключиться через указанное время в секундах, если соединение было разорвано.
  • connect-retry-max < n > - максимальное количество повторов если соединение было разорвано
  • resolv-retry < seconds > - если OpenVPN не удалось узнать имя удаленного хоста по DNS, то через указанное количество секунд попытаться переподключиться.
  • lport < port > - указывает на локальный порт для использования OpenVPN
  • rport < port > - аналогично для удаленного порта. Пример: rport 8000 - OpenVPN будет пытаться подключится к удаленному порту 8000
  • nobind - использовать динамический порт для подключения (только для клиента)
  • shaper < bytes > - указывает скорость передачи данных в байтах для исходящего трафика (только для клиента)
  • tun-mtu < mtu size > - устанавливает максимальный размер MTU. По умолчанию tun-mtu равен 1500. Использование: tun-mtu 1200
  • dev-node < interface name > - устанавливает имя виртуального интерфейса. Например: dev-node openvpn1
  • ifconfig - устанавливает локальный IP и маску подсети для туннельного интерфейса. Например: ifconfig 10.3.0.1 255.255.255.0
  • server < network > < mask > - автоматически присваивает адреса всем клиентам (DHCP) в указанном диапазоне с маской сети. Данная опция заменяет ifconfig и может работать только с TLS-клиентами в режиме TUN, соответственно использование сертификатов обязательно. Например: server 10.3.0.0 255.255.255.0 . Подключившиеся клиенты получат адреса в диапазоне между 10.3.0.1 и 10.3.0.254.
  • server-bridge < gateway > < mask > < pool > - сервер в режиме моста для TAP устройств. Пример: server bridge 10.3.0.1 255.255.255.0 10.3.0.128 10.3.0.254 Клиентам будут выданы адреса в диапазоне 10.3.0.128 - 10.3.0.254, в качестве шлюза будет указан 10.3.0.1.
  • mode server - переключает OpenVPN в режим сервера (начиная с 2-й версии)
  • mode p2p - данная опция идет по умолчанию.

Опции в режиме сервера

  • push < options > - передача клиенту конфигурационных параметров. Пример: push "route 192.168.0.0 255.255.255.0". Аналогично с помощью push клиенту могут передаваться следующие параметры: route, route-gateway, route-delay, redirect-gateway, inactive, ping, ping-exit, ping-restart, persist-key, persist-tun, comp-lzo, dhcp-option, ip-win32.  Последние две опции применимы только для Window-клиентов. Например передадим Windows-клиенту адрес DNS-сервера 11.11.11.11: push "dhcp-option DNS 11.11.11.11"
  • ifconfig-pool-persist ipp.txt - в файле ipp.txt назначаем клиентам статические IP-адреса. В файле в каждой строке пишем "название_сертификата,айпи_адрес", например: "demyanovich,172.16.25.10"
  • comp-lzo - параметр сжатия трафика, идущего через виртуальный туннель. Может принимать значения yes, no, adaptive. Последнее используется по умолчанию.
    • comp-lzo yes - принудительно включить сжатие
    • comp-lzo no - принудительно отключить сжатие
    • comp-lzo adaptive - адаптивный режим.

Команды и параметры при работе с сертификатами x509 и параметрами шифрования

  • cipher < alg > - указываем алгоритм шифрования. Например: cipher AES-256-CBC. Рекомендуется использование шифров в режиме CBC (Cipher Block Chaining).
  • keysize < n > - размер ключа в битах. Например: keysize 128
  • auth < alg > - алгоритм хэширования. Пример: auth SHA1
  • df < file > - файл с ключем Диффи-Хелмана
  • ca < file > - файл сертификата для CA
  • cert < file > - сертификат локальной машины
  • key < file > - локальный ключ машины
  • tls-server - явно указывает, что данный хост является tls-server
  • tls-client - соответственно tls-client
  • pkcs12 < file > - указываем файл (PKCS12), который содержит в себе сертификат, ключ и CA в одном файле. Пример: pkcs12 /file
  • crl-verify < file > - список отозванных сертификатов, т.е. blacklist.
  • no-replay - отключает защиту OpenVPN от атаки повторного воспроизведения (replay attack). Крайне не рекомендуется отключать!
  • no-iv - отключает использование вектора инициализации шифра (IV). Крайне не рекомендуется отключать!
  • secret < file > - включает режим шифрования и аутентификации на статических ключах. В качестве параметра использует заранее сгенерированный, командой --genkey, файл. Например: secret key.txt
  • Все доступные алгоритмы шифрования можно просмотреть выполнив из командной строки: openvpn --show-ciphers
  • Алгоритмы хэширования: openvpn --show-digests
  • Показать все доступные TLS-шифры (TLS используется только для шифрования канала управления): openvpn --show-tls
  • Показать все доступные крипто-устройства в системе (если такие имеются): openvpn --show-engines

Команды для управления маршрутизацией

Обозначение: VPN-хост - удаленная сторона (удаленный хост)

  • route < network > - устанавливает указанную маршрутизацию на VPN-хосте, после успешного запуска туннеля. Пример: route 10.0.10.0 255.255.255.252
  • route-gateway < IP > - устанавливает шлюз на VPN-хосте. Пример: route-gateway 192.168.0.22. После успешного запуска виртуального туннеля клиенту будет задан шлюз 192.168.0.22
  • route-delay < seconds > - указывает подождать n-секунд перед установкой маршрутов. Пример: route-delay 5 - через 5 секунд после установки туннеля будут заданы маршруты.
  • route-up < cmd > - выполнить скрипт или программу < cmd > после установки маршрутов. Пример: route-up /script.sh
  • redirect-gateway - установить шлюзом по умолчанию удаленный сервер. Т.е. когда удаленный пользователь подключается к нашему серверу, то ему будет задан шлюз по умолчанию на наш сервер.

Команды для управления туннелем

  • ping < seconds > - указывает отсылать ping на удаленный конец тунеля после указанных n-секунд, если по туннелю не передавался никакой трафик. Пример:
    ping 10
  • ping-restart < seconds > - если за указанное время не было получено ни одного пакета с удаленной стороны, то перезапускать туннель. Пример: ping-restart 60 - если в течении 60 секунд не было получено ни одного пакета, то туннель будет перезапущен.
  • ping-timer-rem - позволяет перезапускать туннель, только когда указан удаленный адрес.
  • persist-tun - данная опция оставляет без изменения устройства tun/tap при перезапуске OpenVPN.
  • persist-key - указывает не перечитавать файлы ключей при перезапуске туннеля.
  • resolv-retry < seconds > - устанавливает время в секундах для запроса об удаленном имени хоста. Актуально только если используется DNS-имя удаленного хоста. Пример: resolv-retry 86400
  • inactive < seconds > - после n-секунд неактивности устройство TUN/TAP автоматически отключется. Пример: inactive 120
  • ping-exit < seconds > - если за указанные n-секунд не было получено ни одного пакета, то отключать OpenVPN. Пример: ping-exit 120
  • keepalive < seconds > < seconds > - является совмещением сразу двух команд - ping и ping-restart. Использует сразу два параметра в секундах, перечисленных через пробел. Пример: keepalive 10 180 - каждые 10 секунд посылать ping на удаленный хост, и, если за 180 секунд не было получено ни одного пакета - то перезапускать туннель.
  • persist-local-ip < IP > - оставлять неизменными локальный IP адрес и номер порт, если туннель был перезапущен.
  • persist-remote-ip < IP > - оставлять неизменными удаленный IP адрес и номер порт, если туннель был перезапущен. persist-remote-ip 192.168.50.1

Методы аутентификации

  • auth-user-pass-verify < script > < method > - указывается только на серверной стороне.
    • < script > - путь к скрипту, который будет производить авторизацию. Скрипт должен возвращать 0 если авторизация успешна, и соответственно, 1 если авторизация не успешна.
    • < method > - метод авторизации, может быть двух типов: via-env и via-file
  • auth-user-pass < file >- указывается на клиентской стороне. Параметр не обязателен, если он отсутствует то будет предложено ввести пару логин/пароль. должен содержать имя пользователя и пароль в двух строчках: username и password
  • client-cert-not-required - отключает авторизацию по сертификатам

Работа с прокси

OpenVPN без проблем может работать через http и socks прокси.

  • http-proxy < server port [auth] > - указываем адрес и порт прокси-сервера. http-proxy 192.168.0.12 8080
  • Если требуется авторизация на прокси-сервере: http-proxy < server port authfile > - где authfile - файл содержащий две строки (имя пользователя и пароль) или stdin (будет запрошено имя пользователя и пароль). Так же после authfile требуется указать метод авторизации. Можно оставить auto для автоматического выбора метода авторизации или указать явно через auth-method. auth-method может быть трех видов "none", "basic" или "ntlm".
  • http-proxy-retry - переподключаться, если соединение было разорвано.
  • http-proxy-timeout < seconds > - считать соединение с прокси-сервером разорванным после n-секунд неактивности. Например: http-proxy-timeout 5
  • socks-proxy < server port > - указываем сокс-прокси сервер. Пример: socks-proxy 192.168.0.12 8080
  • socks-proxy-retry - переподключаться, если соединение было разорвано.
  • auto-proxy - автоматически определять прокси-сервер.

Скриптинг

  • up < command >- выполнить команду после запуска устройства TUN/TAP. Пример: up script-up.sh
  • up-delay < seconds > - подождать n-секунд перед запуском команды указанной в up. Пример: up-delay 5
  • down < command > - выполнить команду когда интерфейс TUN/TAP выключится. Пример: down script-down.sh
  • down-pre - выполнить команду, указанную в down перед выключением интерфейса TUN/TAP
  • up-restart < command > - выполнить команду после каждого реконнекта
  • route-up < command > - выполнить команду после установки сетевых маршрутов. Пример: route-up script.sh
  • learn-address < command > - выполнить указанную команду, если ip удаленной стороны изменился.
  • ipchange < command > - выполнить команду, если ip сервера изменился.
  • client-connect < command > - выполнить команду, когда клиент подключился.
  • client-disconnect < command > - выполнить команду, когда клиент отключился.

Команды отладки и поиска неисправностей

  • verb < verbosity level > - устанавливает уровень информативности отладочных сообщений. Может принимать параметр от 0 до 11. По умолчанию verb равен 1.
    При уровне verb 5 и выше в логе будут встречаться подобные записи: RwrW. R (read), W (write) - соответственно чтение и запись. Большая буква обозначает, что пакет был считан (R) или записан (W) на виртуальном устройстве TUN/TAP, а маленькие - считан (r) и записан (w) в туннеле.
  • mute < number of messages > - если значение установлено в 10, то в лог будет записываться только по 10 сообщений из одной категории.
  • log < file > - указываем лог-файл. Если данный параметр не указан, то весь вывод openvpn будет производиться в stdout.
  • log-append < file > - дописывать сообщения в лог-файл, а не перезаписывать.
  • status < file > - указывает путь к статус-файлу, в котором содержится информация о текущих соединениях и информация о интерфейсах TUN/TAP.

Чем отличаются виртуальные устройства tun и tap?

  • TUN - туннель, соединение по которому указывается по типу: локальный IP < --- > удаленный IP. Например, при явном указании ifconfig: --ifconfig 10.3.0.2 10.3.0.1. В этом примере 10.3.0.2 - локальный IP, 10.3.0.1 - удаленный IP
  • TAP - эмулирует виртуальную ethernet карточку, для которой требуется указывать локальный IP и маску подсети. Например: --ifconfig 10.3.0.2 255.255.255.0

Полезные ссылки:

Понравилось? =) Поделись с друзьями:

Обсуждение записи “OpenVPN сервер на Windows: как настроить”

  1. solaris says:

    Укажите версию Windows на которой это все настраивалось.

  2. Владимир Демянович (elims.org.ua) says:

    windows 7 pro, если память не подводит

  3. Инна says:

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

Обсудить