Настройка доступа к локальной сети клиентам openvpn в windows

Инструкция по установке и настройке OpenVPN Server на операционную систему Windows. Настройка клиента, доступ к локальной сети.

Обновлено Обновлено: 04.01.2023
Опубликовано Опубликовано: 25.01.2017

OpenVPN позволяет настроить VPN-сервер как на платформе Windows Server, так и версии для рабочего компьютера (Windows 10, 8, 7).

Установка сервера
Создание сертификатов
Настройка OpenVPN
Настройка клиента
Доступ к локальной сети
Решение проблем

Установка OpenVPN Server

Переходим на официальный сайт OpenVPN и скачиваем последнюю версию программы для соответствующей версии Windows:

Скачиваем OpenVPN для Windows

Запускаем скачанный файл — нажимаем NextI Agree — и выставляем галочку EasyRSA 2/3 Certificate Management Scripts (нужен для возможности сгенерировать сертификаты):

Во время установки, ставим галочку EasyRSA 2 Certificate Management Scripts

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

… снова Next и Install — начнется установка. В процессе мастер может выдать запрос на подтверждение установки виртуального сетевого адаптера — соглашаемся (Install/Установить).

После завершения нажимаем Next — снимаем галочку Show ReadmeFinish.

Создание сертификатов

Новая версия OpenVPN позволяет создавать сертификаты на основе Easy RSA 3, старая работает на базе 2-й версии. Наши действия будут различаться в зависимости от данной версии. Рассмотрим процесс формирования сертификата с использованием как RSA3, так и RSA2.

а) Создание сертификатов с RSA 3

1. Переходим в папку установки OpenVPN (по умолчанию, C:Program FilesOpenVPN) и создаем каталог ssl.

2. После переходим в папку C:Program FilesOpenVPNeasy-rsa, переименовываем файл vars.example в vars, открываем его на редактирование и правим одну строку:

set_var EASYRSA_TEMP_DIR «$EASYRSA_PKI/temp»

* мы снимаем комментарий и добавляем temp в конце $EASYRSA_PKI. Если это не сделать, то при попытке сформировать корневого сертификата мы получим ошибку Failed create CA private key.

3. Запускаем командную строку от имени администратора:

Запуск командной строки от имени администратора

4. Переходим в каталог easy-rsa:

cd %ProgramFiles%OpenVPNeasy-rsa

5. Запускаем команду:

EasyRSA-Start.bat

Мы окажемся в среде EasyRSA Shell.

6. Инициализируем PKI:

./easyrsa init-pki

Если система вернет ошибку, выходим из оболочки EasyRSA Shell:

exit

И заходим снова:

EasyRSA-Start.bat

Мы должны увидеть:

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

7. Генерируем корневой сертификат (CA):

./easyrsa build-ca

… после ввода Enter обязательно задаем пароль дважды. На запрос ввести Common Name можно просто нажать ввод или написать свое имя:

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

8. Создаем ключ Диффи-Хеллмана:

./easyrsa gen-dh

9. Для создания сертификата сервера необходимо сначала создать файл запроса:

./easyrsa gen-req cert nopass

* на запрос ввода Common Name просто вводим Enter.

… и на его основе — сам сертификат:

./easyrsa sign-req server cert

После ввода команды подтверждаем правильность данных, введя yes:

  Confirm request details: yes

… и вводим пароль, который указывали при создании корневого сертификата.

10. Сертификаты сервера готовы и находятся в каталоге pki. Переносим в C:Program FilesOpenVPNssl следующие файлы:

  • ca.crt
  • issued/cert.crt
  • private/cert.key
  • dh.pem

б) Создание сертификатов с RSA 2 (для старых версий OpenVPN)

1. Переходим в папку установки OpenVPN (по умолчанию, C:Program FilesOpenVPN) и создаем каталог ssl.

2. После переходим в папку C:Program FilesOpenVPNeasy-rsa, создаем файл vars.bat, открываем его на редактирование и приводим к следующему виду:

set «PATH=%PATH%;%ProgramFiles%OpenVPNbin»
set HOME=%ProgramFiles%OpenVPNeasy-rsa
set KEY_CONFIG=openssl-1.0.0.cnf
set KEY_DIR=keys
set KEY_SIZE=2048
set KEY_COUNTRY=RU
set KEY_PROVINCE=Sankt-Petersburg
set KEY_CITY=Sankt-Petersburg
set KEY_ORG=Organization
set KEY_EMAIL=master@dmosk.ru
set KEY_CN=DMOSK
set KEY_OU=DMOSK
set KEY_NAME=server.domain.ru
set PKCS11_MODULE_PATH=DMOSK
set PKCS11_PIN=12345678

* в каталоге easy-rsa уже есть файл vars.bat.sample — можно переименовать и использовать его.
** значение HOME не меняем, если оставили путь установки программы по умолчанию; KEY_DIR — каталог, куда будут генерироваться сертификаты; KEY_CONFIG может быть разным — его лучше посмотреть в файле vars.bat.sample или по названию соответствующего файла в папке easy-rsa; KEY_NAME желательно, чтобы соответствовал полному имени VPN-сервера; остальные опции можно заполнить произвольно.

3. Запускаем командную строку от имени администратора:

Запуск командной строки от имени администратора

4. Переходим в каталог easy-rsa:

cd %ProgramFiles%OpenVPNeasy-rsa

4. Запускаем vars.bat:

vars.bat

5. Чистим каталоги от устаревшей информации:

clean-all.bat

* данная команда выполняется один раз, когда на сервере нет информации по ранее созданным сертификатам.

6. Снова запускаем vars.bat (после clean переопределяются некоторые переменные):

vars.bat

Переходим к созданию ключей.

7. Генерируем последовательность центра сертификации:

build-ca.bat

На все запросы нажимаем Enter.

8. Запускаем build-dh.bat (сертификат с использованием алгоритма Диффи-Хеллмана):

openssl dhparam -out keysdh.pem 2048

* команда может выполняться долго — это нормально.

9. Генерируем сертификат для сервера:

build-key-server.bat cert

* где cert — имя сертификата; на все запросы нажимаем Enter. В конце подтверждаем два раза корректность информации вводом y.

10. После переносим из папки C:Program FilesOpenVPNeasy-rsakeys в C:Program FilesOpenVPNssl следующие файлы:

  • ca.crt
  • cert.crt
  • cert.key
  • dh.pem

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

Переходим в папку C:Program FilesOpenVPNconfig-auto (или для старой версии C:Program FilesOpenVPNconfig) и создаем файл server.ovpn. Открываем его на редактирование и приводим к следующему виду:

port 443
proto udp
dev tun
dev-node «VPN Server»
dh «C:\Program Files\OpenVPN\ssl\dh.pem»
ca «C:\Program Files\OpenVPN\ssl\ca.crt»
cert «C:\Program Files\OpenVPN\ssl\cert.crt»
key «C:\Program Files\OpenVPN\ssl\cert.key»
server 172.16.10.0 255.255.255.0
max-clients 32
keepalive 10 120
client-to-client
compress
fast-io
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

* где port — сетевой порт (443 позволит избежать проблем при использовании Интернета в общественных местах, но может быть любым из свободных, например 1194, занятые порты в Windows можно посмотреть командой netstat -a); dev-node — название сетевого интерфейса; server — подсеть, в которой будут работать как сам сервер, так и подключенные к нему клиенты.
** так как в некоторых путях есть пробелы, параметр заносится в кавычках.
*** при использовании другого порта необходимо проверить, что он открыт в брандмауэре или на время тестирования отключить его.

В сетевых подключениях Windows открываем управление адаптерами — TAP-адаптер переименовываем в «VPN Server» (как у нас указано в конфигурационном файле, разделе dev-node):

Переименовываем сетевой интерфейс в Windows

Теперь открываем службы Windows и находим «OpenVpnService». Открываем ее, настраиваем на автозапуск и включаем:

Настраиваем автозапуск OpenVpnService и включаем ее

Если служба в запущенном состоянии, то перезапускаем ее.

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

Включенный TAP адаптер

VPN-сервер работает. Проверьте, что сетевой адаптер VPN Server получил IP 172.16.10.1. Если он получает что-то, на подобие, 169.254…, выключаем сетевой адаптер — перезапускаем службу OpenVpnService и снова включаем сетевой адаптер.

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

netsh advfirewall firewall add rule name=»ALLOW OpenVPN» dir=in action=allow protocol=UDP localport=443

* где 443 — наш порт, который мы решили задействовать под OpenVPN; UDP — протокол, который мы настроили в конфигурационном файле сервера.

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

На сервере

На сервере генерируем сертификат для клиента. Для этого сначала чистим файл index.txt в папке C:Program FilesOpenVPNeasy-rsakeys.

Затем запускаем командную строку от имени администратора:

Запуск командной строки от имени администратора

Переходим в каталог easy-rsa:

cd %ProgramFiles%OpenVPNeasy-rsa

Далее наши действия зависят от версии RSA.

а) Создание сертификатов с RSA 3

Запускаем команду:

EasyRSA-Start.bat

Мы окажемся в среде EasyRSA Shell.

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

./easyrsa gen-req client1 nopass

./easyrsa sign-req client client1

Мы должны увидеть запрос на подтверждение намерения выпустить сертификат — вводим yes:

  Confirm request details: yes

* в данном примере будет создан сертификат для client1.

После вводим пароль, который указывали при создании корневого сертификата.

Теперь из папки pki копируем файлы:

  • issued/client1.crt
  • private/client1.key
  • ca.crt
  • dh.pem

… и переносим их на клиентский компьютер.

б) Создание сертификатов с RSA 2 (для очень старых версий OpenVPN)

Запускаем vars.bat:

vars.bat

И генерируем сертификат первого пользователя:

build-key.bat client1

* на все запросы наживаем Enter, кроме Common Name — в данном поле вводим имя клиента (в нашем случае, просто client1). В конце подтверждаем введенную информацию — y.
** На каждого клиента нужно сгенерировать свой сертификат, в противном случае, им будет присваиваться один и тот же IP-адрес, что будет приводить к конфликту.

Получиться, что-то на подобие:

Country Name (2 letter code) [RU]:
State or Province Name (full name) [Sankt-Petersburg]:
Locality Name (eg, city) [Sankt-Petersburg]:
Organization Name (eg, company) [Organization]:
Organizational Unit Name (eg, section) [DMOSK]:
Common Name (eg, your name or your server’s hostname) [DMOSK]:client1
Name [server.domain.ru]:
Email Address [master@dmosk.ru]:

По умолчанию, для Common Name будет подставляться значение из vars.bat — но с ним сертификат не будет создаваться. Необходимо при создании каждого ключа подставлять значение, равное имени сертификата. Например, как выше — подставлено client1.

Теперь из папки keys копируем файлы:

  • client1.crt
  • client1.key
  • ca.crt
  • dh.pem

… и переносим их на клиентский компьютер.

На клиенте

Заходим на официальную страницу загрузки openvpn и скачиваем клиента для Windows:

Скачиваем OpenVPN для Windows

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

Запускаем скачанный файл и устанавливаем программу, нажимая «Далее».

Переходим в папку C:Program FilesOpenVPNconfig. И копируем в нее сертификаты, которые перенесли с сервера.

Теперь открываем блокнот от имени администратора и вставляем следующие строки:

client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
compress
fast-io
cipher AES-256-GCM
ca ca.crt
cert client1.crt
key client1.key
dh dh.pem
float
keepalive 10 120
persist-key
persist-tun
verb 0

* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы. Для боевой среды это будет внешний адрес.

Сохраняем файл с именем config.ovpn в папке C:Program FilesOpenVPNconfig.

Запускаем с рабочего стола программу «OpenVPN GUI» от имени администратора (это важно).

Нажимаем правой кнопкой по появившемуся в трее значку и выбираем «Подключиться»:

Запуск подключения openvpn-клиента к серверу

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

Доступ к локальной сети

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

1. Настройка реестра

Для включения IP маршрутизации в Windows необходимо в ветке реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters найти параметр IPEnableRouter и задать ему значение 1. Это можно сделать в утилите редактирования реестра (regedit) или командой:

reg add «HKLMSYSTEMCurrentControlSetServicesTcpipParameters» /v IPEnableRouter /t REG_DWORD /d 1 /f

* командную строку необходимо запускать от администратора.

2. Настройка OpenVPN Server

В конфигурационный файл OpenVPN добавим:

push «route 172.16.10.0 255.255.255.0»
push «route 192.168.2.0 255.255.255.0»

* где 172.16.10.0 — VPN сеть; 192.168.2.0 — локальная сеть, в которую необходимо «попасть» пользователям openvpn.

При необходимости использовать DNS внутренней сети также добавим:

push «dhcp-option DNS 192.168.0.15»
push «dhcp-option DNS 192.168.0.16»
push «dhcp-option DOMAIN dmosk.local»

* где 192.168.0.15 и 192.168.0.16 — внутренние DNS-серверы; dmosk.local — домен, который будет добавляться к узлам, обращение к которым идет по неполному имени.

Если нам нужно, чтобы все запросы клиента (в том числе, Интернет) ходили через сервер OpenVPN, добавляем:

push «redirect-gateway def1»

* в таком случае, нам не обязательно добавлять push route, который мы использовали выше.

Перезагружаем службу OpenVpnService.

3. Разрешаем доступ к локальной сети

Заходим в управление сетевыми подключениями (Панель управленияСеть и ИнтернетСетевые подключения). Кликаем правой кнопкой мыши по адаптеру локальной сети — Свойства:

Открываем свойства сетевого адаптера для локальной сети

На вкладке Доступ ставим галочку Разрешить другим пользователям сети использовать подключение к Интернету данного компьютера:

Скачиваем OpenVPN для Windows

… и сохраняем настройки.

Возможные проблемы

Большая часть проблем решается при помощи логов, которые находятся в папке C:Program FilesOpenVPNlog. Уровень детализации лога контролируется параметром verb в конфигурационном файле сервера или клиента.

Также возможны следующие часто возникающие проблемы:

  1. Проблема: клиент постоянно пытается подключиться к серверу, но соединения не происходит или подключение зависает.
    Причина: сервер блокирует подключения по настроенному порту VPN (в нашем примере, 443).
    Решение: на сервере необходимо добавить 443 порт в исключения брандмауэра или отключить последний.
     
  2. Проблема: при попытке подключиться к серверу выскакивает ошибка «Не удалось подключиться к config».
    Причина: ошибка в настройках.
    Решение: перепроверьте каждую строчку файла конфигурации. Проверьте наличие всех файлов, на которые ссылаетесь в настройках.
     
  3. Проблема: клиенты получают одинаковые IP-адреса.
    Причина: подключение выполняется под одним и тем же пользователем.
    Решение: сервер выдает одинаковые адреса одинаковым клиентам. Необходимо настроить авторизацию на сервере и выдать каждому клиенту индивидуальные настройки.
     
  4. Проблема: соединение происходит, но через несколько минут связь прерывается.
    Причина: дублирование IP-адресов.
    Решение: данная проблема описана выше (пункт 3).

Возможно, Вы это тоже захотите попробовать

  1. Настройка OpenVPN-сервера с аутентификацией через LDAP (Active Directory) на Ubuntu Server
  2. Установка и настройка OpenVPN на Linux CentOS 7

OpenVPN is a full-featured SSL VPN which implements OSI layer 2 or 3 secure network extension using the industry standard SSL/TLS protocol, supports flexible client authentication methods based on certificates, smart cards, and/or username/password credentials, and allows user or group-specific access control policies using firewall rules applied to the VPN virtual interface. OpenVPN is not a web application proxy and does not operate through a web browser.

OpenVPN 2.0 expands on the capabilities of OpenVPN 1.x by offering a scalable client/server mode, allowing multiple clients to connect to a single OpenVPN server process over a single TCP or UDP port. OpenVPN 2.3 includes a large number of improvements, including full IPv6 support and PolarSSL support.

This document provides step-by-step instructions for configuring an OpenVPN 2.x client/server VPN, including:

This HOWTO assumes that readers possess a prior understanding of basic networking concepts such as IP addresses, DNS names, netmasks, subnets, IP routing, routers, network interfaces, LANs, gateways, and firewall rules.

The original OpenVPN 1.x HOWTO is still available, and remains relevant for point-to-point or static-key configurations.

While this HOWTO will guide you in setting up a scalable client/server VPN using an X509 PKI (public key infrastruction using certificates and private keys), this might be overkill if you are only looking for a simple VPN setup with a server that can handle a single client.

If you would like to get a VPN running quickly with minimal configuration, you might check out the Static Key Mini-HOWTO.

OpenVPN source code and Windows installers can be downloaded here. Recent releases (2.2 and later) are also available as Debian and RPM packages; see the OpenVPN wiki for details.

The OpenVPN executable should be installed on both server and client machines, since the single executable provides both client and server functions.

If you are using a Linux distribution which supports RPM packages (SuSE, Fedora, Redhat, etc.), it’s best to install using this mechanism. The easiest method is to find an existing binary RPM file for your distribution. You can also build your own binary RPM file:

Furthermore, if you are building your own binary RPM package, there are several additional dependencies:

See the openvpn.spec file for additional notes on building an RPM package for Red Hat Linux 9 or building with reduced dependencies.

If you are using Debian, Gentoo, or a non-RPM-based Linux distribution, use your distro-specific packaging mechanism such as apt-get on Debian or emerge on Gentoo.

It is also possible to install OpenVPN on Linux using the universal ./configure method. First expand the .tar.gz file:

OpenVPN for Windows can be installed from the self-installing exe file on the OpenVPN download page. Remember that OpenVPN will only run on Windows XP or later. Also note that OpenVPN must be installed and run by a user who has administrative privileges (this restriction is imposed by Windows, not OpenVPN). The restriction can be sidestepped by running OpenVPN in the background as a service, in which case even non-admin users will be able to access the VPN, once it is installed. More discussion on OpenVPN + Windows privilege issues.

Official OpenVPN Windows installers include OpenVPN-GUI, which allows managing OpenVPN connections from a system tray applet. Other GUI applications are also available.

After you’ve run the Windows installer, OpenVPN is ready for use and will associate itself with files having the .ovpn extension. To run OpenVPN, you can:

method can be used, or you can search for an OpenVPN port or package which is specific to your OS/distribution.

See FAQ for an overview of Routing vs. Ethernet Bridging. See also the OpenVPN Ethernet Bridging page for more notes and details on bridging.

Overall, routing is probably a better choice for most people, as it is more efficient and easier to set up (as far as the OpenVPN configuration itself) than bridging. Routing also provides a greater ability to selectively control access rights on a client-specific basis.

I would recommend using routing unless you need a specific feature which requires bridging, such as:

Setting up a VPN often entails linking together private subnets from different locations.

The Internet Assigned Numbers Authority (IANA) has reserved the following three blocks of the IP address space for private internets (codified in RFC 1918):

While addresses from these netblocks should normally be used in VPN configurations, it’s important to select addresses that minimize the probability of IP address or subnet conflicts. The types of conflicts that need to be avoided are:

For example, suppose you use the popular 192.168.0.0/24 subnet as your private LAN subnet. Now you are trying to connect to the VPN from an internet cafe which is using the same subnet for its WiFi LAN. You will have a routing conflict because your machine won’t know if 192.168.0.1 refers to the local WiFi gateway or to the same address on the VPN.

As another example, suppose you want to link together multiple sites by VPN, but each site is using 192.168.0.0/24 as its LAN subnet. This won’t work without adding a complexifying layer of NAT translation, because the VPN won’t know how to route packets between multiple sites if those sites don’t use a subnet which uniquely identifies them.

The best solution is to avoid using 10.0.0.0/24 or 192.168.0.0/24 as private LAN network addresses. Instead, use something that has a lower probability of being used in a WiFi cafe, airport, or hotel where you might expect to connect from remotely. The best candidates are subnets in the middle of the vast 10.0.0.0/8 netblock (for example 10.66.77.0/24).

And to avoid cross-site IP numbering conflicts, always use unique numbering for your LAN subnets.

The first step in building an OpenVPN 2.x configuration is to establish a PKI (public key infrastructure). The PKI consists of:

OpenVPN supports bidirectional authentication based on certificates, meaning that the client must authenticate the server certificate and the server must authenticate the client certificate before mutual trust is established.

Both server and client will authenticate the other by first verifying that the presented certificate was signed by the master certificate authority (CA), and then by testing information in the now-authenticated certificate header, such as the certificate common name or certificate type (client or server).

Note that the server and client clocks need to be roughly in sync or certificates might not work properly.

In this section we will generate a master CA certificate/key, a server certificate/key, and certificates/keys for 3 separate clients.

For PKI management, we will use easy-rsa 2, a set of scripts which is bundled with OpenVPN 2.2.x and earlier. If you’re using OpenVPN 2.3.x, you need to download easy-rsa 2 separately from here.

For PKI management, we will use easy-rsa 2, a set of scripts which is bundled with OpenVPN 2.2.x and earlier. If you’re using OpenVPN 2.3.x, you may need to download easy-rsa 2 separately from the easy-rsa-old project page. On *NIX platforms you should look into using easy-rsa 3 instead; refer to its own documentation for details.

If you are using Linux, BSD, or a unix-like OS, open a shell and cd to the easy-rsa subdirectory. If you installed OpenVPN from an RPM or DEB file, the easy-rsa directory can usually be found in /usr/share/doc/packages/openvpn or /usr/share/doc/openvpn(it’s best to copy this directory to another location such as /etc/openvpn, before any edits, so that future OpenVPN package upgrades won’t overwrite your modifications). If you installed from a .tar.gz file, the easy-rsa directory will be in the top level directory of the expanded source tree.

If you are using Windows, open up a Command Prompt window and cd to Program FilesOpenVPNeasy-rsa. Run the following batch file to copy configuration files into place (this will overwrite any preexisting vars.bat and openssl.cnf files):

Now edit the vars file (called vars.bat on Windows) and set the KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, and KEY_EMAIL parameters. Don’t leave any of these parameters blank.

Next, initialize the PKI. On Linux/BSD/Unix:

The final command (build-ca) will build the certificate authority (CA) certificate and key by invoking the interactive opensslcommand:

Note that in the above sequence, most queried parameters were defaulted to the values set in the varsor vars.bat files. The only parameter which must be explicitly entered is the Common Name. In the example above, I used «OpenVPN-CA».

Next, we will generate a certificate and private key for the server. On Linux/BSD/Unix:

As in the previous step, most parameters can be defaulted. When the Common Name is queried, enter «server». Two other queries require positive responses, «Sign the certificate? [y/n]» and «1 out of 1 certificate requests certified, commit? [y/n]».

Generating client certificates is very similar to the previous step. On Linux/BSD/Unix:

If you would like to password-protect your client keys, substitute the build-key-pass script.

Remember that for each client, make sure to type the appropriate Common Name when prompted, i.e. «client1», «client2», or «client3». Always use a unique common name for each client.

Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix:

Now we will find our newly-generated keys and certificates in the keys subdirectory. Here is an explanation of the relevant files:

The final step in the key generation process is to copy all files to the machines which need them, taking care to copy secret files over a secure channel.

Now wait, you may say. Shouldn’t it be possible to set up the PKI without a pre-existing secure channel?

The answer is ostensibly yes. In the example above, for the sake of brevity, we generated all private keys in the same place. With a bit more effort, we could have done this differently. For example, instead of generating the client certificate and keys on the server, we could have had the client generate its own private key locally, and then submit a Certificate Signing Request (CSR) to the key-signing machine. In turn, the key-signing machine could have processed the CSR and returned a signed certificate to the client. This could have been done without ever requiring that a secret .key file leave the hard drive of the machine on which it was generated.

It’s best to use the OpenVPN sample configuration files as a starting point for your own configuration. These files can also be found in

Note that on Linux, BSD, or unix-like OSes, the sample configuration files are named server.conf and client.conf. On Windows they are named server.ovpn and client.ovpn.

The sample server configuration file is an ideal starting point for an OpenVPN server configuration. It will create a VPN using a virtual TUN network interface (for routing), will listen for client connections on UDP port 1194 (OpenVPN’s official port number), and distribute virtual addresses to connecting clients from the 10.8.0.0/24 subnet.

Before you use the sample configuration file, you should first edit the cacertkey, and dh parameters to point to the files you generated in the PKI section above.

At this point, the server configuration file is usable, however you still might want to customize it further:

If you want to run multiple OpenVPN instances on the same machine, each using a different configuration file, it is possible if you:

The sample client configuration file (client.conf on Linux/BSD/Unix or client.ovpn on Windows) mirrors the default directives set in the sample server configuration file.

First, make sure the OpenVPN server will be accessible from the internet. That means:

To simplify troubleshooting, it’s best to initially start the OpenVPN server from the command line (or right-click on the .ovpn file on Windows), rather than start it as a daemon or service:

A normal server startup should look like this (output will vary across platforms):

Starting the client

As in the server configuration, it’s best to initially start the OpenVPN server from the command line (or on Windows, by right-clicking on the client.ovpn file), rather than start it as a daemon or service:

openvpn [client config file] 

A normal client startup on Windows will look similar to the server output above, and should end with the Initialization Sequence Completed message.

Now, try a ping across the VPN from the client. If you are using routing (i.e. dev tun in the server config file), try:

ping 10.8.0.1

If you are using bridging (i.e. dev tap in the server config file), try to ping the IP address of a machine on the server’s ethernet subnet.

If the ping succeeds, congratulations! You now have a functioning VPN.

Troubleshooting

If the ping failed or the OpenVPN client initialization failed to complete, here is a checklist of common symptoms and their solutions:

  • You get the error message: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity). This error indicates that the client was unable to establish a network connection with the server.Solutions:
    • Make sure the client is using the correct hostname/IP address and port number which will allow it to reach the OpenVPN server.
    • If the OpenVPN server machine is a single-NIC box inside a protected LAN, make sure you are using a correct port forward rule on the server’s gateway firewall. For example, suppose your OpenVPN box is at 192.168.4.4 inside the firewall, listening for client connections on UDP port 1194. The NAT gateway servicing the 192.168.4.x subnet should have a port forward rule that says forward UDP port 1194 from my public IP address to 192.168.4.4.
    • Open up the server’s firewall to allow incoming connections to UDP port 1194 (or whatever TCP/UDP port you have configured in the server config file).
  • You get the error message: Initialization Sequence Completed with errors— This error can occur on Windows if (a) You don’t have the DHCP client service running, or (b) You are using certain third-party personal firewalls on XP SP2.Solution: Start the DHCP client server and make sure that you are using a personal firewall which is known to work correctly on XP SP2.
  • You get the Initialization Sequence Completedmessage but the ping test fails — This usually indicates that a firewall on either server or client is blocking VPN network traffic by filtering on the TUN/TAP interface.Solution: Disable the client firewall (if one exists) from filtering the TUN/TAP interface on the client. For example on Windows XP SP2, you can do this by going to Windows Security Center -> Windows Firewall -> Advanced and unchecking the box which corresponds to the TAP-Windows adapter (disabling the client firewall from filtering the TUN/TAP adapter is generally reasonable from a security perspective, as you are essentially telling the firewall not to block authenticated VPN traffic). Also make sure that the TUN/TAP interface on the server is not being filtered by a firewall (having said that, note that selective firewalling of the TUN/TAP interface on the server side can confer certain security benefits. See the access policies section below).
  • The connection stalls on startup when using a proto udpconfiguration, the server log file shows this line:
    TLS: Initial packet from x.x.x.x:x, sid=xxxxxxxx xxxxxxxx

    however the client log does not show an equivalent line.

    Solution: You have a one-way connection from client to server. The server to client direction is blocked by a firewall, usually on the client side. The firewall can either be (a) a personal software firewall running on the client, or (b) the NAT router gateway for the client. Modify the firewall to allow returning UDP packets from the server to reach the client.

See the FAQ for additional troubleshooting information.


Configuring OpenVPN to run automatically on system startup

The lack of standards in this area means that most OSes have a different way of configuring daemons/services for autostart on boot. The best way to have this functionality configured by default is to install OpenVPN as a package, such as via RPM on Linux or using the Windows installer.

Linux

If you install OpenVPN via an RPM or DEB package on Linux, the installer will set up an initscript. When executed, the initscript will scan for .conf configuration files in /etc/openvpn, and if found, will start up a separate OpenVPN daemon for each file.

Windows

The Windows installer will set up a Service Wrapper, but leave it turned off by default. To activate it, go to Control Panel / Administrative Tools / Services, select the OpenVPN service, right-click on properties, and set the Startup Type to Automatic. This will configure the service for automatic start on the next reboot.

When started, the OpenVPN Service Wrapper will scan the Program FilesOpenVPNconfig folder for .ovpn configuration files, starting a separate OpenVPN process on each file.


Controlling a running OpenVPN process

Running on Linux/BSD/Unix

OpenVPN accepts several signals:

  • SIGUSR1 — Conditional restart, designed to restart without root privileges
  • SIGHUP — Hard restart
  • SIGUSR2 — Output connection statistics to log file or syslog
  • SIGTERMSIGINT — Exit

Use the writepid directive to write the OpenVPN daemon’s PID to a file, so that you know where to send the signal (if you are starting openvpn with an initscript, the script may already be passing a —writepid directive on the openvpn command line).

Running on Windows as a GUI

See the OpenVPN GUI page.

Running in a Windows command prompt window

On Windows, you can start OpenVPN by right clicking on an OpenVPN configuration file (.ovpn file) and selecting «Start OpenVPN on this config file».

Once running in this fashion, several keyboard commands are available:

  • F1 — Conditional restart (doesn’t close/reopen TAP adapter)
  • F2 — Show connection statistics
  • F3 — Hard restart
  • F4 — Exit

Running as a Windows Service

When OpenVPN is started as a service on Windows, the only way to control it is:

  • Via the service control manager (Control Panel / Administrative Tools / Services) which gives start/stop control.
  • Via the management interface (see below).

Modifying a live server configuration

While most configuration changes require you to restart the server, there are two directives in particular which refer to files which can be dynamically updated on-the-fly, and which will take immediate effect on the server without needing to restart the server process.

client-config-dir — This directive sets a client configuration directory, which the OpenVPN server will scan on every incoming connection, searching for a client-specific configuration file (see the the manual page for more information). Files in this directory can be updated on-the-fly, without restarting the server. Note that changes in this directory will only take effect for new connections, not existing connections. If you would like a client-specific configuration file change to take immediate effect on a currently connected client (or one which has disconnected, but where the server has not timed-out its instance object), kill the client instance object by using the management interface (described below). This will cause the client to reconnect and use the new client-config-dir file.

crl-verify — This directive names a Certificate Revocation List file, described below in the Revoking Certificates section. The CRL file can be modified on the fly, and changes will take effect immediately for new connections, or existing connections which are renegotiating their SSL/TLS channel (occurs once per hour by default). If you would like to kill a currently connected client whose certificate has just been added to the CRL, use the management interface (described below).

Status File

The default server.conf file has a line

status openvpn-status.log

which will output a list of current client connections to the file openvpn-status.log once per minute.

Using the management interface

The OpenVPN management interface allows a great deal of control over a running OpenVPN process. You can use the management interface directly, by telneting to the management interface port, or indirectly by using an OpenVPN GUI which itself connects to the management interface.

To enable the management interface on either an OpenVPN server or client, add this to the configuration file:

management localhost 7505

This tells OpenVPN to listen on TCP port 7505 for management interface clients (port 7505 is an arbitrary choice — you can use any free port).

Once OpenVPN is running, you can connect to the management interface using a telnet client. For example:

ai:~ # telnet localhost 7505
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
help
Management Interface for OpenVPN 2.0_rc14 i686-suse-linux [SSL] [LZO] [EPOLL] built on Feb 15 2005
Commands:
echo [on|off] [N|all]  : Like log, but only show messages in echo buffer.
exit|quit              : Close management session.
help                   : Print this message.
hold [on|off|release]  : Set/show hold flag to on/off state, or
                         release current hold and start tunnel.
kill cn                : Kill the client instance(s) having common name cn.
kill IP:port           : Kill the client instance connecting from IP:port.
log [on|off] [N|all]   : Turn on/off realtime log display
                         + show last N lines or 'all' for entire history.
mute [n]               : Set log mute level to n, or show level if n is absent.
net                    : (Windows only) Show network info and routing table.
password type p        : Enter password p for a queried OpenVPN password.
signal s               : Send signal s to daemon,
                         s = SIGHUP|SIGTERM|SIGUSR1|SIGUSR2.
state [on|off] [N|all] : Like log, but show state history.
status [n]             : Show current daemon status info using format #n.
test n                 : Produce n lines of output for testing/debugging.
username type u        : Enter username u for a queried OpenVPN username.
verb [n]               : Set log verbosity level to n, or show if n is absent.
version                : Show current version number.
END
exit
Connection closed by foreign host.
ai:~ #

For more information, see the OpenVPN Management Interface Documentation.


Expanding the scope of the VPN to include additional machines on either the client or server subnet.

Including multiple machines on the server side when using a routed VPN (dev tun)

Once the VPN is operational in a point-to-point capacity between client and server, it may be desirable to expand the scope of the VPN so that clients can reach multiple machines on the server network, rather than only the server machine itself.

For the purpose of this example, we will assume that the server-side LAN uses a subnet of 10.66.0.0/24and the VPN IP address pool uses 10.8.0.0/24 as cited in the server directive in the OpenVPN server configuration file.

First, you must advertise the 10.66.0.0/24 subnet to VPN clients as being accessible through the VPN. This can easily be done with the following server-side config file directive:

push "route 10.66.0.0 255.255.255.0"

Next, you must set up a route on the server-side LAN gateway to route the VPN client subnet (10.8.0.0/24) to the OpenVPN server (this is only necessary if the OpenVPN server and the LAN gateway are different machines).

Make sure that you’ve enabled IP and TUN/TAP forwarding on the OpenVPN server machine.

Including multiple machines on the server side when using a bridged VPN (dev tap)

One of the benefits of using ethernet bridging is that you get this for free without needing any additional configuration.

Including multiple machines on the client side when using a routed VPN (dev tun)

In a typical road-warrior or remote access scenario, the client machine connects to the VPN as a single machine. But suppose the client machine is a gateway for a local LAN (such as a home office), and you would like each machine on the client LAN to be able to route through the VPN.

For this example, we will assume that the client LAN is using the 192.168.4.0/24 subnet, and that the VPN client is using a certificate with a common name of client2. Our goal is to set up the VPN so that any machine on the client LAN can communicate with any machine on the server LAN through the VPN.

Before setup, there are some basic prerequisites which must be followed:

  • The client LAN subnet (192.168.4.0/24 in our example) must not be exported to the VPN by the server or any other client sites which are using the same subnet. Every subnet which is joined to the VPN via routing must be unique.
  • The client must have a unique Common Name in its certificate («client2» in our example), and the duplicate-cn flag must not be used in the OpenVPN server configuration file.

First, make sure that IP and TUN/TAP forwarding is enabled on the client machine.

Next, we will deal with the necessary configuration changes on the server side. If the server configuration file does not currently reference a client configuration directory, add one now:

client-config-dir ccd

In the above directive, ccd should be the name of a directory which has been pre-created in the default directory where the OpenVPN server daemon runs. On Linux this tends to be /etc/openvpn and on Windows it is usually Program FilesOpenVPNconfig. When a new client connects to the OpenVPN server, the daemon will check this directory for a file which matches the common name of the connecting client. If a matching file is found, it will be read and processed for additional configuration file directives to be applied to the named client.

The next step is to create a file called client2 in the ccd directory. This file should contain the line:

iroute 192.168.4.0 255.255.255.0

This will tell the OpenVPN server that the 192.168.4.0/24 subnet should be routed to client2.

Next, add the following line to the main server config file (not the ccd/client2 file):

route 192.168.4.0 255.255.255.0

Why the redundant route and iroute statements, you might ask? The reason is that route controls the routing from the kernel to the OpenVPN server (via the TUN interface) while iroute controls the routing from the OpenVPN server to the remote clients. Both are necessary.

Next, ask yourself if you would like to allow network traffic between client2’s subnet (192.168.4.0/24) and other clients of the OpenVPN server. If so, add the following to the server config file.

client-to-client
push "route 192.168.4.0 255.255.255.0"

This will cause the OpenVPN server to advertise client2’s subnet to other connecting clients.

The last step, and one that is often forgotten, is to add a route to the server’s LAN gateway which directs 192.168.4.0/24 to the OpenVPN server box (you won’t need this if the OpenVPN server box is the gateway for the server LAN). Suppose you were missing this step and you tried to ping a machine (not the OpenVPN server itself) on the server LAN from 192.168.4.8? The outgoing ping would probably reach the machine, but then it wouldn’t know how to route the ping reply, because it would have no idea how to reach 192.168.4.0/24. The rule of thumb to use is that when routing entire LANs through the VPN (when the VPN server is not the same machine as the LAN gateway), make sure that the gateway for the LAN routes all VPN subnets to the VPN server machine.

Similarly, if the client machine running OpenVPN is not also the gateway for the client LAN, then the gateway for the client LAN must have a route which directs all subnets which should be reachable through the VPN to the OpenVPN client machine.

Including multiple machines on the client side when using a bridged VPN (dev tap)

This requires a more complex setup (maybe not more complex in practice, but more complicated to explain in detail):

  • You must bridge the client TAP interface with the LAN-connected NIC on the client.
  • You must manually set the IP/netmask of the TAP interface on the client.
  • You must configure client-side machines to use an IP/netmask that is inside of the bridged subnet, possibly by querying a DHCP server on the OpenVPN server side of the VPN.

Pushing DHCP options to clients

The OpenVPN server can push DHCP options such as DNS and WINS server addresses to clients (some caveats to be aware of). Windows clients can accept pushed DHCP options natively, while non-Windows clients can accept them by using a client-side up script which parses the foreign_option_nenvironmental variable list. See the man page for non-Windows foreign_option_n documentation and script examples.

For example, suppose you would like connecting clients to use an internal DNS server at 10.66.0.4 or 10.66.0.5 and a WINS server at 10.66.0.8. Add this to the OpenVPN server configuration:

push "dhcp-option DNS 10.66.0.4"
push "dhcp-option DNS 10.66.0.5"
push "dhcp-option WINS 10.66.0.8"

To test this feature on Windows, run the following from a command prompt window after the machine has connected to an OpenVPN server:

ipconfig /all

The entry for the TAP-Windows adapter should show the DHCP options which were pushed by the server.


Configuring client-specific rules and access policies

Suppose we are setting up a company VPN, and we would like to establish separate access policies for 3 different classes of users:

  • System administrators — full access to all machines on the network
  • Employees — access only to Samba/email server
  • Contractors — access to a special server only

The basic approach we will take is (a) segregate each user class into its own virtual IP address range, and (b) control access to machines by setting up firewall rules which key off the client’s virtual IP address.

In our example, suppose that we have a variable number of employees, but only one system administrator, and two contractors. Our IP allocation approach will be to put all employees into an IP address pool, and then allocate fixed IP addresses for the system administrator and contractors.

Note that one of the prerequisites of this example is that you have a software firewall running on the OpenVPN server machine which gives you the ability to define specific firewall rules. For our example, we will assume the firewall is Linux iptables.

First, let’s create a virtual IP address map according to user class:

Class Virtual IP Range Allowed LAN Access Common Names
Employees 10.8.0.0/24 Samba/email server at 10.66.4.4 [variable]
System Administrators 10.8.1.0/24 Entire 10.66.4.0/24 subnet sysadmin1
Contractors 10.8.2.0/24 Contractor server at 10.66.4.12 contractor1, contracter2

Next, let’s translate this map into an OpenVPN server configuration. First of all, make sure you’ve followed the steps above for making the 10.66.4.0/24 subnet available to all clients (while we will configure routing to allow client access to the entire 10.66.4.0/24 subnet, we will then impose access restrictions using firewall rules to implement the above policy table).

First, define a static unit number for our tun interface, so that we will be able to refer to it later in our firewall rules:

dev tun0

In the server configuration file, define the Employee IP address pool:

server 10.8.0.0 255.255.255.0

Add routes for the System Administrator and Contractor IP ranges:

route 10.8.1.0 255.255.255.0
route 10.8.2.0 255.255.255.0

Because we will be assigning fixed IP addresses for specific System Administrators and Contractors, we will use a client configuration directory:

client-config-dir ccd

Now place special configuration files in the ccd subdirectory to define the fixed IP address for each non-Employee VPN client.

ccd/sysadmin1

ifconfig-push 10.8.1.1 10.8.1.2

ccd/contractor1

ifconfig-push 10.8.2.1 10.8.2.2

ccd/contractor2

ifconfig-push 10.8.2.5 10.8.2.6

Each pair of ifconfig-push addresses represent the virtual client and server IP endpoints. They must be taken from successive /30 subnets in order to be compatible with Windows clients and the TAP-Windows driver. Specifically, the last octet in the IP address of each endpoint pair must be taken from this set:

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]

This completes the OpenVPN configuration. The final step is to add firewall rules to finalize the access policy. For this example, we will use firewall rules in the Linux iptables syntax:

# Employee rule
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.66.4.4 -j ACCEPT

# Sysadmin rule
iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 10.66.4.0/24 -j ACCEPT

# Contractor rule
iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT

Using alternative authentication methods

OpenVPN 2.0 and later include a feature that allows the OpenVPN server to securely obtain a username and password from a connecting client, and to use that information as a basis for authenticating the client.

To use this authentication method, first add the auth-user-pass directive to the client configuration. It will direct the OpenVPN client to query the user for a username/password, passing it on to the server over the secure TLS channel.

Next, configure the server to use an authentication plugin, which may be a script, shared object, or DLL. The OpenVPN server will call the plugin every time a VPN client tries to connect, passing it the username/password entered on the client. The authentication plugin can control whether or not the OpenVPN server allows the client to connect by returning a failure (1) or success (0) value.

Using Script Plugins

Script plugins can be used by adding the auth-user-pass-verify directive to the server-side configuration file. For example:

auth-user-pass-verify auth-pam.pl via-file

will use the auth-pam.pl perl script to authenticate the username/password of connecting clients. See the description of auth-user-pass-verify in the manual page for more information.

The auth-pam.pl script is included in the OpenVPN source file distribution in the sample-scriptssubdirectory. It will authenticate users on a Linux server using a PAM authentication module, which could in turn implement shadow password, RADIUS, or LDAP authentication. auth-pam.pl is primarily intended for demonstration purposes. For real-world PAM authentication, use the openvpn-auth-pamshared object plugin described below.

Using Shared Object or DLL Plugins

Shared object or DLL plugins are usually compiled C modules which are loaded by the OpenVPN server at run time. For example if you are using an RPM-based OpenVPN package on Linux, the openvpn-auth-pam plugin should be already built. To use it, add this to the server-side config file:

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

This will tell the OpenVPN server to validate the username/password entered by clients using the loginPAM module.

For real-world production use, it’s better to use the openvpn-auth-pam plugin, because it has several advantages over the auth-pam.pl script:

  • The shared object openvpn-auth-pam plugin uses a split-privilege execution model for better security. This means that the OpenVPN server can run with reduced privileges by using the directives user nobodygroup nobody, and chroot, and will still be able to authenticate against the root-readable-only shadow password file.
  • OpenVPN can pass the username/password to a plugin via virtual memory, rather than via a file or the environment, which is better for local security on the server machine.
  • C-compiled plugin modules generally run faster than scripts.

If you would like more information on developing your own plugins for use with OpenVPN, see the README files in the plugin subdirectory of the OpenVPN source distribution.

To build the openvpn-auth-pam plugin on Linux, cd to the plugin/auth-pam directory in the OpenVPN source distribution and run make.

Using username/password authentication as the only form of client authentication

By default, using auth-user-pass-verify or a username/password-checking plugin on the server will enable dual authentication, requiring that both client-certificate and username/password authentication succeed in order for the client to be authenticated.

While it is discouraged from a security perspective, it is also possible to disable the use of client certificates, and force username/password authentication only. On the server:

client-cert-not-required

Such configurations should usually also set:

username-as-common-name

which will tell the server to use the username for indexing purposes as it would use the Common Name of a client which was authenticating via a client certificate.

Note that client-cert-not-required will not obviate the need for a server certificate, so a client connecting to a server which uses client-cert-not-required may remove the cert and key directives from the client configuration file, but not the ca directive, because it is necessary for the client to verify the server certificate.


How to add dual-factor authentication to an OpenVPN configuration using client-side smart cards

  • About dual-factor authentication
  • What is PKCS#11?
  • Finding PKCS#11 provider library.
  • How to configure a cryptographic token
  • How to modify an OpenVPN configuration to make use of cryptographic tokens
    • Determine the correct object.
    • Using OpenVPN with PKCS#11.
    • PKCS#11 implementation considerations.
    • OpenSC PKCS#11 provider.
  • Difference between PKCS#11 and Microsoft Cryptographic API (CryptoAPI).

About dual-factor authentication

Dual-factor authentication is a method of authentication that combines two elements: something you have and something you know.

Something you have should be a device that cannot be duplicated; such a device can be a cryptographic token that contains a private secret key. This private key is generated inside the device and never leaves it. If a user possessing this token attempts to access protected services on a remote network, the authorization process which grants or denies network access can establish, with a high degree of certainty, that the user seeking access is in physical possession of a known, certified token.

Something you know can be a password presented to the cryptographic device. Without presenting the proper password you cannot access the private secret key. Another feature of cryptographic devices is to prohibit the use of the private secret key if the wrong password had been presented more than an allowed number of times. This behavior ensures that if a user lost his device, it would be infeasible for another person to use it.

Cryptographic devices are commonly called «smart cards» or «tokens», and are used in conjunction with a PKI (Public Key Infrastructure). The VPN server can examine a X.509 certificate and verify that the user holds the corresponding private secret key. Since the device cannot be duplicated and requires a valid password, the server is able to authenticate the user with a high degree of confidence.

Dual-factor authentication is much stronger than password-based authentication, because in the worst-case scenario, only one person at a time can use the cryptographic token. Passwords can be guessed and can be exposed to other users, so in the worst-case scenario an infinite number of people could attempt to gain unauthorized access when resources are protected using password-only authentication.

If you store the secret private key in a file, the key is usually encrypted by a password. The problem with this approach is that the encrypted key is exposed to decryption attacks or spyware/malware running on the client machine. Unlike when using a cryptographic device, the file cannot erase itself automatically after several failed decryption attempts.

What is PKCS#11?

This standard specifies an API, called Cryptoki, to devices which hold cryptographic information and perform cryptographic functions. Cryptoki, pronounced «crypto-key» and short for cryptographic token interface, follows a simple object-based approach, addressing the goals of technology independence (any kind of device) and resource sharing (multiple applications accessing multiple devices), presenting to applications a common, logical view of the device called a cryptographic token.

Source: RSA Security Inc. https://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs-11-cryptographic-token-interface-standard.htm.

To summarize, PKCS#11 is a standard that can be used by application software to access cryptographic tokens such as smart cards and other devices. Most device vendors provide a library that implements the PKCS#11 provider interface — this library can be used by applications in order to access these devices. PKCS#11 is a cross-platform, vendor-independent free standard.

Finding PKCS#11 provider library

The first thing you need to do is to find the provider library, it should be installed with the device drivers. Each vendor has its own library. For example, the OpenSC PKCS#11 provider is located at /usr/lib/pkcs11/opensc-pkcs11.so on Unix or at opensc-pkcs11.dll on Windows.

How to configure cryptographic token

You should follow an enrollment procedure:

  • Initialize the PKCS#11 token.
  • Generate RSA key pair on the PKCS#11 token.
  • Create a certificate request based on the key pair, you can use OpenSC and OpenSSL in order to do that.
  • Submit the certificate request to a certificate authority, and receive a certificate.
  • Load the certificate onto the token, while noting that the id and label attributes of the certificate must match those of the private key.

A configured token is a token that has a private key object and a certificate object, where both share the same id and label attributes.

A simple enrollment utility is Easy-RSA 2.0 which is part of OpenVPN 2.1 series. Follow the instructions specified in the README file, and then use the pkitool in order to enroll.

Initialize a token using the following command:

$ ./pkitool --pkcs11-slots /usr/lib/pkcs11/
$ ./pkitool --pkcs11-init /usr/lib/pkcs11/  

Enroll a certificate using the following command:

$ ./pkitool --pkcs11 /usr/lib/pkcs11/   client1

How to modify an OpenVPN configuration to make use of cryptographic tokens

You should have OpenVPN 2.1 or above in order to use the PKCS#11 features.

Determine the correct object

Each PKCS#11 provider can support multiple devices. In order to view the available object list you can use the following command:

$ openvpn --show-pkcs11-ids /usr/lib/pkcs11/

The following objects are available for use.
Each object shown below may be used as parameter to
--pkcs11-id option please remember to use single quote mark.

Certificate
       DN:             /CN=User1
       Serial:         490B82C4000000000075
       Serialized id:  aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600

Each certificate/private key pair have unique «Serialized id» string. The serialized id string of the requested certificate should be specified to the pkcs11-id option using single quote marks.

pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'

Using OpenVPN with PKCS#11

A typical set of OpenVPN options for PKCS#11
pkcs11-providers /usr/lib/pkcs11/
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'

This will select the object which matches the pkcs11-id string.

Advanced OpenVPN options for PKCS#11
pkcs11-providers /usr/lib/pkcs11/provider1.so /usr/lib/pkcs11/provider2.so
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'
pkcs11-pin-cache 300
daemon
auth-retry nointeract
management-hold
management-signal
management 127.0.0.1 8888
management-query-passwords

This will load two providers into OpenVPN, use the certificate specified on pkcs11-id option, and use the management interface in order to query passwords. The daemon will resume into hold state on the event when token cannot be accessed. The token will be used for 300 seconds after which the password will be re-queried, session will disconnect if management session disconnects.

PKCS#11 implementation considerations

Many PKCS#11 providers make use of threads, in order to avoid problems caused by implementation of LinuxThreads (setuid, chroot), it is highly recommend to upgrade to Native POSIX Thread Library (NPTL) enabled glibc if you intend to use PKCS#11.

OpenSC PKCS#11 provider

OpenSC PKCS#11 provider is located at /usr/lib/pkcs11/opensc-pkcs11.so on Unix or at opensc-pkcs11.dll on Windows.

Difference between PKCS#11 and Microsoft Cryptographic API (CryptoAPI)

PKCS#11 is a free, cross-platform vendor independent standard. CryptoAPI is a Microsoft specific API. Most smart card vendors provide support for both interfaces. In the Windows environment, the user should select which interface to use.

The current implementation of OpenVPN that uses the MS CryptoAPI (cryptoapicert option) works well as long as you don’t run OpenVPN as a service. If you wish to run OpenVPN in an administrative environment using a service, the implementation will not work with most smart cards because of the following reasons:

  • Most smart card providers do not load certificates into the local machine store, so the implementation will be unable to access the user certificate.
  • If the OpenVPN client is running as a service without direct interaction with the end-user, the service cannot query the user to provide a password for the smart card, causing the password-verification process on the smart card to fail.

Using the PKCS#11 interface, you can use smart cards with OpenVPN in any implementation, since PKCS#11 does not access Microsoft stores and does not necessarily require direct interaction with the end-user.


Routing all client traffic (including web-traffic) through the VPN

Overview

By default, when an OpenVPN client is active, only network traffic to and from the OpenVPN server site will pass over the VPN. General web browsing, for example, will be accomplished with direct connections that bypass the VPN.

In certain cases this behavior might not be desirable — you might want a VPN client to tunnel all network traffic through the VPN, including general internet web browsing. While this type of VPN configuration will exact a performance penalty on the client, it gives the VPN administrator more control over security policies when a client is simultaneously connected to both the public internet and the VPN at the same time.

Implementation

Add the following directive to the server configuration file:

push "redirect-gateway def1"

If your VPN setup is over a wireless network, where all clients and the server are on the same wireless subnet, add the local flag:

push "redirect-gateway local def1"

Pushing the redirect-gateway option to clients will cause all IP network traffic originating on client machines to pass through the OpenVPN server. The server will need to be configured to deal with this traffic somehow, such as by NATing it to the internet, or routing it through the server site’s HTTP proxy.

On Linux, you could use a command such as this to NAT the VPN client traffic to the internet:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

This command assumes that the VPN subnet is 10.8.0.0/24 (taken from the server directive in the OpenVPN server configuration) and that the local ethernet interface is eth0.

When redirect-gateway is used, OpenVPN clients will route DNS queries through the VPN, and the VPN server will need handle them. This can be accomplished by pushing a DNS server address to connecting clients which will replace their normal DNS server settings during the time that the VPN is active. For example:

push "dhcp-option DNS 10.8.0.1"

will configure Windows clients (or non-Windows clients with some extra server-side scripting) to use 10.8.0.1 as their DNS server. Any address which is reachable from clients may be used as the DNS server address.

Caveats

Redirecting all network traffic through the VPN is not entirely a problem-free proposition. Here are some typical gotchas to be aware of:

  • Many OpenVPN client machines connecting to the internet will periodically interact with a DHCP server to renew their IP address leases. The redirect-gateway option might prevent the client from reaching the local DHCP server (because DHCP messages would be routed over the VPN), causing it to lose its IP address lease.
  • Issues exist with respect to pushing DNS addresses to Windows clients.
  • Web browsing performance on the client will be noticably slower.

For more information on the mechanics of the redirect-gateway directive, see the manual page.


Running an OpenVPN server on a dynamic IP address

While OpenVPN clients can easily access the server via a dynamic IP address without any special configuration, things get more interesting when the server itself is on a dynamic address. While OpenVPN has no trouble handling the situation of a dynamic server, some extra configuration is required.

The first step is to get a dynamic DNS address which can be configured to «follow» the server every time the server’s IP address changes. There are several dynamic DNS service providers available, such as dyndns.org.

The next step is to set up a mechanism so that every time the server’s IP address changes, the dynamic DNS name will be quickly updated with the new IP address, allowing clients to find the server at its new IP address. There are two basic ways to accomplish this:

  • Use a NAT router appliance with dynamic DNS support (such as the Linksys BEFSR41). Most of the inexpensive NAT router appliances that are widely available have the capability to update a dynamic DNS name every time a new DHCP lease is obtained from the ISP. This setup is ideal when the OpenVPN server box is a single-NIC machine inside the firewall.
  • Use a dynamic DNS client application such as ddclient to update the dynamic DNS address whenever the server IP address changes. This setup is ideal when the machine running OpenVPN has multiple NICs and is acting as a site-wide firewall/gateway. To implement this setup, you need to set up a script to be run by your DHCP client software every time an IP address change occurs. This script should (a) run ddclientto notify your dynamic DNS provider of your new IP address and (b) restart the OpenVPN server daemon.

The OpenVPN client by default will sense when the server’s IP address has changed, if the client configuration is using a remote directive which references a dynamic DNS name. The usual chain of events is that (a) the OpenVPN client fails to receive timely keepalive messages from the server’s old IP address, triggering a restart, and (b) the restart causes the DNS name in the remote directive to be re-resolved, allowing the client to reconnect to the server at its new IP address.

More information can be found in the FAQ.


Connecting to an OpenVPN server via an HTTP proxy.

OpenVPN supports connections through an HTTP proxy, with the following authentication modes:

  • No proxy authentication
  • Basic proxy authentication
  • NTLM proxy authentication

First of all, HTTP proxy usage requires that you use TCP as the tunnel carrier protocol. So add the following to both client and server configurations:

proto tcp

Make sure that any proto udp lines in the config files are deleted.

Next, add the http-proxy directive to the client configuration file (see the manual page for a full description of this directive).

For example, suppose you have an HTTP proxy server on the client LAN at 192.168.4.1, which is listening for connections on port 1080. Add this to the client config:

http-proxy 192.168.4.1 1080

Suppose the HTTP proxy requires Basic authentication:

http-proxy 192.168.4.1 1080 stdin basic

Suppose the HTTP proxy requires NTLM authentication:

http-proxy 192.168.4.1 1080 stdin ntlm

The two authentication examples above will cause OpenVPN to prompt for a username/password from standard input. If you would instead like to place these credentials in a file, replace stdin with a filename, and place the username on line 1 of this file and the password on line 2.


This example is intended show how OpenVPN clients can connect to a Samba share over a routed dev tun tunnel. If you are ethernet bridging (dev tap), you probably don’t need to follow these instructions, as OpenVPN clients should see server-side machines in their network neighborhood.

For this example, we will assume that:

  • the server-side LAN uses a subnet of 10.66.0.0/24,
  • the VPN IP address pool uses 10.8.0.0/24 (as cited in the server directive in the OpenVPN server configuration file),
  • the Samba server has an IP address of 10.66.0.4, and
  • the Samba server has already been configured and is reachable from the local LAN.

If the Samba and OpenVPN servers are running on different machines, make sure you’ve followed the section on expanding the scope of the VPN to include additional machines.

Next, edit your Samba configuration file (smb.conf). Make sure the hosts allow directive will permit OpenVPN clients coming from the 10.8.0.0/24 subnet to connect. For example:

hosts allow = 10.66.0.0/24 10.8.0.0/24 127.0.0.1

If you are running the Samba and OpenVPN servers on the same machine, you may want to edit the interfaces directive in the smb.conf file to also listen on the TUN interface subnet of 10.8.0.0/24:

interfaces  = 10.66.0.0/24 10.8.0.0/24

If you are running the Samba and OpenVPN servers on the same machine, connect from an OpenVPN client to a Samba share using the folder name:

\10.8.0.1\sharename

If the Samba and OpenVPN servers are on different machines, use folder name:

\10.66.0.4sharename

For example, from a command prompt window:

net use z: \10.66.0.4sharename /USER:myusername

Implementing a load-balancing/failover configuration

Client

The OpenVPN client configuration can refer to multiple servers for load balancing and failover. For example:

remote server1.mydomain
remote server2.mydomain
remote server3.mydomain

will direct the OpenVPN client to attempt a connection with server1, server2, and server3 in that order. If an existing connection is broken, the OpenVPN client will retry the most recently connected server, and if that fails, will move on to the next server in the list. You can also direct the OpenVPN client to randomize its server list on startup, so that the client load will be probabilistically spread across the server pool.

remote-random

If you would also like DNS resolution failures to cause the OpenVPN client to move to the next server in the list, add the following:

resolv-retry 60

The 60 parameter tells the OpenVPN client to try resolving each remote DNS name for 60 seconds before moving on to the next server in the list.

The server list can also refer to multiple OpenVPN server daemons running on the same machine, each listening for connections on a different port, for example:

remote smp-server1.mydomain 8000
remote smp-server1.mydomain 8001
remote smp-server2.mydomain 8000
remote smp-server2.mydomain 8001

If your servers are multi-processor machines, running multiple OpenVPN daemons on each server can be advantageous from a performance standpoint.

OpenVPN also supports the remote directive referring to a DNS name which has multiple A records in the zone configuration for the domain. In this case, the OpenVPN client will randomly choose one of the A records every time the domain is resolved.

Server

The simplest approach to a load-balanced/failover configuration on the server is to use equivalent configuration files on each server in the cluster, except use a different virtual IP address pool for each server. For example:

server1

server 10.8.0.0 255.255.255.0

server2

server 10.8.1.0 255.255.255.0

server3

server 10.8.2.0 255.255.255.0

Hardening OpenVPN Security

One of the often-repeated maxims of network security is that one should never place so much trust in a single security component that its failure causes a catastrophic security breach. OpenVPN provides several mechanisms to add additional security layers to hedge against such an outcome.

tls-auth

The tls-auth directive adds an additional HMAC signature to all SSL/TLS handshake packets for integrity verification. Any UDP packet not bearing the correct HMAC signature can be dropped without further processing. The tls-auth HMAC signature provides an additional level of security above and beyond that provided by SSL/TLS. It can protect against:

  • DoS attacks or port flooding on the OpenVPN UDP port.
  • Port scanning to determine which server UDP ports are in a listening state.
  • Buffer overflow vulnerabilities in the SSL/TLS implementation.
  • SSL/TLS handshake initiations from unauthorized machines (while such handshakes would ultimately fail to authenticate, tls-auth can cut them off at a much earlier point).

Using tls-auth requires that you generate a shared-secret key that is used in addition to the standard RSA certificate/key:

openvpn --genkey --secret ta.key

This command will generate an OpenVPN static key and write it to the file ta.key. This key should be copied over a pre-existing secure channel to the server and all client machines. It can be placed in the same directory as the RSA .key and .crt files.

In the server configuration, add:

tls-auth ta.key 0

In the client configuration, add:

tls-auth ta.key 1

proto udp

While OpenVPN allows either the TCP or UDP protocol to be used as the VPN carrier connection, the UDP protocol will provide better protection against DoS attacks and port scanning than TCP:

proto udp

user/group (non-Windows only)

OpenVPN has been very carefully designed to allow root privileges to be dropped after initialization, and this feature should always be used on Linux/BSD/Solaris. Without root privileges, a running OpenVPN server daemon provides a far less enticing target to an attacker.

user nobody
group nobody

Unprivileged mode (Linux only)

On Linux OpenVPN can be run completely unprivileged. This configuration is a little more complex, but provides best security.

In order to work with this configuration, OpenVPN must be configured to use iproute interface, this is done by specifying —enable-iproute2 to configure script. sudo package should also be available on your system.

This configuration uses the Linux ability to change the permission of a tun device, so that unprivileged user may access it. It also uses sudo in order to execute iproute so that interface properties and routing table may be modified.

OpenVPN configuration:

    • Write the following script and place it at: /usr/local/sbin/unpriv-ip:
#!/bin/sh
sudo /sbin/ip $*
    • Execute visudo, and add the followings to allow user ‘user1’ to execute /sbin/ip:
user1 ALL=(ALL)  NOPASSWD: /sbin/ip
    • You can also enable a group of users with the following command:
%users ALL=(ALL)  NOPASSWD: /sbin/ip
    • Add the following to your OpenVPN configuration:
dev tunX/tapX
iproute /usr/local/sbin/unpriv-ip
    • Please note that you must select constant X and specify tun or tap not both.

    • As root add persistant interface, and permit user and/or group to manage it, the following create tunX (replace with your own) and allow user1 and group users to access it.
openvpn --mktun --dev tunX --type tun --user user1 --group users
  • Run OpenVPN in the context of the unprivileged user.

Further security constraints may be added by examining the parameters at the /usr/local/sbin/unpriv-ip script.

chroot (non-Windows only)

The chroot directive allows you to lock the OpenVPN daemon into a so-called chroot jail, where the daemon would not be able to access any part of the host system’s filesystem except for the specific directory given as a parameter to the directive. For example,

chroot jail

would cause the OpenVPN daemon to cd into the jail subdirectory on initialization, and would then reorient its root filesystem to this directory so that it would be impossible thereafter for the daemon to access any files outside of jail and its subdirectory tree. This is important from a security perspective, because even if an attacker were able to compromise the server with a code insertion exploit, the exploit would be locked out of most of the server’s filesystem.

Caveats: because chroot reorients the filesystem (from the perspective of the daemon only), it is necessary to place any files which OpenVPN might need after initialization in the jail directory, such as:

  • the crl-verify file, or
  • the client-config-dir directory.

Larger RSA keys

The RSA key size is controlled by the KEY_SIZE variable in the easy-rsa/vars file, which must be set before any keys are generated. Currently set to 1024 by default, this value can reasonably be increased to 2048 with no negative impact on VPN tunnel performance, except for a slightly slower SSL/TLS renegotiation handshake which occurs once per client per hour, and a much slower one-time Diffie Hellman parameters generation process using the easy-rsa/build-dh script.

Larger symmetric keys

By default OpenVPN uses Blowfish, a 128 bit symmetrical cipher.

OpenVPN automatically supports any cipher which is supported by the OpenSSL library, and as such can support ciphers which use large key sizes. For example, the 256-bit version of AES (Advanced Encryption Standard) can be used by adding the following to both server and client configuration files:

cipher AES-256-CBC

Keep the root key (ca.key) on a standalone machine without a network connection

One of the security benefits of using an X509 PKI (as OpenVPN does) is that the root CA key (ca.key) need not be present on the OpenVPN server machine. In a high security environment, you might want to specially designate a machine for key signing purposes, keep the machine well-protected physically, and disconnect it from all networks. Floppy disks can be used to move key files back and forth, as necessary. Such measures make it extremely difficult for an attacker to steal the root key, short of physical theft of the key signing machine.


Revoking Certificates

Revoking a certificate means to invalidate a previously signed certificate so that it can no longer be used for authentication purposes.

Typical reasons for wanting to revoke a certificate include:

  • The private key associated with the certificate is compromised or stolen.
  • The user of an encrypted private key forgets the password on the key.
  • You want to terminate a VPN user’s access.

Example

As an example, we will revoke the client2 certificate, which we generated above in the «key generation» section of the HOWTO.

First open up a shell or command prompt window and cd to the easy-rsa directory as you did in the «key generation» section above. On Linux/BSD/Unix:

. ./vars
./revoke-full client2

On Windows:

vars
revoke-full client2

You should see output similar to this:

Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 04.
Data Base Updated
Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
client2.crt: /C=KG/ST=NA/O=OpenVPN-TEST/CN=client2/emailAddress=me@myhost.mydomain
error 23 at 0 depth lookup:certificate revoked

Note the «error 23» in the last line. That is what you want to see, as it indicates that a certificate verification of the revoked certificate failed.

The revoke-full script will generate a CRL (certificate revocation list) file called crl.pem in the keyssubdirectory. The file should be copied to a directory where the OpenVPN server can access it, then CRL verification should be enabled in the server configuration:

crl-verify crl.pem

Now all connecting clients will have their client certificates verified against the CRL, and any positive match will result in the connection being dropped.

CRL Notes

  • When the crl-verify option is used in OpenVPN, the CRL file will be re-read any time a new client connects or an existing client renegotiates the SSL/TLS connection (by default once per hour). This means that you can update the CRL file while the OpenVPN server daemon is running, and have the new CRL take effect immediately for newly connecting clients. If the client whose certificate you are revoking is already connected, you can restart the server via a signal (SIGUSR1 or SIGHUP) and flush all clients, or you can telnet to the management interfaceand explicitly kill the specific client instance object on the server without disturbing other clients.
  • While the crl-verify directive can be used on both the OpenVPN server and clients, it is generally unnecessary to distribute a CRL file to clients unless a server certificate has been revoked. Clients don’t need to know about other client certificates which have been revoked because clients shouldn’t be accepting direct connections from other clientsin the first place.
  • The CRL file is not secret, and should be made world-readable so that the OpenVPN daemon can read it after root privileges have been dropped.
  • If you are using the chrootdirective, make sure to put a copy of the CRL file in the chroot directory, since unlike most other files which OpenVPN reads, the CRL file will be read after the chroot call is executed, not before.
  • A common reason why certificates need to be revoked is that the user encrypts their private key with a password, then forgets the password. By revoking the original certificate, it is possible to generate a new certificate/key pair with the user’s original common name.

Important Note on possible «Man-in-the-Middle» attack if clients do not verify the certificate of the server they are connecting to.

To avoid a possible Man-in-the-Middle attack where an authorized client tries to connect to another client by impersonating the server, make sure to enforce some kind of server certificate verification by clients. There are currently five different ways of accomplishing this, listed in the order of preference:

  • [OpenVPN 2.1 and above]Build your server certificates with specific key usage and extended key usage. The RFC3280 determine that the following attributes should be provided for TLS connections:
    Mode Key usage Extended key usage
    Client digitalSignature TLS Web Client Authentication
    keyAgreement
    digitalSignature, keyAgreement
    Server digitalSignature, keyEncipherment TLS Web Server Authentication
    digitalSignature, keyAgreement

    You can build your server certificates with the build-key-server script (see the easy-rsadocumentation for more info). This will designate the certificate as a server-only certificate by setting the right attributes. Now add the following line to your client configuration:

    remote-cert-tls server
  • [OpenVPN 2.0 and below] Build your server certificates with the build-key-server script (see the easy-rsa documentation for more info). This will designate the certificate as a server-only certificate by setting nsCertType=server. Now add the following line to your client configuration:
    ns-cert-type server

    This will block clients from connecting to any server which lacks the nsCertType=server designation in its certificate, even if the certificate has been signed by the ca file in the OpenVPN configuration file.

  • Use the tls-remotedirective on the client to accept/reject the server connection based on the common name of the server certificate.
  • Use a tls-verifyscript or plugin to accept/reject the server connection based on a custom test of the server certificate’s embedded X509 subject details.
  • Sign server certificates with one CA and client certificates with a different CA. The client configuration ca directive should reference the server-signing CA file, while the server configuration cadirective should reference the client-signing CA file.

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 FilesOpenVPN.

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

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

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

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

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

cd C:Program FilesOpenVPNeasy-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 FilesOpenVPNeasy-rsapkica.crt»
  • Ключ центра сертификации «C:Program FilesOpenVPNeasy-rsapkiprivateca.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 FilesOpenVPNeasy-rsapkiissuedserver.crt»)

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

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

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

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

cd C:Program FilesOpenVPNbin
openvpn --genkey secret ta.key

Должен появиться файл «C:Program FilesOpenVPNbinta.key». Переместите его в каталог C:Program FilesOpenVPNeasy-rsapki

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

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

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

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

Данный ключ («C:Program FilesOpenVPNeasy-rsapkiprivatekbuldogov.key») нужно передать клиенту и сообщить пароль. Клиент может снять защиту паролем для ключа:

openssl rsa -in "C:Program FilesOpenVPNeasy-rsapkiprivatekbuldogov.key"-out "C:Program FilesOpenVPNeasy-rsapkiprivatekbuldogov_use.key"

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

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

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

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

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

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

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

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

copy "C:Program FilesOpenVPNsample-configserver.ovpn" "C:Program FilesOpenVPNconfig-autoserver.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 FilesOpenVPNlogserver.log»

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

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

Options error: In C:Program FilesOpenVPNconfig-autoserver.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 «HKLMSYSTEMCurrentControlSetServicesTcpipParameters» /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 FilesOpenVPN Connectagent.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 FilesOpenVPNlogopenvpn.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

Глава 4. Режим клиент-сервер с tun-устройствами

Наиболее часто используемая модель развертывания для OpenVPN — это один сервер с несколькими удаленными клиентами, способными маршрутизировать IP-трафик. Мы называем эту модель развертывания режимом клиент-сервер с устройствами tun.

В этой главе мы начнем с базовой настройки клиент-сервер. По мере продвижения мы добавим больше возможностей и в конце этой главы приведены некоторые продвинутые примеры того, как настроить OpenVPN в режиме клиент-сервер. В следующей главе мы объясним, как интегрировать настройку клиент-серверном режиме на основе tun в существующую настройку сети, включая такие темы, как общий доступ к файлам Windows и маршрутизация на основе политик.

В этой главе будут рассмотрены следующие темы:

  • Настройка инфраструктуры публичных ключей
  • Начальная настройка режима клиент-сервер
  • Добавление усиленной безопасности с помощью файлов конфигурации продакшен-уровня
  • Маршрутизация и маршрутизация на стороне сервера
  • Специфичная для клиента конфигурация с использованием файлов CCD
  • Клиентская маршрутизация
  • Перенаправление шлюза по умолчанию
  • Файл статуса OpenVPN
  • Интерфейс управления OpenVPN
  • Пересогласование ключей сеанса
  • Использование IPv6
  • Прокси ARP
  • Раздача публичных IP-адресов

Понимание режима клиент-сервер

Клиент-серверный режим был впервые представлен в OpenVPN 2.0. В этом режиме сервер представляет собой один процесс OpenVPN, к которому могут подключаться несколько клиентов. Каждому аутентифицированному и авторизованному клиенту назначается IP-адрес из пула адресов, управляемого сервером OpenVPN. Клиенты не могут общаться напрямую друг с другом. Весь трафик проходит через сервер — что имеет как преимущества, так и недостатки.

Преимущества заключаются в следующем:

  • Контроль. Администратор VPN-сервера может контролировать, какой трафик может передаваться между клиентами. По умолчанию трафик между клиентами не разрешен. Однако, используя либо опцию client-to-client OpenVPN, либо используя умный брандмауэр и правила маршрутизации, можно разрешить клиентам обмениваться данными друг с другом.
  • Простота развертывания: гораздо проще настроить один сервер, к которому могут обращаться несколько разных клиентов, чем обеспечить связь между множеством клиентов, каждый из которых имеет собственную сеть и конфигурации брандмауэра.

Недостатки заключаются в следующем:

  • Масштабируемость. Поскольку весь трафик передается от клиента к серверу (и наоборот) — сервер может быстро стать узким местом в крупномасштабных установках VPN.
  • Производительность: поскольку весь трафик между двумя клиентами (клиентами A и B) должен проходить от клиента A к серверу, а затем от сервера к клиенту B — производительность этого типа VPN всегда будет ниже по сравнению с прямым соединением клиент-клиент.

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

Эта модель развертывания покрывает 95 процентов типичных требований для VPN и предпочтительнее сложных установок с использованием расширенных функций, таких как мостовое соединение. Только если существуют конкретные требования для маршрутизации трафика, не относящегося к IP (например, устаревший трафик IPX), или если необходимо сформировать единый сетевой широковещательный домен, такой модели развертывания будет недостаточно.

Настройка инфраструктуры открытых ключей

В режиме клиент-сервер OpenVPN настраивается с помощью инфраструктуры открытых ключей (PKI) с сертификатами X.509 и приватных ключей. Прежде чем мы сможем настроить клиент-сервер VPN — нам необходимо сначала настроить эту PKI. PKI состоит из CA, приватных ключей и сертификатов (публичных ключей) как для клиента, так и для сервера. В Главе 3, PKI и сертификаты мы подробно обсудили как настроить такую ​​PKI. Эта глава основана на сертификатах и ​​ключах, сгенерированных в той главе.

Сначала мы копируем сертификат и ключи в отдельное место. Как правило, рекомендуется хранить файлы PKI в отдельном месте, а если возможно даже на отдельном компьютере. Особое внимание следует уделить защите файла ca.key, поскольку вся безопасность вашей PKI зависит от этого файла. Если файл ca.key скомпрометирован каким-либо образом — вся PKI становится небезопасной и должна быть удалена. В следующих командах предполагается, что файлы PKI генерируются с использованием ssladmin и хранятся в каталоге <PKI_DIR>, где <PKI_DIR> представляет реальный каталог в системе. Выполните следующие команды, чтобы скопировать необходимые файлы PKI для сервера:

[root@server] # mkdir -p /etc/openvpn/movpn
[root@server] # chmod 700 /etc/openvpn/movpn
[root@server] # cd /etc/openvpn/movpn
[root@server] # PKI=<PKI_DIR>/ssladmin/active
[root@server] # cp -a $PKI/ca.crt movpn-ca.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.crt server.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.key server.key

Нам также необходимо создать файл параметров Диффи-Хеллмана (DH), который необходим для ключей сеанса VPN. Ключи сеанса являются эфемерными или временными и генерируются при первой настройке соединения между клиентом и сервером. Для обеспечения оптимальной безопасности эфемерные ключи регенерируются во время сеанса через фиксированные интервалы. Интервал регенерации ключей по умолчанию для OpenVPN составляет один час, но его можно настроить с помощью различных опций OpenVPN. Это будет объяснено позже в этой главе в разделе Пересогласование ключей сеанса.

Чтобы создать файл параметров DH, выполните следующие команды:

[root@server] # cd /etc/openvpn/movpn
[root@server] # openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
........+..........................................................
......
..................................................................+
......

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

Начальная настройка режима клиент-сервер

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

  1. Создайте следующий файл
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60

dh    /etc/openvpn/movpn/dh2048.pem
ca    /etc/openvpn/movpn/movpn-ca.crt
cert  /etc/openvpn/movpn/server.crt
key   /etc/openvpn/movpn/server.key

user nobody
group nobody # используйте ‘group nogroup’ для Debian/Ubuntu
verb 3
daemon
log-append /var/log/openvpn.log
  1. Затем сохраните его как movpn-04-01-server.conf. Подробное объяснение каждой из строк конфигурации будет дано позже.
  2. Запустите сервер OpenVPN:
[root@server]# openvpn --config movpn-04-01-server.conf
  1. Команда не даст никакого вывода в командной строке, так как весь вывод перенаправляется в файл журнала /var/log/openvpn.log. Проверьте этот файл для просмотра журнала запуска OpenVPN:
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO]
[EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Enter Private Key Password:
WARNING: this configuration may cache passwords in memory --
use the auth-nocache option to prevent this
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.1/24 broadcast 10.200.0.255
GID set to nobody
UID set to nobody
UDPv4 link local (bound): [undef]
UDPv4 link remote: [undef]
Initialization Sequence Completed
  1. Обратите внимание, что обычно каждая запись в файле журнала начинается с отметки времени. Для ясности эта временная метка была удалена.
  2. Затем создайте файл конфигурации клиента:
client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind
ca    /etc/openvpn/movpn/movpn-ca.crt
cert  /etc/openvpn/movpn/client1.crt
key   /etc/openvpn/movpn/client1.key

Сохраните его как movpn-04-01-client.conf.

  1. Передайте файлы PKI клиенту, используя безопасный канал, например с помощью команды scp:
[root@client]# mkdir -p /etc/openvpn/movpn
[root@client]# chmod 700 /etc/openvpn/movpn
[root@client]# cd /etc/openvpn/movpn
[root@client]# PKI_HOST=openvpnserver.example.com
[root@client]# PKI=<PKI_DIR>/ssladmin/active
[root@client]# scp root@$PKI_HOST:$PKI/ca.crt movpn-ca.crt
[root@client]# scp root@$PKI_HOST:$PKI/client1.crt client1.crt
[root@client]# scp root@$PKI_HOST:$PKI/client1.key client1.key
  1. Запустите клиент OpenVPN:
[root@client]# openvpn --config movpn-04-01-client.conf --
suppress-timestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO]
[EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
WARNING: No server certificate verification method has been
enabled. See http://openvpn.net/howto.html#mitm for more info.
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.2/24 broadcast 10.200.0.255
Initialization Sequence Completed
  1. Временные метки снова отсутствуют, но на этот раз они подавляются с помощью опции OpenVPN suppress-timestamps, как указано в командной строке.
  2. После установления соединения проверьте следующее сообщение:
Initialization Sequence Completed
  1. Вы можете убедиться, что соединение работает правильно, проверив VPN-адрес сервера:

Подробное объяснение файлов конфигурации

Так как это первый пример клиент-серверной конфигурации — приведено подробное объяснение файлов конфигурации как сервера, так и клиента. Файл конфигурации сервера содержит следующие строки:

  • proto udp: хотя это протокол по умолчанию, разумно явно указать его в файле конфигурации во избежание путаницы.
  • port 1194: локальный порт, который будет прослушивать OpenVPN. Значение по умолчанию — 1194, но можно использовать любой допустимый и доступный номер порта.
  • dev tun: указывает имя устройства tun, которое будет использоваться для сервера. Не добавляя номер позади tun, мы инструктируем OpenVPN открыть новое устройство tun. Этому новому устройству будет присвоен первый доступный номер в ядре системы, начиная с 0 (tun0, tun1, tun2 и т.д.). Для серверов Windows желательно сохранить эту строку как есть. Если необходимо использовать определенное устройство Windows, то потребуется опция dev-node.
  • server 10.200.0.0 255.255.255.0: оператор server переводит OpenVPN в режим сервера. Адрес подсети и маска определяют подсеть и маску, которые будут использоваться для VPN-сервера и клиентов. Серверу VPN назначается первый адрес, который в данном случае равен 10.200.0.1. Первому клиенту будет назначен адрес 10.200.0.2 (потому что мы используем topology subnet). Оператор server для этой конфигурации внутренне расширяется следующим образом:
mode server
tls-server
push “topology subnet”

ifconfig 10.200.0.1 255.255.255.0
ifconfig-pool 10.200.0.2 10.200.0.254 255.255.255.0
push “route-gateway 10.200.0.1”

Это взято со страницы руководства OpenVPN по адресу https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage. Если эти строки конфигурации используются вместо макроса сервера — используется та же конфигурация.


Заметка

Расширение включает push “topology subnet”, потому что мы также указали topology subnet в файле конфигурации. Без этой строки расширение не произошло бы.


  • topology subnet: определяет топологию для VPN. Текущей топологией по умолчанию является net30, в которой серверу и каждому клиенту назначено отдельное миниатюрное пространство подсети /30. Более подробная информация об использовании topology subnet против topology net30 приведена в следующем разделе.
  • persist-tun и persist-key: дает указание OpenVPN не открывать повторно устройство tun и не генерировать новый ключ при каждом перезапуске туннеля. Эти параметры особенно полезны в сочетании с user nobody так как обычно у nobody нет прав доступа для открытия нового интерфейса tun.
  • keepalive 10 60: используется для проверки работоспособности VPN-соединения, даже если по туннелю нет трафика. Оператор keepalive — это макрос для команд ping и ping-restart. Оператор keepalive 10 60 в конфигурации на стороне сервера расширяется до:
ping 10
ping-restart 120
push “ping 10”
push “ping-restart 60”

Предыдущий код означает:

  • Отправка пинг-сообщений каждому клиенту каждые 10 секунд.
  • Перезапуск соединения, если клиент не отвечает в течение 120 секунд (2 * 60 = 120)
  • Передача инструкций ping 10 и ping-restart 60 каждому клиенту
  • dh <путь к файлу Диффи-Хеллмана>: указывает путь к файлу DH, который требуется для сервера OpenVPN. Без этого файла сервер не может установить безопасное соединение TLS с клиентами. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).
  • ca <путь к файлу CA>: указывает путь к файлу CA. Файл CA должен содержать сертификат CA (или даже набор сертификатов), который использовался для подписи клиентских сертификатов. Это необязательно должен быть тот же CA, который использовался для подписи сертификата сервера, хотя в нашей настройке PKI мы использовали тот же CA. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).
  • cert <путь к файлу сертификата X.509>: указывает путь к файлу публичного сертификата X.509 сервера. Этот сертификат необходим серверу OpenVPN даже если клиенты подключаются без использования сертификатов. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).
  • key <путь к файлу приватного ключа>: указывает путь к файлу приватного ключа сервера. Этот файл приватного ключа необходим серверу OpenVPN, даже если клиенты подключаются без использования сертификатов или приватных ключей. Этот файл должен быть доступен для чтения только пользователю root (или администратору), так как любой пользователь, имеющий доступ на чтение приватных ключей, может расшифровать трафик OpenVPN. Обратите внимание — OpenVPN прочтет этот файл перед удалением пользовательских привилегий. Рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и приватным ключам).
  • user nobody и group nobody: дает указание OpenVPN перейти на пользователя Unix nobody и группу nobody после установления соединения. Это дополнительно повышает безопасность, так как атака на туннель с меньшей вероятностью приведет к эксплойту root. Обратите внимание, что в Debian/Ubuntu используется группа nogroup.
  • verb 3 : устанавливает уровень детализации в значение по умолчанию 3. Увеличьте это число для просмотра более подробного вывода процесса OpenVPN. Если детализация установлена в 0, то вряд ли будет выдаваться какой-либо результат регистрации. Однако это не рекомендуется.
  • daemon: указывает OpenVPN демонизировать себя — что означает продолжение работы процесса OpenVPN даже после закрытия окна терминала, в котором был запущен OpenVPN.
  • log-append <путь к файлу журнала>: указывает путь к файлу журнала сервера. Используя log-append вместо log <путь к файлу>, мы запрещаем OpenVPN обрезать файл журнала при каждом запуске. Для этого файла также рекомендуется использовать абсолютный путь.

Файл конфигурации клиента содержит:

  • client: переводит OpenVPN в режим клиента. Он инструктирует OpenVPN подключаться к удаленному серверу и получать и обрабатывать параметры конфигурации с сервера после успешного установления соединения. Оператор client внутренне расширен следующим образом:
  • proto udp: указывает протокол для использования. Хотя это протокол по умолчанию, разумно явно указать его в файле конфигурации для избежания путаницы.
  • remote openvpnserver.example.com: здесь указывается имя VPN-сервера для подключения. Имя может быть либо полным именем домена (FQDN), либо адресом IPv4. Далее в этой главе мы увидим, как подключиться к VPN-серверу на основе IPv6.
  • port 1194: порт, который клиент OpenVPN будет использовать для подключения к серверу. Значение по умолчанию — 1194, но можно использовать любой допустимый и доступный номер порта.

Заметка

Существует несколько способов указать удаленный адрес и порт для VPN-сервера. Например, также можно использовать remote openvpnserver.example.com:1194.


  • dev tun: указывает имя устройства tun, которое будет использоваться для сервера. Не добавляя номер позади tun, мы инструктируем OpenVPN открыть новое устройство. Этому новому устройству будет присвоен первый доступный номер в ядре системы, начиная с 0 (tun0, tun1, tun2 и т.д.). Для Windows-клиентов желательно сохранить эту строку как есть. Если необходимо использовать определенное устройство Windows, то потребуется опция dev-node.
  • nobind: указывает клиенту OpenVPN не связывать (и не прослушивать) порт, указанный с использованием port. Вместо этого клиент OpenVPN будет использовать порт в диапазоне анонимных портов, который обычно составляет 1024-65335.
  • ca <путь к файлу CA>: указывает путь к файлу CA. Этот файл CA должен содержать сертификат CA (или даже набор сертификатов), который использовался для подписи сертификата сервера. Это необязательно должен быть тот же CA, который использовался для подписи сертификата клиента, хотя в нашей настройке PKI мы использовали тот же CA. В Linux/Unix рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и секретным ключам).
  • cert <путь к файлу сертификата X.509>: указывает путь к файлу публичного сертификата клиента X.509. Можно настроить OpenVPN для использования аутентификации по имени пользователя/паролю вместо сертификатов, но это считается менее безопасным. В Linux/Unix рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и приватным ключам).
  • key <путь к файлу закрытого ключа>: указывает путь к файлу приватного ключа клиента. Этот файл должен быть доступен для чтения только пользователю root (или администратору), так как OpenVPN прочтёт этот файл перед удалением пользовательских привилегий. В Linux рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и секретным ключам).

Обратите внимание, что мы не указали daemon или log-append для конфигурации клиента, так как в большинстве случаев приложение-оболочка запускает процесс openvpn. Это приложение будет затем управлять журналом OpenVPN. Наиболее часто используемые приложения-оболочки:

Операционная система Приложения-оболочки
Windows OpenVPN-GUI.exe (часть пакета установки OpenVPN)
Mac OS X Tunnelblick или Viscosity
Linux NetworkManager (с плагином OpenVPN)

Topology subnets против topology net30

OpenVPN поддерживает несколько топологий в режиме tun:

  • net30 (по умолчанию, может измениться с v2.4)
  • подсеть
  • p2p

Начнем с последней, топология p2p почти никогда не использовалась и была первым методом назначения одного IP-адреса VPN-клиенту. Однако она работает только на производных от Linux и Unix и, следовательно, никогда не использовалась очень широко.

Топология net30 является текущим значением по умолчанию. В этом режиме OpenVPN устанавливает сетевой интерфейс «точка-точка» для каждого клиента (и для сервера) и назначает подсеть /30 каждому. Это означает, что серверу и каждому клиенту назначен блок из четырех IP-адресов. В файле конфигурации сервера будет указано server 10.200.0.0 255.255.255.0. С топологией net30 это заставляет OpenVPN назначать следующие IP-блоки:

  • Серверу OpenVPN назначается с 10.200.0.0 по 10.200.0.3.

  • Первому клиенту назначаются с 10.200.0.4 по 10.200.0.7.

  • Второму клиенту назначаются с 10.200.0.8 по 10.200.0.11 и так далее.

    Каждая подсеть /30 состоит из четырех адресов; для первого клиента эти адреса следующие:

    • 10.200.0.4: Это адрес подсети /30. Каждая подсеть должна иметь такой адрес, связанный с ней.
    • 10.200.0.5: Это адрес виртуальной конечной точки. Он необходим для функционирования OpenVPN, но на самом деле его нельзя использовать, и он даже не может быть проверен.
    • 10.200.0.6: IP-адрес VPN клиента.
    • 10.200.0.7: широковещательный адрес подсети /30. Каждая подсеть должна иметь такой широковещательный адрес, связанный с ней.

Как видите, это не очень эффективный метод назначения IP-адресов — для каждого VPN-клиента назначаются четыре IP-адреса. Для небольших настроек VPN этот метод работает нормально, но он не масштабируется для сервера с более чем 100 подключенными клиентами.

Чтобы преодолеть эту проблему — был введен режим topology subnet. Он позволяет OpenVPN назначать один IP-адрес всем клиентам, что значительно упрощает управление крупномасштабной VPN. Существуют некоторые проблемы с маршрутизацией на стороне сервера (подробнее см. раздел «Маршрутизация и маршрутизация на стороне сервера» далее в этой главе), из-за которых этот режим топологии не стал стандартным, но ожидается, что начиная с версии 2.4 он может стать режимом топологии по умолчанию.

Добавление повышенной безопасности

Начальный набор файлов конфигурации является хорошей отправной точкой для развертывания клиент-серверной конфигурации. Однако для системы производственного уровня мы должны добавить больше безопасности. Безопасность можно повысить двумя способами:

  • Добавляя ключи tls-auth
  • Путем проверки расширенных атрибутов использования ключей используемых сертификатов

Использование ключей tls-auth

В режиме клиент-сервер OpenVPN будет пытаться установить канал управления TLS для каждого подключаемого клиента. Настройка канала управления TLS требует много ресурсов, что делает OpenVPN подверженным атакам типа «отказ в обслуживании»: злоумышленник может запустить множество неправильно настроенных клиентов, которые будут одновременно пытаться подключиться к серверу OpenVPN. Для каждого из них сервер OpenVPN будет пытаться установить соединение TLS, что фактически приведет к отказу в обслуживании для правильно настроенных клиентов. Это особенно верно, когда OpenVPN работает с использованием proto udp (рекомендуется по умолчанию). UDP — это трафик без установления соединения, что означает проверку сервером действительности пакета OpenVPN для каждого нового UDP-пакета.

Для устранения этой возможной уязвимости OpenVPN ввел дополнительный уровень аутентификации в канал управления TLS, используя опцию tls-auth. Эта TLS-аутентификация должна выполняться с использованием предустановленного общего ключа, поскольку сервер еще не знает — пытается подключиться действительный клиент или нет. Предустановленные ключи, используемые здесь, являются теми же самыми ключами, используемыми в режиме точка-точка, как описано в Главе 2, Режим точка-точка.

Генерация ключа tls-auth

Чтобы сгенерировать ключ tls-auth — мы используем ту же команду, что описана в Главе 2, Режим точка-точка:

[root@server]# openvpn --genkey --secret /etc/openvpn/movpn/ta.key

Точно так же как файл приватного ключа клиента — этот файл должен быть скопирован каждому клиенту с использованием безопасного канала или должен быть включен в пакет конфигурации безопасного клиента:

[root@client]# cd /etc/openvpn/movpn
[root@client]# scp root@openvpnserver:/etc/openvpn/movpn/ta.key

Проверка атрибутов использования ключа сертификата

Когда сертификаты X.509 сгенерированы — к сертификату могут быть добавлены специальные атрибуты расширенного использования ключа (EKU). Это позволяет нам указать назначение сертификата, например, сертификат только для сервера или сертификат только для клиента. Сертификаты, используемые на защищенных веб-сайтах, используют те же атрибуты EKU.

Скрипт easy-rsa и инструмент ssladmin устанавливают атрибуты EKU по умолчанию при создании сертификата сервера или несерверного (клиентского) сертификата. Чтобы проверить атрибуты EKU сертификата, используйте следующие команды:

$ openssl x509 -text -noout -in server.crt | 
     grep -C 1 “Key Usage”

            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Key Usage:
                Digital Signature, Key Encipherment

Это говорит нам о том, что сертификат server.crt может использоваться только для аутентификации сервера.

В старых сертификатах эти атрибуты EKU могут быть не заданы, а вместо этого используется (не рекомендуется) атрибут Netscape Cert Type. Скрипт easy-rsa и инструмент ssladmin также устанавливают этот атрибут:

$ openssl x509 -text -noout -in server.crt | 
     grep -C 1 “Netscape Cert”

            Netscape Cert Type:
               SSL Server

Однако этот сертификат может быть установлен только для серверных сертификатов.

Безопасность OpenVPN может быть повышена путем проверки этих атрибутов. Для этого мы используем опцию remote-cert-tls.

Опция remote-cert-tls client предписывает серверу OpenVPN разрешать подключения только от VPN-клиентов, у которых есть сертификат с атрибутом EKU X.509, установленным как TLS Web Client Authentication.

Это не позволяет хакеру настроить мошеннический сервер OpenVPN с помощью клиентского сертификата.

Аналогично, для клиента опция remote-cert-tls server дает указание клиенту OpenVPN разрешать подключения только к VPN-серверу, у которого есть сертификат с атрибутом EKU X.509, установленным в значение TLS Web Server Authentication.

Это не позволяет злонамеренному клиенту настроить мошеннический сервер OpenVPN для привлечения подключений от других пользователей VPN.

Также можно проверить наличие атрибута Netscape Cert Type. Поскольку это атрибут сертификата сервера — клиент OpenVPN должен проверить этот атрибут при подключении. Для этого можно использовать опцию ns-cert-type server. Предпочтительно использовать параметр remote-cert-tls.

Основные конфигурационные файлы производственного уровня

Мы расширим предыдущие файлы конфигурации клиента и сервера, чтобы использовать только что созданный ключ tls-auth. Мы сделаем это добавив строку в файл конфигурации movpn-04-01-server.conf, а также второй параметр повышения безопасности:

proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60

remote-cert-tls client
tls-auth  /etc/openvpn/movpn/ta.key 0
dh        /etc/openvpn/movpn/dh2048.pem
ca        /etc/openvpn/movpn/movpn-ca.crt
cert      /etc/openvpn/movpn/server.crt
key       /etc/openvpn/movpn/server.key

user nobody
group nobody

verb 3
daemon
log-append /var/log/openvpn.log

Заметка

Обратите внимание, что порядок операторов в этом файле является случайным. Строки remote-cert-tls и tls-auth могут быть добавлены в любом месте файла.


Этот файл конфигурации является основным файлом конфигурации сервера, который мы будем использовать в этой и других главах. Сохраните его как basic-udp-server.conf, чтобы мы могли использовать его позже.

Мы добавляем две одинаковые строки в файл конфигурации клиента movpn-04-01-client.conf:

client

proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind

remote-cert-tls server
tls-auth  /etc/openvpn/movpn/ta.key 1
ca        /etc/openvpn/movpn/movpn-ca.crt
cert      /etc/openvpn/movpn/client1.crt
key       /etc/openvpn/movpn/client1.key

Сохраните его как basic-udp-client.conf.

Второй параметр опции tls-auth — это так называемое направление ключа. OpenVPN поддерживает использование направления ключа, то есть разные ключи используются для входящих и исходящих данных. Это еще больше повышает безопасность. Флаг direction должен быть установлен в 0 на одном конце и 1 — на другом. В режиме клиент-сервер это означает, что сервер имеет параметр 0 для направления, а для всех клиентов параметр направления установлен в 1.

Когда мы запускаем сервер OpenVPN, то видим что канал управления TLS теперь защищен статическим ключом:

[root@server]# openvpn --config basic-udp-server.conf --suppresstimestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Enter Private Key Password:
WARNING: this configuration may cache passwords in memory -- use
the auth-nocache option to prevent this
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
sbinip link set dev tun0 up mtu 1500
sbinip addr add dev tun0 10.200.0.1/24 broadcast 10.200.0.255
GID set to nobody
UID set to nobody
UDPv4 link local (bound): [undef]
UDPv4 link remote: [undef]
Initialization Sequence Completed

Аналогично, когда мы запускаем клиент OpenVPN — мы видим:

[root@client]# openvpn --config basic-udp-client.conf --suppresstimestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
sbinip link set dev tun0 up mtu 1500
sbinip addr add dev tun0 10.200.0.2/24 broadcast 10.200.0.255
Initialization Sequence Completed

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

Протоколом, используемым в OpenVPN по умолчанию, является протокол UDP. Создание версий с TCP на основе созданных ранее файлов конфигурации очень простое. В файлах конфигурации клиента и сервера измените строку proto udp на proto tcp. Весь файл конфигурации сервера для TCP указан здесь:

proto tcp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60

remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key

user nobody
group nobody

verb 3
daemon
log-append /var/log/openvpn.log

Сохраните этот файл конфигурации как basic-tcp-server.conf.

Аналогично, для файла конфигурации клиента:

client
proto tcp
remote openvpnserver.example.com
port 1194
dev tun
nobind

remote-cert-tls server
tls-auth /etc/openvpn/movpn/ta.key 1
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/client1.crt
key /etc/openvpn/movpn/client1.key

Сохраните его как basic-tcp-client.conf.

Конфигурационные файлы для Windows

Базовые файлы конфигурации для платформы Windows немного отличаются от файлов для платформ Linux/Unix или Mac OS. На платформе Windows используется оболочка Openvpn-GUI.exe, которая предполагает, что все файлы конфигурации хранятся в каталоге C:Program FilesOpenVPNconfig или его подкаталогах. Название каталога Program Files может отличаться для других языков. На всех языках переменная среды Windows %PROGRAMFILES% будет указывать на правильное расположение.

Таким образом, базовые файлы конфигурации UDP и TCP на самом деле немного короче. Создайте файл конфигурации клиента UDP:

client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind

remote-cert-tls server
tls-auth  ta.key 1
ca        movpn-ca.crt
cert      client1.crt
key       client1.key

Сохраните его как basic-udp-client.ovpn, чтобы мы могли использовать его позже в этой книге.

Аналогичным образом создайте конфигурацию клиента:

client
proto tcp
remote openvpnserver.example.com
port 1194
dev tun
nobind
remote-cert-tls server
tls-auth  ta.key 1
ca        movpn-ca.crt
cert      client1.crt
key       client1.key

Сохраните его как basic-tcp-client.ovpn.

Маршрутизация и маршрутизация на стороне сервера

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

Следует отметить, что большинство проблем с устранением неполадок OpenVPN связано тинггл с маршрутизацией. Настройка VPN-соединения — это одно, а правильная передача сетевого трафика — это другое. Она имеет мало общего с самим OpenVPN и больше связана с таблицами маршрутизации и правилами брандмауэра на стороне клиента и сервера.

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

Локальная сеть на стороне сервера: 192.168.122.0/24. Ресурсы, к которым VPN-клиенты должны получить доступ, находятся в этой подсети. Таким образом — сервер должен проинструктировать VPN-клиентов что необходимо установить дополнительный маршрут. Это делается с помощью опции push, которая передает маршрута клиенту. Этого также можно достичь добавив маршрут в сам файл конфигурации клиента, но это плохо масштабируется. Связано это с тем, что для каждого нового сетевого маршрута на стороне сервера необходимо обновить все файлы конфигурации клиента.

Мы начнем с файла basic-udp-server.conf и добавим одну строку:

proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60

remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key

user nobody
group nobody

verb 3
daemon
log-append /var/log/openvpn.log

push “route 192.168.122.0 255.255.255.0”

Мы сохраняем его как movpn-04-03-server.conf и запускаем сервер OpenVPN, используя этот файл конфигурации. На этот раз мы используем Windows 7 64-разрядную версию Professional в качестве клиента OpenVPN, на котором установлена ​​версия OpenVPN 2.3.4-I004 для X86_64. Скопируйте следующие файлы на компьютер с Windows:

  • basic-udp-client.ovpn
  • movpn-ca.crt
  • client1.crt
  • client1.key

Возьмите и поместите их в C:Program FilesOpenVPNconfig (или %PROGRAMFILES%OpenVPNconfig).

Запустите приложение OpenVPN GUI, выберите конфигурацию basic-udp-client и нажмите Connect:

Как только соединение будет успешно установлено — значок OpenVPN GUI становится зеленым и информация о соединении отображается при наведении курсора на значок:

Теперь мы можем проверить, работает ли VPN-соединение с сервером, открыв командную оболочку и выполнив команду ping на сервере:

После того, как мы проверили что сервер OpenVPN доступен — мы должны убедиться, что сервер OpenVPN пересылает IP-трафик и нам необходимо добавить дополнительный маршрут на шлюзе со стороны сервера чтобы гарантировать правильное перенаправление VPN-трафика обратно через сервер VPN. Без этого маршрута машины в серверной сети не будут знать откуда поступает трафик VPN с IP-адресами 10.200.0.0/24 и, скорее всего, будут неправильно маршрутизировать или отбрасывть пакеты:

[root@server]# sysctl -w net.ipv4.ip_forward=1
[router]# ip route add 10.200.0.0/24 via 192.168.122.1

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

Первая часть выходных данных показывает что несколько маршрутов для подсети VPN 10.200.0.0/24 были добавлены к таблицам маршрутизации, включая маршрут для pushed подсети 192.168.122.0/24. Обратите внимание на последний столбец выходных данных, который показывает метрику маршрута. Windows вычисляет метрику (в данном случае 286), но она может быть отменена с помощью правильных операторов маршрута. Маршрут, добавленный с помощью push route 192.168.122.0 255.255.255.0, имеет более низкую метрику, поскольку была указана метрика OpenVPN по умолчанию — 30.

Специальные параметры для вариантов маршрута

Аналогично тому, что описано в Главе 2, Режим точка-точка инструкция push route <network> <netmask> [vpn_gateway] [metric] жизненно важна в этой настройке. Параметр route принимает до четырех параметров: два обязательных и два дополнительных. Третий параметр играет важную роль в этой настройке. Слово vpn_gateway — это специальное ключевое слово OpenVPN, которое указывает адрес удаленной конечной точки VPN. Обычно это ключевое слово указывать не нужно, кроме случаев необходимости указания метрики для этого маршрута.

Полный синтаксис для инструкции маршрута — route <network> <netmask> [gateway] [metric], где gateway может быть явно задан как адрес IPv4 или могут использоваться специальные ключевые слова vpn_gateway или net_gateway. Если шлюз и метрика не указаны, используется vpn_gateway.

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

Метрика имеет метрику по умолчанию, которую можно установить с помощью route-metric m, которая затем применяется ко всем маршрутам. Если вы хотите отменить метрику для определенного маршрута (как мы это сделали в данном примере), то необходимо указать шлюз (в нашем случае vpn_gateway), за которым следует метрика для этого конкретного маршрута.

Маскарадинг

Иногда невозможно добавить маршрут на стороне сервера для перенаправления всего VPN-трафика обратно на сервер OpenVPN. В этом случае быстрый и грязный подход заключается в использовании маскарадинга. В Linux вы можете использовать команду iptables для настройки маскарадинга на сервере:

[root@server]# iptables -t nat -I POSTROUTING -o eth0 
                 -s 10.200.0.0/24 -j MASQUERADE

Этот оператор iptables указывает ядру Linux перезаписывать весь трафик, поступающий из подсети VPN 10.200.0.0/24 и покидающий интерфейс Ethernet eth0. У трафика, покидающего интерфейс eth0 адрес источника переписывается так, что он выглядит будто исходит от самого сервера OpenVPN, а не от клиента OpenVPN. Это простой способ заставить маршрутизацию работать, но недостаток заключается в том, что больше невозможно различить, поступает ли данный трафик с самого сервера OpenVPN или с одного из подключенных клиентов.

Перенаправление шлюза по умолчанию

Очень распространенное использование VPN — это маршрутизация всего трафика через безопасный туннель. Это позволяет безопасно получить доступ к сети или даже самому Интернету изнутри враждебной среды (например, небезопасный wi-fi в интернет-кафе).

Перенаправление шлюза по умолчанию достигается добавлением строки push “redirectgateway [def1 local bypass-dhcp bypass-dns]” в файл конфигурации сервера.

Параметры для redirect-gateway, перечисленные ранее, являются необязательными, но они могут играть очень важную роль:

  • Параметры не добавлены: В этом случае OpenVPN заменит существующий шлюз по умолчанию (0.0.0.0/0) на адрес самого сервера OpenVPN. Также добавляется дополнительный маршрут к самому серверу OpenVPN, чтобы сам трафик OpenVPN отправлялся непосредственно на сервер, а не через туннель. Недостаток заключается в том, что если соединение OpenVPN остановлено или прервано — исходный шлюз по умолчанию не восстанавливается. Это обычно приводит к полной потере сетевого подключения.
  • Параметр def1: вместо замены существующего шлюза по умолчанию — OpenVPN добавит два новых маршрута, 0.0.0.0/1 и 128.0.0.0/1. Эти маршруты вместе также охватывают все пространство IPv4 и являются более конкретными (/1), чем обычный шлюз (/0). Маршрутизация всегда происходит по более конкретным маршрутам, и, таким образом, весь трафик передается через VPN. Преимущество этого трюка в том, что шлюз по умолчанию остается без изменений. Если VPN-соединение останавливается — исходный шлюз можно восстановить. Обратите внимание, что в этом случае OpenVPN добавит явный маршрут к самому серверу OpenVPN — поэтому сам зашифрованный трафик не будет отправляться через туннель.
  • Параметр bypass-dhcp: иногда полезно добавить явный маршрут к локальному DHCP-серверу в локальной сети на стороне клиента. Это позволяет избежать туннелирования обновлений DHCP через VPN, хотя в большинстве сетевых настроек этого не происходит, поскольку как правило существует более конкретный маршрут к сегменту сети, на котором расположен локальный сервер DHCP.
  • Параметр bypass-dns: иногда может потребоваться добавить явный маршрут к локальному DNS-серверу, так как в противном случае разрешение доменных имен нарушается. Это происходит только в том случае — если вы хотите использовать клиентский DNS-сервер, но хотите направить весь трафик через туннель.

Помимо опции redirect-gateway, мы также можем указать опцию push “redirect-private [def1 local bypass-dhcp bypass-dns]” в файл конфигурации сервера. Этот параметр принимает те же параметры, что и redirect-gateway, но не изменяет существующий шлюз по умолчанию. Это может быть полезно для передачи маршрутов к частным подсетям.

Сейчас мы добавляем push "redirect-gateway def1" в файл конфигурации basic-udp-server.conf. Сохраните его как movpn-04-06-server.conf, запустите сервер OpenVPN и повторно подключите клиента, используя файл конфигурации по умолчанию.

После того, как соединение установлено, мы проверяем что весь трафик теперь проходит через VPN, используя команду traceroute (используйте tracert -d в командной оболочке Windows):

Первый hop в выводе отслеживаемого маршрута 10.200.0.1, что является IP-адресом сервера OpenVPN. Это доказывает, что трафик проходит через VPN по умолчанию.

Параметр конфигурации redirect-gateway def1 указывает клиенту OpenVPN добавить три маршрута в клиентскую операционную систему:

10.198.1.1 via 192.168.4.254 dev eth0
0.0.0.0/1 via 10.200.0.1 dev tun0
128.0.0.0/1 via 10.200.0.1 dev tun0

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

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

Преимущество этого метода заключается в том, что исходный шлюз по умолчанию остается без изменений. Когда VPN отключена — первоначальный адрес шлюза автоматически вступает во владение снова. Если бы мы просто использовали redirect-gateway — есть вероятность что шлюз по умолчанию будет потерян при отключении VPN, что приведет к полной потере сетевого подключения.

Недостатком этого метода являются клиенты Windows 7 и выше: Windows иногда отказывается доверять адаптеру TAP-Win без маршрута по умолчанию и поэтому помечает его как общедоступный адаптер. В Windows 7 невозможно использовать общедоступный адаптер для общего доступа к файлам или принтерам. В следующей главе мы рассмотрим как обойти эту особенность.

Специфичная для клиента конфигурация — файлы CCD

В инсталляциях, где один сервер может обрабатывать подключения от множества клиентов, иногда необходимо установить параметры для каждого клиента, которые отменяют глобальные параметры или добавить дополнительные параметры для конкретного клиента. Опция client-config-dir очень полезна для этого. Она позволяет администратору VPN назначать конкретный IP-адрес клиенту для передачи определенных параметров, как например DNS-сервер — конкретному клиенту или для временного отключения клиента. Эта опция также необходима, если вы хотите маршрутизировать клиентскую подсеть на сторону сервера, как мы увидим позже.

client-config-dir или CCD-файл может содержать следующие параметры:

  • push: полезно для отправки DNS и WINS-серверов, маршрутов и т.д.
  • push-reset: полезно для отмены глобальных параметров push
  • iroute: полезно для маршрутизации клиентских подсетей IPv4 на сервер
  • iroute-ipv6: полезно для маршрутизации клиентских подсетей IPv6 на сервер
  • ifconfig-push: полезно для назначения определенного адреса IPv4 клиенту
  • ifconfig-ipv6-push: полезно для назначения конкретного адреса IPv6 клиенту
  • disable: полезно для временного полного отключения клиента
  • config: полезно для включения другого файла конфигурации CCD

Чтобы использовать файлы CCD мы добавляем в файл конфигурации basic-udp-server.conf строку:

client-config-dir /etc/openvpn/movpn/clients

Сохраните его как movpn-04-04-server.conf. Затем создайте каталог для CCD и создайте в нем файл CCD для клиента с сертификатом client1.crt :

[root@server]# mkdir -p /etc/openvpn/movpn/clients
[root@server]# echo “ifconfig-push 10.200.0.99 255.255.255.0” 
> /etc/openvpn/movpn/clients/client1
[root@server]# chmod 755 /etc/openvpn/movpn/clients
[root@server]# chmod 644 /etc/openvpn/movpn/clients/client1

Имя файла CCD основано на общем имени субъекта сертификата (часть «/CN=»), как указано в файле client1.crt:

$ openssl x509 -subject -noout -in client1.crt
subject= /C=ZA/ST=Enlightenment/O=Mastering
OpenVPN/CN=client1/emailAddress=root@example.org

В нашем случае имя файла должно быть просто client1 без расширения, даже в Windows! Если в common name есть пробелы — их необходимо преобразовать в подчеркивания (_). Если проводник Windows настроен на скрытие расширений для распространенных типов файлов — проще будет открыть окно командной оболочки (cmd.exe) и удалить расширение с помощью следующих команд:

C:> cd %PROGRAMFILES%openvpnconfigclients
C:> rename client1.txt client1,145.102.134.201:35519

Затем мы запускаем сервер OpenVPN, используя этот файл конфигурации и подключаем VPN-клиента. Журнал подключений показывает что клиенту назначен адрес 10.200.0.99:

[root@client]# openvpn --config basic-udp-client.conf
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.99/24 broadcast 10.200.0.255
Initialization Sequence Completed

При настройке детальности вывода по-умолчанию журнал на стороне сервера не показывает никаких сообщений о получении файла CCD. Увеличьте настройку детальности до 5 или выше, чтобы увидеть обрабатывается ли файл CCD:

<client-ip>:49299 [client1] Peer Connection Initiated with
[AF_INET]<client-ip>:49299
client1/<client-ip>:49299 OPTIONS IMPORT: reading client specific
options from: /etc/openvpn/movpn/clients/client1client1/<clientip>:49299 MULTI: Learn: 10.200.0.99 -> client1/<client-ip>:49299

Как определить, правильно ли обрабатывается файл CCD

Поиск и исправление правильности обработки CCD-файла может быть немного сложнее. Следующие рекомендации помогут при отладке проблем с файлами CCD:

  • Всегда указывайте полный путь для опции client-config-dir.
  • Убедитесь что каталог доступен, а файл CCD доступен для чтения пользователю, который используется для запуска OpenVPN (в большинстве случаев nobody или openvpn; в конфигурациях, перечисленных в этой книге, используется user nobody).
  • Убедитесь что для файла CCD используется правильное имя файла без каких-либо расширений.
  • Если возможно — добавьте опцию ccd-exclusive в файл конфигурации сервера. Это дает указание OpenVPN разрешать клиентские подключения только при наличии определенного CCD-файла для этого клиента. Если при чтении CCD-файла для определенного клиента возникла проблема — клиенту также будет отказано в доступе. Таким образом, вы будете знать, что ваши настройки client-config-dir выполнены неправильно.

CCD файлы и топология net30

Если вы используете (по умолчанию) настройку топологии (topology net30), то оператор ifconfig-push немного отличается. Поскольку каждому клиенту теперь назначена подсеть /30, в операторе ifconfig-push должна быть указана действительная подсеть VPN /30. Применяются следующие правила:

  • Каждая подсеть /30 должна начинаться с адреса, кратного 4 (4, 8, 12 и т.д.)
  • Локальный IP-адрес VPN является третьим адресом в этой подсети.
  • IP-адрес виртуальной удаленной конечной точки является вторым адресом.

Например, действительный IP-адрес для VPN-клиента — 10.200.0.50:

  • Подсеть 10.200.0.48/32, где 48 кратно 4
  • IP-адрес VPN-клиента будет 50 (48 + 2 = 50)
  • Виртуальная удаленная конечная точка — 49 (48 + 1 = 49)

Файл CCD теперь должен содержать следующее:

ifconfig-push 10.200.0.50 10.200.0.49

Клиентская маршрутизация

Иногда полезно разрешить серверу VPN (или другим клиентам VPN) доступ к ресурсам, подключенным к конкретному клиенту. Это известно как маршрутизация на стороне клиента. Для клиентской маршрутизации в OpenVPN для этого клиента требуется файл CCD, содержащий оператор iroute. Это также требует соответствующей инструкции route в файле конфигурации сервера OpenVPN.

Рассмотрим следующую схему сети:

Подсеть 192.168.4.0/24 должна быть доступна из локальной сети на стороне сервера, а подсеть 192.168.122.0/24 — на стороне сервера из локальной сети клиента. Это может быть достигнуто следующим образом:

  1. Добавьте две строки в файл конфигурации basic-udp-server.conf:
client-config-dir /etc/openvpn/movpn/clients
route 192.168.4.0 255.255.255.0 10.200.0.1

Сохраните его как movpn-04-05-server.conf.

  1. Создайте CCD-файл client1 в каталоге /etc/openvpn/movpn/clients с содержимым:
ifconfig-push 10.200.0.99 255.255.255.0
iroute 192.168.4.0 255.255.255.0
push “route 192.168.122.0 255.255.255.0”
  1. Убедитесь, что пересылка (форвардинг) IP-трафика включена и разрешена как на клиенте, так и на сервере:
[root@client]# sysctl -w net.ipv4.ip_forward=1
[root@server]# sysctl -w net.ipv4.ip_forward=1
  1. Запустите сервер OpenVPN, используя файл конфигурации movpn-04-05-server.conf.

  2. Подключите клиента, используя файл конфигурации по умолчанию basic-udp-client.conf.

  3. После того как соединение установлено — мы проверяем, что обе подсети могут связаться друг с другом используя ping:

[root@client]# ping -c 3 192.168.122.184
PING 192.168.122.184 (192.168.122.184) 56(84) bytes of data.
64 bytes from 192.168.122.184: icmp_seq=1 ttl=63 time=3.29 ms
64 bytes from 192.168.122.184: icmp_seq=2 ttl=63 time=3.27 ms
64 bytes from 192.168.122.184: icmp_seq=3 ttl=63 time=3.31 ms
--- 192.168.122.184 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 3.277/3.296/3.317/0.016 ms

[root@server]# ping -c 3 192.168.4.10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=63 time=6.31 ms
64 bytes from 192.168.4.10: icmp_seq=2 ttl=63 time=5.07 ms
64 bytes from 192.168.4.10: icmp_seq=3 ttl=63 time=5.14 ms
--- 192.168.4.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 5.073/5.512/6.317/0.575 ms

Подробное объяснение конфигурации client-config-dir

На первом этапе мы добавляем две новые строки в файл конфигурации сервера. Эти строки устанавливают client-config-dir и инструктируют OpenVPN добавить системный сетевой маршрут для подсети 192.168.4.0/24. Здесь необходимо явно указать адрес шлюза 10.200.0.1 из-за незначительной ошибки в OpenVPN. Ожидается, что этот недостаток будет исправлен в версии 2.4, после чего вы можете снова указать route 192.168.4.0 255.255.255.0.

Содержимое файла CCD указывает OpenVPN, что при подключении клиента с Common Name client1 IP-адрес для этого клиента должен быть установлен на 10.200.0.99. Кроме того, OpenVPN должен установить внутренний маршрут (iroute) для этого клиента, чтобы сам OpenVPN знал, что подсеть 192.168.4.0/24 расположена за этим конкретным клиентом.

Наконец, оператор push route инструктирует OpenVPN «продвинуть» маршрут для этой конкретной подсети клиенту client1. Таким образом, сервер OpenVPN может прозрачно передавать разные маршруты разным клиентам.


Заметка

Выборочное продвижение маршрута к конкретному клиенту может быть удобным, но оно не защищено от несанкционированного доступа. Мошеннический VPN-клиент, который сам добавит маршрут к этой подсети, также будет иметь к ней доступ. Если вам нужно контролировать доступ к определенной подсети — используйте решение в виде межсетевого экрана, такое как iptables или ipfw.


В этом примере показана гибкость параметров конфигурации OpenVPN. Без необходимости изменять одну строку в файле конфигурации клиента можно назначить другой IP-адрес, направить конкретную подсеть клиенту или маршрутизировать конкретную подсеть из сети клиента в локальную сеть на стороне сервера.

Трафик клиент-клиент

OpenVPN также позволяет вам настраивать трафик клиент-клиент. По умолчанию VPN-клиенты не могут напрямую общаться друг с другом. Это хорошая мера безопасности, но иногда необходимо разрешить межклиентский трафик. Помните, что весь VPN-трафик клиент-клиент будет проходить через сервер OpenVPN: от client1 к VPN-серверу, а затем от VPN-сервера к client2 и наоборот. Это может легко привести к проблемам с производительностью.

В режиме tun соединение клиент-клиент может быть достигнуто либо с помощью iptables, либо с помощью параметра OpenVPN client-to-client. Параметр client-to-client имеет преимущество в том, что он быстрее: трафик от одного клиента, поступающий на сервер, автоматически перенаправляется второму клиенту, не проходя через таблицы системной маршрутизации или правила брандмауэра. Недостатком является сложность контроля трафика и невозможность применения контроля доступа.

Без параметра client-to-client трафик от одного клиента принимается сервером OpenVPN, перенаправляется в таблицы системной маршрутизации и межсетевого экрана и (при правильной настройке) снова возвращается на сервер OpenVPN. Затем сервер пересылает его второму клиенту.

Если другим VPN-клиентам необходим доступ к подсети 192.168.4.0/24, как указано в предыдущем примере, то конфигурацию сервера необходимо расширить строкой:

push “192.168.4.0 255.255.255.0”

Это дает команду серверу OpenVPN продвинуть маршрут всем клиентам, которые находятся в подсети 192.168.4.0/24, доступной через VPN-туннель, за исключением клиента client1. Сам клиент client1 исключен из-за соответствующей записи iroute.

Файл состояния OpenVPN

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

  • Какие клиенты подключены
  • С какого IP-адреса подключаются клиенты
  • Количество байт, которые каждый клиент получил и передал
  • Время подключения клиента
  • Кроме того, таблица маршрутизации также показывает, какие сети маршрутизируются каждому клиенту.

Мы поправим конфиг сервера из Клиентской маршрутизации movpn-04-05-server.conf, добавив строку:

proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60

remote-cert-tls client
tls-auth  /etc/openvpn/movpn/ta.key 0
dh        /etc/openvpn/movpn/dh2048.pem
ca        /etc/openvpn/movpn/movpn-ca.crt
cert      /etc/openvpn/movpn/server.crt
key       /etc/openvpn/movpn/server.key

user nobody
group nobody

verb 3
daemon
log-append /var/log/openvpn.log

client-config-dir /etc/openvpn/movpn/clients
route 192.168.4.0 255.255.255.0 10.200.0.1
status /var/run/openvpn.status 3

Сохраните его как movpn-04-07-server.conf. После установления VPN-соединения мы видим следующее содержимое в файле состояния после того, как VPN-клиент client1 подключился и передал некоторые данные:

OpenVPN CLIENT LIST
Updated,Tue Oct 21 15:45:27 2014
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,<client-IP>:35519,7730,9342,Tue Oct 21 15:44:35 2014
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
192.168.4.0/24,client1,145.102.134.201:35519,Tue Oct 21 15:44:35
2014
10.200.0.99,client1,145.102.134.201:35519,Tue Oct 21 15:44:35 2014
GLOBAL STATS
Max bcast/mcast queue length,0
END

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

ROUTING TABLE показывает список внутренних маршрутов OpenVPN:

  • Подсеть 192.168.4.0/24 маршрутизируется на client1 из-за оператора iroute в конфигурации сервера
  • IP-адрес 10.200.0.99 — это адрес client1, который мы явно установили в файле CCD с именем client1

При отключении клиента файл состояния обновляется через 3 секунды и подключенный клиент больше не отображается в списке.


Заметка

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


Вторым параметром опции status является интервал обновления (перезаписи) файла состояния. Значение по умолчанию составляет 60 секунд.

Надежное отслеживание соединения в режиме UDP

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

Клиент OpenVPN может явно уведомить сервер о своем отключении, используя опцию explicit-exit-notify. Эта опция принимает один параметр, который указывает количество явных сообщений, которые клиент пытается отправить на сервер. Значение по умолчанию равно 1, что не работает если само основное сетевое соединение нестабильно. В этом случае рекомендуется увеличить данное значение до 3.

При использовании explicit-exit-notify сервер OpenVPN сразу же получает сообщение об удаленном выходе при отключении клиента, что можно увидеть в файле журнала сервера:

SIGTERM[soft,remote-exit] received, client-instance exiting

Обратите внимание — эта проблема не возникает при использовании proto tcp поскольку сервер немедленно замечает разрыв TCP-соединения.

Интерфейс управления OpenVPN

Одним из наиболее мощных, но менее известных вариантов OpenVPN является интерфейс управления. Интерфейс управления доступен как на стороне сервера, так и на стороне клиента. На стороне сервера его можно использовать для сбора статистики, мониторинга и контроля подключенных клиентов, а также для выполнения других задач, связанных с управлением. На стороне клиента его можно использовать для запроса паролей, ввода информации прокси-сервера для установления соединения с сервером VPN, взаимодействия с устройством PKCS#11 и сбора статистики на стороне клиента.

Плагин OpenVPN для Linux NetworkManager широко использует интерфейс управления для управления запуском и отключением VPN-подключения.

Чтобы использовать интерфейс управления — добавьте строку management 127.0.0.1 23000 stdin в файл конфигурации клиента или сервера. Эта опция указывает OpenVPN настроить интерфейс управления на IP-адресе 127.0.0.1, порту 23000 и использовать stdin для указания пароля управления.

Если мы добавим это в файл конфигурации basic-udp-server.conf и запустим сервер OpenVPN, то OpenVPN сначала запросит у нас пароль для управления:

Затем мы можем использовать telnet для входа в интерфейс управления (ввод пользователя выделен жирным шрифтом):

[root#server]# telnet 127.0.01 23000
Trying 127.0.0.1...
Connected to 127.0.0.1
Escape character is ‘^]’.
ENTER PASSWORD:[password]
SUCCESS: password is correct
>INFO:OpenVPN Management Interface Version 1 -- type ‘help’ for more info
help
Management Interface for OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)]
[LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Commands:
auth-retry t           : Auth failure retry mode
                         (none,interact,nointeract).
bytecount n            : Show bytes in/out, update every n secs
                         (0=off).
echo [on|off] [N|all]  : Like log, but only show messages in echo
                         buffer.
exit|quit              : Close management session.
forget-passwords       : Forget passwords entered so far.
help                   : Print this message.
[...]
END

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

Это приведет к отключению клиента client1. Обратите внимание, что в большинстве случаев клиент автоматически пытается восстановить соединение. Теперь введите exit, чтобы завершить сеанс telnet.

Интерфейс управления может использоваться для управления OpenVPN различными способами (адаптировано со страницы руководства OpenVPN https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage):

  • management IP port [pw-file]: включить TCP-сервер на IP:порт для обработки функций управления демоном. pw-file, если он указан, является файлом паролей (пароль на первой строке) или stdin для стандартного ввода. Предоставленный пароль будет устанавливать пароль, который клиенты TCP должны будут указать для доступа к функциям управления.

Интерфейс управления также может прослушивать сокет домена Unix, если он поддерживается. Для использования доменного сокета укажите путь к сокету Unix вместо IP и установите для порта значение unix.

Интерфейс управления обеспечивает специальный режим, в котором канал управления TCP может работать через сам туннель. Чтобы включить этот режим — установите IP = “tunnel”. Туннельный режим заставит интерфейс управления прослушивать TCP-соединение по локальному VPN-адресу интерфейса TUN/TAP.

  • management-client: интерфейс управления будет подключаться как клиент домена TCP/Unix к IP:порт, заданный параметром --management, а не прослушивать как сервер TCP или в сокете домена Unix. Если клиентскому соединению не удается подключиться или он отключен — будет сгенерирован сигнал SIGTERM, что приведет к выходу OpenVPN.
  • management-query-passwords: канал управления запросами для пароля с приватным ключом и --auth-user-pass имя_пользователя/пароль.
  • management-hold: Запуск OpenVPN в режиме гибернации, пока клиент интерфейса управления не запустит его явно командой освобождения удержания.
  • management-signal: отправляет сигнал SIGUSR1 в OpenVPN если сеанс управления отключен. Это полезно, когда вы хотите отключать сеанс OpenVPN при выходе пользователя из системы.
  • management-client-auth: дает клиенту интерфейса управления ответственность за проверку подлинности клиентов после проверки их клиентского сертификата.

Пересмотр ключа сеанса

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

  • reneg-sec N: повторно согласовать ключ канала данных через N секунд (по умолчанию 3600)
  • reneg-bytes N: пересмотреть ключ канала данных после N байт (по умолчанию = 0 = выкл.)
  • reneg-pkts N: пересмотреть ключ канала данных после N пакетов (по умолчанию = 0 = выкл.)

Если VPN-клиент испытывает периодические таймауты при подключении к серверу — часто бывает полезно изменить эти параметры. Однако если вы установите параметр reneg-sec на очень короткий интервал — производительность VPN будет сильно ухудшена.

Параметры reneg могут быть указаны либо на стороне клиента, либо на стороне сервера, либо на обоих. Опция reneg, запускаемая наиболее часто с обеих сторон — сбрасывает счетчики на обоих концах. Если сервер указывает значение reneg-sec 500, а клиент — reneg-sec 60, то повторное согласование канала данных будет происходить примерно каждые 60 секунд.

Мы создадим пример, добавив три строки в файл конфигурации basic-udp-server.conf:

reneg-sec 10
reneg-pkts 1000
reneg-bytes 1000000

Сохраним конфигурацию как movpn-04-09-server.conf и восстановим VPN-соединение. Журнал сервера теперь будет содержать много строк с указанием TLS: soft reset:

Tue Oct 21 16:53:29 2014 <IP>:41679 [client1] Peer Connection
Initiated with [AF_INET]<IP>:41679
[...]
Tue Oct 21 16:53:39 2014 client1/<IP>:41679 TLS: soft reset sec=0
bytes=0/100000 pkts=0/100
[...]
Tue Oct 21 16:53:49 2014 client1/<IP>:41679 TLS: soft reset sec=0bytes=53/100000 pkts=1/100
[...]
Tue Oct 21 16:53:59 2014 client1/<IP>:41679 TLS: soft reset sec=0
bytes=105/100000 pkts=2/100

При установленном параметре reneg-sec 10 из временных меток журнала сервера видно, что ключ канала данных пересматривается каждые 10 секунд.

На стороне клиента мы также можем увидеть влияние, которое это пересогласование ключей оказывает на производительность VPN-соединения. Запустив простую команду ping после установления соединения — мы можем увидеть когда происходит повторное согласование ключа, основываясь на пиках времени отклика ping:

[client]$ ping 10.200.0.1
PING 10.200.0.1 (10.200.0.1) 56(84) bytes of data.
64 bytes from 10.200.0.1: icmp_seq=1 ttl=64 time=3.29 ms
64 bytes from 10.200.0.1: icmp_seq=2 ttl=64 time=3.55 ms
64 bytes from 10.200.0.1: icmp_seq=3 ttl=64 time=61.6 ms
64 bytes from 10.200.0.1: icmp_seq=4 ttl=64 time=16.6 ms
64 bytes from 10.200.0.1: icmp_seq=5 ttl=64 time=3.23 ms
64 bytes from 10.200.0.1: icmp_seq=6 ttl=64 time=3.22 ms
64 bytes from 10.200.0.1: icmp_seq=7 ttl=64 time=3.74 ms
64 bytes from 10.200.0.1: icmp_seq=8 ttl=64 time=3.25 ms
64 bytes from 10.200.0.1: icmp_seq=9 ttl=64 time=3.21 ms
64 bytes from 10.200.0.1: icmp_seq=10 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=11 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=12 ttl=64 time=3.55 ms
64 bytes from 10.200.0.1: icmp_seq=13 ttl=64 time=3.27 ms
64 bytes from 10.200.0.1: icmp_seq=14 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=15 ttl=64 time=3.31 ms
64 bytes from 10.200.0.1: icmp_seq=16 ttl=64 time=3.28 ms
64 bytes from 10.200.0.1: icmp_seq=17 ttl=64 time=77.1 ms
...

То же самое произойдет, когда граница пакета или байта будет пересечена, и в этот момент ключи канала данных также будут пересмотрены.

Замечание об устройствах PKCS#11

Повторное согласование ключей может быть особенно громоздким при использовании устройств PKCS#11. Некоторые устройства PKCS#11 накладывают большие расходы на повторное согласование ключа, в результате чего процесс пересогласования занимает несколько секунд. В течение этого времени VPN не отвечает.

Установка значения reneg-sec равным 0 эффективно отключит пересогласование ключа, но это делает саму VPN восприимчивой к атакам типа атаки посредника и атаки по времени, что делает дополнительную безопасность использования аппаратного защитного устройства бесполезной.

Использование IPv6

В OpenVPN 2.3 появилась надежная поддержка IPv6 как внутри туннеля OpenVPN, так и для транзита самого туннеля. OpenVPN вплоть до 1.x имел элементарную поддержку IPv6, которая была в значительной степени переписана. В целом, внутри туннеля OpenVPN администратор может выбрать поддержку Ethernet (уровень 2), IPv4 (уровень 3) и IPv6 (уровень 3).

Диаграмма иллюстрирует логическую взаимосвязь пути транзитной сети и пути защищенной сети. Необходимо использовать только один метод транзита, а одна конфигурация OpenVPN может содержать записи --remote как для IPv4, так и IPv6. Весь трафик, независимо от типа, будет защищен в туннеле. Вполне приемлемо иметь туннель полностью IPv6, использующий IPv6 как для транзитного, так и для защищенного трафика. Благодаря дополнительной маршрутизации и проксированию даже возможно использовать OpenVPN для помощи в преобразовании IPv6 в IPv4.

Защищенный трафик IPv6

Основываясь на примерах из предыдущего раздела, мы можем предоставлять клиентам адреса IPv6 и защищать этот трафик в туннеле. Для этого мы добавляем параметр --server-ipv6 в конфигурацию нашего сервера. Это работает аналогично директиве --server, только для IPv6 вместо IPv4 и принимает в качестве аргументов сетевой адрес IPv6 и маску сети. Как и --server, --server-ipv6 — это макрос для других параметров, которые могут передаваться индивидуально: --ifconfig-ipv6, --ifconfig-ipv6-pool , --tun-ipv6 и –push tun-ipv6.

Как и в случае IPv4, маршруты IPv6 могут передаваться из конфигурации основного сервера или из файлов конфигурации для каждого клиента в каталоге client-config. В нашем примере мы просто отправим маршрут по умолчанию для всего трафика IPv6.

В настоящее время в OpenVPN для IPv6 нет опции перенаправления шлюза. Маршруты добавляются аналогично IPv6, с ключевым словом route-ipv6 вместо route.

Теперь измените файл movpn-04-01-server.conf и добавьте инструкцию --server-ipv6:

proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
server-ipv6 2001:DB8:100::/64
push “route-ipv6 ::/0”
topology subnet
persist-key
persist-tun
keepalive 10 60

dh      /etc/openvpn/movpn/dh2048.pem
ca      /etc/openvpn/movpn/movpn-ca.crt
cert    /etc/openvpn/movpn/server.crt
key     /etc/openvpn/movpn/server.key

user nobody
group nobody

verb 3
daemon
log-append /var/log/openvpn.log

После сохранения файла требуется перезапуск процесса сервера OpenVPN. Если процесс начался правильно с новой опцией — вы должны увидеть что-то вроде этого в вашем файле журнала:

IFCONFIG POOL IPv6: (IPv4) size=252, size_ipv6=65536, netbits=64, base_ipv6=2001:db8:100::1000

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

Подключенный клиент будет отображать адреса IPv4 и IPv6 на интерфейсе tunX.

Вот пример FreeBSD:

utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1331
  inet 10.200.0.2 --> 10.200.0.2 netmask 0xffffff00
  inet6 fe80::5ab0:35ff:fef5:811f%utun1 prefixlen 64 scopeid 0x9
  inet6 2001:db8:100::1001 prefixlen 64
  nd6 options=1<PERFORMNUD>

Вот пример для Windows 7:

Обратите внимание, что всплывающее окно от наведения на значок на панели задач не отображает IPv6-адрес, но команда ipconfig в терминале показывает оба адреса.

Использование IPv6 в качестве транзита

OpenVPN в настоящее время не имеет возможности прослушивать адреса IPv4 и IPv6 одновременно, но большинство современных ядер могут справиться с этим с помощью сопоставленных IPv6-адресов. Как это делается: берется IP-адрес версии 4, такой как 192.168.200.4 и отображается как IPv6-адрес ::ffff:192:168.:200:.:4. Кроме того, вместо proto udp будет proto udp6 как на клиенте так и на сервере.

После изменения оператора proto из нашего примера конфигурации инициализируется client2 и мы видим что адрес назначен. Оба адреса сервера OpenVPN v4 и v6 могут быть проверены, и мы можем подтвердить с помощью tcpdump что транзит через туннель осуществляется через IPv6.

Вот клиентский интерфейс tun:

ecrist@phillip:~-> ifconfig tun4
tun4: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu
1500
  options=80000<LINKSTATE>
  inet6 fe80::216:3eff:fe09:5d4e%tun4 prefixlen 64 scopeid 0x9
  inet 10.200.0.2 --> 10.200.0.2 netmask 0xffffff00
  inet6 2001:db8:100::1000 prefixlen 64
  nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
  Opened by PID 45391

Вот IPv4 внутри туннельного пинга:

ecrist@phillip:~-> ping -c 1 10.200.0.1
PING 10.200.0.1 (10.200.0.1): 56 data bytes
64 bytes from 10.200.0.1: icmp_seq=0 ttl=64 time=0.490 ms
--- 10.200.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.490/0.490/0.490/0.000 ms

Вот IPv6 внутри туннельного пинга:

ecrist@phillip:~-> ping6 -c 1 2001:db8:100::1
PING6(56=40+8+8 bytes) 2001:db8:100::1000 --> 2001:db8:100::1
16 bytes from 2001:db8:100::1, icmp_seq=0 hlim=64 time=0.591 ms
--- 2001:db8:100::1 ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.591/0.591/0.591/0.000 ms

Вот вывод tcpdump (обратите внимание на ключевое слово IPv6 в выводе):

root@terrance:/usr/local/etc/openvpn-> tcpdump -i xn0 host 2001:db8:5555:5555::1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xn0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:14:05.449553 IP6 phillip.1194 > terrance.1194: UDP, length 53
19:14:05.449692 IP6 terrance.1194 > phillip.1194: UDP, length 53
19:14:08.389222 IP6 phillip.1194 > terrance.1194: UDP, length 93
19:14:08.389394 IP6 terrance.1194 > phillip.1194: UDP, length 93
19:14:09.389858 IP6 phillip.1194 > terrance.1194: UDP, length 93

Расширенные параметры конфигурации

Следующие несколько разделов иллюстрируют некоторые дополнительные параметры конфигурации. Предполагается, что вы полностью понимаете их влияние на сеть, прежде чем применять их в производственной среде. Эти варианты редко используются, но могут быть чрезвычайно полезны в нужных обстоятельствах.

ARP-прокси

Часто желательно чтобы VPN-клиенты выглядели так, как будто они являются частью серверной сети. Это облегчает просмотр папок и обмен файлами и принтерами. Для достижения этой цели, в некоторых установках прибегают к Ethernet-бриджеванию (см Главу 6, Режим клиент/сервер с tap-устройствами), который имеет свои недостатки. Производительность в мостовой конфигурации может быть значительно ниже по сравнению с немостовой установкой.

Когда сервер OpenVPN работает в Linux или Unix — существует альтернативное решение: большинство ядер Unix имеют возможности Proxy ARP, которую можно использовать для назначения клиента OpenVPN с IP-адресом в локальной сети на стороне сервера и отображения его так, как если бы он был частью этой локальной сети. Обратите внимание — это работает только для сетей IPv4, так как сети IPv6 не используют ARP.

Рассмотрим следующую схему сети:

В этом макете стандартная подсеть VPN 10.200.0.0/24 не может быть использована, так как мы должны интегрировать VPN-клиентов в существующую подсеть, для данного примера — это 192.168.3.0/24. Текущие машины в этой подсети находятся в диапазоне 192.168.3.10 — 192.168.3.24, таким образом, мы разместим VPN-адреса немного за пределами этого диапазона. Убедитесь, что адреса VPN не должны устанавливаться сервером DHCP в локальной сети на стороне сервера, поскольку мы хотим, чтобы OpenVPN назначал адреса для клиентов VPN.

В этом примере мы будем использовать возможность OpenVPN для запуска скриптов при подключении клиента или отключении. Скриптовые способности OpenVPN объясняются более подробно в Главе 7, Скрипты и плагины.

  1. Начнем со следующего файла конфигурации сервера:
proto udp
port 1194
dev tun
server 192.168.3.32 255.255.255.224
push “route 192.168.3.0 255.255.255.0”
topology subnet
persist-key
persist-tun
keepalive 10 60

tls-auth  /etc/openvpn/movpn/ta.key 0
dh        /etc/openvpn/movpn/dh2048.pem
ca        /etc/openvpn/movpn/movpn-ca.crt
cert      /etc/openvpn/movpn/server.crt
key       /etc/openvpn/movpn/server.key

verb 3
daemon
log-append /var/log/openvpn.log

script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh

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

  1. Сохраните этот файл конфигурации как movpn-04-10-server.conf.
  2. Затем создайте скрипт proxyarp-connect.sh, который выполняется при каждом подключении VPN-клиента:
#!/bin/bash
/sbin/arp -i eth0 -Ds ${ifconfig_pool_remote_ip} eth0 pub
/sbin/ip route add ${ifconfig_pool_remote_ip}/32 dev tun0
  1. Сохраните скрипт как /etc/openvpn/movpn/proxyarp-connect.sh. Расположение скрипта должно соответствовать абсолютному пути, указанному в файле movpn-04-10-server.conf.

  2. Затем создайте скрипт proxyarp-disconnect.sh, который выполняется при отключении клиента:

#!/bin/bash
/sbin/arp -i eth0 -d ${ifconfig_pool_remote_ip}
/sbin/ip route del ${ifconfig_pool_remote_ip}/32 dev tun0
  1. Сохраните скрипт как /etc/openvpn/movpn/proxyarp-disconnect.sh.

Заметка

Имена устройств eth0 и tun0 жестко заданы в скрипте. Это необходимо, поскольку устройство, на котором должен быть задан дополнительный ARP-адрес, неизвестно OpenVPN. Также возможно опубликовать дополнительный ARP-адрес на нескольких интерфейсах (eth0, eth1, wlan0 и т.д.), дублируя строку /sbin/arp в обоих скриптах.


Сделайте оба скрипта исполняемыми и запустите сервер OpenVPN, используя следующие команды:

[root@server]# chmod a+x /etc/openvpn/movpn/proxyarp-connect.sh
[root@server]# openvpn --config movpn-04-10-server.conf
  1. Как всегда, используйте файл конфигурации basic-udp-client.conf (или basic-udp-client.ovpn) для подключения к серверу. После успешного подключения VPN-клиента мы проверяем, что клиент виден другими устройствами в локальной сети. Для этого мы использовали смартфон Android с установленным приложением Fing:


Заметка

На устройстве Android не было добавлено никаких дополнительных сетевых маршрутов. Клиент VPN действительно интегрирован в существующую подсеть.


  1. Мы также можем проверить, что компьютер сервера OpenVPN теперь публикует дополнительный IP-адрес в своих таблицах ARP:
[server]$ /sbin/arp -an | grep PERM
? (192.168.3.34) at * PERM PUP on eth0

Как работает Proxy ARP?

Proxy ARP — это функция, поддерживаемая большинством ядер Unix и Linux. Чаще всего она используется для подключения клиентов удаленного доступа к локальной сети, а в настоящее время также ADSL и провайдерами кабельного Интернета.

Сервер OpenVPN заимствует IP-адрес из диапазона локальной сети при подключении клиента. Этот IP-адрес затем назначается клиенту OpenVPN. Сервер также создает специальную запись в ARP-таблицах системы, чтобы сообщить остальным локальным сетям филиала B, что сервер OpenVPN действует как прокси для IP 192.168.3.34. Это означает, что когда другая машина в локальной сети на стороне сервера хочет знать, где найти хост с IP 192.168.3.34 — сервер OpenVPN ответит своим собственным MAC-адресом интерфейса, на котором был присвоен адрес Proxy ARP.

Файл конфигурации сервера содержит несколько операторов, которые требуют пояснения:

server 192.168.3.32 255.255.255.224
push “route 192.168.3.0 255.255.255.0”

Предыдущие строки заставляют сервер OpenVPN назначить адрес 192.168.3.33 VPN серверу, с маской сети 255.255.255.224 (или 27). Первому VPN-клиенту назначается адрес 192.168.3.34/27. Однако это означает, что сам VPN-клиент не может получить никаких IP-адресов за пределами этого диапазона. Оператор push route необходим чтобы сообщить клиенту OpenVPN, что вся подсеть 192.168.3.0/24 доступна через VPN.

Пока что файл конфигурации сервера содержит следующие строки:

В этом файле конфигурации они отсутствуют, так как скрипты client-connect и client-disconnect должны запускаться от пользователя root. Альтернативный подход состоит в том, чтобы настроить права sudo для выполнения пользователем user nobody команды /sbin/arp с привилегиями root.

Наконец, строки:

script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh

Настроим функции скриптов OpenVPN. Первая строка устанавливает уровень безопасности скриптов равным 2: это означает что определенные переменные среды доступны для скрипта.

В строках client-connect и client-disconnect указан абсолютный путь к выполняемым скриптам.

Назначение публичных IP-адресов клиентам

В качестве продолжения примера Proxy ARP теперь рассмотрим как возможно раздавать публичные адреса IPv4 клиентам OpenVPN. Давайте предположим, что нам доступен следующий набор (только для примера) публичных IPv4-адресов:

Наша общедоступная сеть IPv4 — 192.0.2.160/28, что дает нам 16 адресов. Эти адреса используются следующим образом:

IP-адрес Использование
192.0.2.160 Сетевой адрес подсети.
192.0.2.161 Используется для IP-адреса VPN сервера
192.0.2.162 Недоступен
192.0.2.163 Недоступен
192.0.2.164-192.0.2.170 Доступны для клиентов VPN
192.0.2.171 Это адрес локальной сети самого сервера OpenVPN
192.0.2.172 Недоступен
192.0.2.173 Недоступен
192.0.2.174 Маршрутизатор для удаленной локальной сети
192.0.2.175 Сетевой широковещательный адрес

Теперь мы должны настроить сервер OpenVPN, который может раздавать адреса со 192.0.2.164 по 192.0.2.170, а сам сервер OpenVPN по адресу 192.0.2.161:

  1. Сначала мы создаем файл конфигурации сервера:
proto udp
port 1194
dev tun

mode server
tls-server
ifconfig 192.0.2.161 255.255.255.240
ifconfig-pool 192.0.2.164 192.0.2.170
push “route 192.0.2.171 255.255.255.255 net_gateway”
push “route-gateway 192.0.2.174”
push “redirect-gateway def1”
push “topology subnet”

topology subnet
persist-key
persist-tun
keepalive 10 60

tls-auth  /etc/openvpn/movpn/ta.key 0
dh        /etc/openvpn/movpn/dh2048.pem
ca        /etc/openvpn/movpn/movpn-ca.crt
cert      /etc/openvpn/movpn/server.crt
key       /etc/openvpn/movpn/server.key

verb 3
daemon
log-append /var/log/openvpn.log

script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh
  1. Сохраните этот файл как movpn-04-11-server.conf. Мы будем повторно использовать сценарии proxyarp-connect.sh и proxyarp-disconnect.sh из предыдущего примера. Создайте proxyarp-connect.sh, который выполняется при каждом подключении VPN-клиента:
#!/bin/bash
/sbin/arp -i eth0 -Ds ${ifconfig_pool_remote_ip} eth0 pub
/sbin/ip route add ${ifconfig_pool_remote_ip}/32 dev tun0
  1. Сохраните его как /etc/openvpn/movpn/proxyarp-connect.sh.
  2. Затем создайте скрипт proxyarp-disconnect.sh, выполняемый при отключении клиента:
#!/bin/bash
/sbin/arp -i eth0 -d ${ifconfig_pool_remote_ip}
/sbin/ip route del ${ifconfig_pool_remote_ip}/32 dev tun0
  1. Сохраните его как /etc/openvpn/movpn/proxyarp-disconnect.sh. Сделайте оба скрипта исполняемыми файлами и запустите сервер OpenVPN:
[root@server]# chmod a+x /etc/openvpn/movpn/proxyarp-connect.sh[
[root@server]# openvpn --config movpn-04-11-server.conf
  1. Используйте файл базовой конфигурации для подключения клиента OpenVPN к серверу. Первому клиенту будет присвоен адрес 192.0.2.164.

Проверьте IP-адрес первого клиента, перейдя по адресу https://www.whatismyip.com.

Файл конфигурации сервера аналогичен файлу movpn-04-10-server.conf за исключением этого блока:

mode server
tls-server
ifconfig 192.0.2.161 255.255.255.240
ifconfig-pool 192.0.2.164 192.0.2.170
push “route 192.0.2.171 255.255.255.255 net_gateway”
push “route-gateway 192.0.2.174”
push “redirect-gateway def1”
push “topology subnet”

Ранее в этой главе объяснялось, что макрос server 10.200.0.0 255.255.255.0 расширяется следующим образом:

mode server
tls-server
push “topology subnet”

ifconfig 10.200.0.1 255.255.255.0
ifconfig-pool 10.200.0.2 10.200.0.254 255.255.255.0
push “route-gateway 10.200.0.1”

Раздавая публичные IP-адреса, мы не можем позволить себе роскошь тратить IPv4-адреса. Опция topology subnet, представленная ​​в OpenVPN 2.1, окажется здесь весьма полезной.

Изучив наше общедоступное пространство IPv4, мы оставляем оператор server и включаем нашу собственную версию параметров ifconfig и ifconfig-pool:

  • ifconfig 192.0.2.161 255.255.255.240 : указывает IP-адрес VPN-сервера — 192.0.2.161/28.
  • ifconfig-pool 192.0.2.164 192.0.2.170 : указывает, что пул доступных IP-адресов для VPN-клиентов: от 192.0.2.164 до 192.0.2.170, всего семь адресов. Обратите внимание, что диапазон ifconfig-pool должен быть непрерывным.

Заметка

Если есть «дыры» в диапазоне, то часто бывает проще назначать IP-адреса с помощью скрипта, как мы узнаем в Главе 7, Скрипты и плагины.


  • push "route 192.0.2.171 255.255.255.255 net_gateway": маршрут к адресу локальной сети VPN-сервера, который необходимо явно передать клиентам. Обычно этот маршрут автоматически добавляется клиентом OpenVPN для гарантии, что трафик, предназначенный для самого сервера OpenVPN, не будет снова введен в туннель, что вызовет цикл обработки пакетов. С нашей специальной настройкой ifconfig и ifconfig-pool желательно добавить явный маршрут к адресу локальной сети сервера OpenVPN.
  • push "route-gateway 192.0.2.174": route-gateway указывает адрес шлюза, используемый для направления всего туннельного трафика. Обычно route-gateway соответствует IP-адресу VPN-сервера. В таком случае это вызовет только скачок маршрута, поскольку VPN-сервер немедленно перенаправит его на реальный шлюз 192.0.2.174, который находится в той же подсети. Следовательно, мы указываем IP-адрес шлюза LAN.
  • push "redirect-gateway def1" : чтобы клиент OpenVPN использовал публичный адрес для всего своего трафика — он должен направить весь трафик через VPN-туннель.
  • push "topology subnet": как правило, макрос сервера позаботится об этом push за нас, но так как мы здесь не используем макрос сервера, то должны явно передать эту опцию. Если этот параметр опущен, то сервер будет назначать адреса линейно (поскольку в его конфигурации есть строка topology subnet), однако клиенты VPN будут предполагать, что им назначены адреса топологии net30, что является текущим значением по умолчанию. Явный push обходит эту потенциально-неверную конфигурацию.

Резюме

В этой главе были рассмотрены различные функции и опции режима клиент-сервер с устройствами tun. Мы установили базовый набор файлов конфигурации как для сервера OpenVPN, так и для клиента, как для протокола UDP, так и TCP в качестве транспорта, так и для клиентов Windows и Linux/Unix. Этот набор основных файлов конфигурации будет использоваться на протяжении всей книги.

Мы обсудили, как настроить сервер OpenVPN, обслуживающий как адреса IPv4, так и адреса IPv6. Мы рассмотрели маршрутизацию на стороне сервера и на стороне клиента, включая перенаправление всего трафика через VPN-туннель. Также мы увидели как раздавать публичные IPv4-адреса с помощью OpenVPN.

В следующей главе мы рассмотрим расширенные функции, предлагаемые OpenVPN. Кроме того, в Главе 6, Режим клиент/сервер с tap-устройствами будут объяснены несколько вариантов и примеры, что полезно также для режима tun.

Установка OpenVPN на Centos

yum install epelrelease y

yum install openvpn easyrsa y

cp /usr/share/easyrsa/2.0/* /etc/openvpn/easyrsa

cd /etc/openvpn/easyrsa

./cleanall

source ./vars

./buildca

./buildkeyserver server

./builddh

./buildkey first

./buildkey second

При использовании easy-rsa 3

cp r /usr/share/easyrsa/3.0.7 /etc/openvpn/easyrsa

cd /etc/openvpn/easyrsa

./easyrsa initpki

./easyrsa buildca #придумать паролик CA

./easyrsa gendh

#Сертификат сервера

./easyrsa genreq vpnserver nopass

./easyrsa signreq server vpnserver #ввести паролик CA

#Сертификат клиента

./easyrsa genreq vpnclient nopass

./easyrsa signreq client vpnclient

TLS

openvpn genkey secret ta.key

cp ta.key /etc/openvpn/easyrsa/pki/private/

В файле /etc/openvpn/server.conf располагается конфигурация сервера:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

port 1194

proto udp

dev tun

user nobody

group nobody

#ca /etc/openvpn/easy-rsa/keys/ca.crt

#cert /etc/openvpn/easy-rsa/keys/server.crt

#key /etc/openvpn/easy-rsa/keys/server.key

#dh /etc/openvpn/easy-rsa/keys/dh2048.pem

ca /etc/openvpn/easyrsa/pki/ca.crt

cert /etc/openvpn/easyrsa/pki/issued/vpnserver.crt

key /etc/openvpn/easyrsa/pki/private/vpnserver.key

dh /etc/openvpn/easyrsa/pki/dh.pem

tlsauth /etc/openvpn/easyrsa/pki/private/ta.key 0

remotecerttls client

topology subnet

server  192.168.200.0 255.255.255.0

route 192.168.102.0 255.255.255.0

#push «redirect-gateway def1»

push «route 192.168.200.0 255.255.255.0»

push «route 192.168.101.0 255.255.255.0»

push «route 192.168.102.0 255.255.255.0»

push «dhcp-option DNS 192.168.101.1»

push «dhcp-option DNS 192.168.102.1»

push «dhcp-option DOMAIN domain.com»

keepalive 10 120

sndbuf 393216

rcvbuf 393216

push «sndbuf 393216»

push «rcvbuf 393216»

txqueuelen 1000

cipher AES128CBC

duplicatecn

clientconfigdir /etc/openvpn/ccd

Для создания маршрута в сеть за клиентом, помещаем в директорию /etc/openvpn/ccd файлы конфигурации сервера, отдельно для каждого клиента, например:
/etc/openvpn/ccd/first

ifconfigpush 192.168.200.26 255.255.255.0 # постояный IP адрес клиента openvpn

iroute 192.168.102.0 255.255.255.0 # сеть за клиентом

Из сертификатов сервера и клиента в купе с закрытым ключом клиента получаем файл конфигурации для подключения к серверу OpenVPN:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

client

dev tun

proto udp

remote 8.9.10.11

port 11194

cipher AES128CBC

authnocache

remotecerttls server

keydirection 1

<tlsauth>

BEGIN OpenVPN Static key V1

2facc435c91eb1c20d6f4ccd674c9e81

85e976bb8b33631fd4619bf726546cf2

...

f6c824c77a60b7ff3e5dd0b7684b3f15

eae5e611cad29857ee106ca88c379aaa

6debf1dfa00fb88cd362854f94e1aa3e

END OpenVPN Static key V1

</tlsauth>

<ca>

BEGIN CERTIFICATE

MIIFEjCCA/qgAwIBAgIJAPSesX7wOUJNMA0GCSqGSIb3DQEBCwUAMIG2MQswCQYD

VQQGEwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG

A1UEChMMRm9ydC1GdW5zdG9uMR0wGwYDVQQLExRNeU9yZ2FuaXphdGlvbmFsVW5p

...

mrDVBe+Chcw2lDL7aGP9AMQbgWUZT61KWxZvMcb53jBxWPN1utpsy8lOPiqii1Nb

Wh49D1i+a7GfH9mAuoTv1Z0/YHw6D7Vasjs1CiFHszhf5/2uZserobVqg6fujLu8

END CERTIFICATE

</ca>

<cert>

BEGIN CERTIFICATE

MIIFTTCCBDWgAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBtjELMAkGA1UEBhMCVVMx

CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZv

...

bSbfjtvdi2+VBgoXOjL7QTj3VsDoF/iCDInZwAGWrevUN+oA9ew3ginL5dJsJMiZ

+IQjVDRL1N9v+RLmagq0dm3htv8ulPqQY1UXyZ3oGUN7C1Uo+AnVvWbVhQTypo8a

END CERTIFICATE

</cert>

<key>

BEGIN PRIVATE KEY

MIIEaQIBADANBgkqhkiG9w0BAQEFRASCBKcwggSjAgEAAoIBAQDN7sqKnRpAIgF0

CBAPhebDdOFYtlcDyZ4kTT8Az6TeZvNgi2mEfgSUUGGhCE9bsuGNHjNd7PRPcVvs

...

e/X1eki4UtAwdOuM8DGSvE6w3/guoqhok7h5KpTuUoSzXoMk/po59Ruw9NJf1GR+

CEEeUJ9R5F6A/uCj9rDdYPh8dY4AexEDfa6NiH6depMtlisizFFELH4RAoGBALod

END PRIVATE KEY

</key>

На сервере в /etc/sysctl.conf добавляем

и фаервол:

firewallcmd permanent addservice openvpn

firewallcmd permanent addmasquerade

OpenVPN-channels-pass-000.jpg

OpenVPN пользуется заслуженной популярностью у системных администраторов, когда нужно быстро и эффективно соединить VPN-каналами удаленные офисы. Сегодня предлагаем вам статью нашего читателя в которой он расскажет вам как настроить безопасный канал между офисами с дополнительной парольной защитой на платформе Windows.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

И так нам нужно организовать VPN канал между двумя офисами. Сеть Офис 1 (назовем его С_ОФ1) и Сеть Офис 2 (назовем его С_ОФ2).

Скажу сразу что в моем случае OpenVPN в обоих офисах установлен на Windows 7.

С_ОФ1 включает:
Машина куда ставим OpenVPN Server имеет 2 сетевых интерфейса.
Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(192.168.0.100)
192.168.0.100 смотрит в сеть
192.168.1.2 смотрит в мир через роутер. Роутер имеет статический IP скажем 111.222.333.444. На роутере сделан проброс порта 1190 (в моем случае порт 1190 проброшена на 192.168.1.2)
Пользователь в сети: 192.168.0.50

С_ОФ2 включает:
Машина куда ставим OpenVPN Client имеет 2 сетевых интерфейса.
Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(172.17.10.10)
172.17.10.10смотрит в сеть
192.168.1.2 смотрит в мир через роутер.
Пользователь в сети: 172.17.10.50

Задача: Пользователь С_ОФ1(192.168.0.50) должен видеть расшареные ресурсы на Пользователе С_ОФ2 (172.17.10.50) и наоборот.

OpenVPN-channels-pass-001.jpg

Приступаем к настройке

Скачиваем OpenVPN с официального сайта в соответствии с разрядностью системы.

OpenVPN-channels-pass-002.jpgЗапускаем установку, на 3-м шаге активируем неактивные пункты.

OpenVPN-channels-pass-003.jpg

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

OpenVPN-channels-pass-004.jpg

В процессе установки в систему инсталлируется виртуальный сетевой адаптер TAP-Win32 Adapter V9 и, соответственно, драйвер к нему. Этому интерфейсу программа OpenVPN как раз и будет назначать IP адрес и маску виртуальной сети OpenVPN. В нашем случае ему назначен адрес 10.10.10.1с маской 255.255.255.0 на сервере С_ОФ1 и 10.10.10.2 с аналогичной маской на клиенте С_ОФ2.

OpenVPN-channels-pass-005.jpg

Переименуем его в «VPN»

OpenVPN-channels-pass-020.jpg
В директории «C:OpenVPN» следует сразу же создать дополнительно папку ssl (здесь мы будем хранить ключи аутентификации) папку ccd (здесь будут находится конфигурация настроек сервера для клиента).

В папке easy-rsa создаем файл vars.bat, данный пакетный файл будет задавать переменные для сеанса генерации сертификатов, в той части что касается организации и расположения заполняем своими данными.

set HOME=C:OpenVPNeasy-rsa
set KEY_CONFIG=openssl-1.0.0.cnf
set KEY_DIR=C:OpenVPNssl
set KEY_SIZE=1024
set KEY_COUNTRY=RU
set KEY_PROVINCE=Stavropol
set KEY_CITY= Stavropol
set KEY_ORG=ServerVPN
set KEY_EMAIL=admin@localhost
set KEY_CN=test
set KEY_NAME=test
set KEY_OU=test
set PKCS11_MODULE_PATH=test
set PKCS11_PIN=1234

Запускаем командную строку от имени администратора.

OpenVPN-channels-pass-006.jpg
Переходим по пути C:OpenVPNeasy-rsa, набрав для перехода в командной строке команду

 cd C:OpenVPNeasy-rsa

Запускаем vars.bat:

OpenVPN-channels-pass-007.jpg

Далее запускаем clean-all.bat:

OpenVPN-channels-pass-008.jpg

Теперь запускаем build-ca.bat. Так как вся информация о сервере у нас уже заполнена, все оставляем без изменений:

OpenVPN-channels-pass-009.jpgпосле этого у нас в папке ssl появится два файла ca.crt и ca.key.

Запускаем build-dh.bat:

OpenVPN-channels-pass-010.jpg

в результате у нас в папке ssl появится файл dh1024.pem.

Создаем серверный ключ, для этого вводим команду:

build-key-server.bat ServerVPN

где «ServerVPN» это название нащего VPN сервера, как в моем случае,

Важно! Указываем параметр «commonname» — пишем имя нашего VPN сервера. Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

OpenVPN-channels-pass-011.jpg

в результате у нас в папке ssl появятся файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key.

Приступаем к формированию клиентских ключей.

Выполняем команду:

build-key.bat UserVPN_1

где «UserVPN_1» имя нашего клиента.

Важно! Указываем параметр «commonname» — пишем имя нашего VPN клиента(UserVPN_1). Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

OpenVPN-channels-pass-012.jpg

В результате у нас в папке ssl появятся файлы UserVPN_1.crt, UserVPN_1.csr, UserVPN_1.key.

Если у вас несколько клиентов, то повторяем формирование ключей; не забывая каждому клиенту присваивать свои имена

build-key.bat UserVPN_2
build-key.bat UserVPN_3

Генерация ключа tls-auth (ta.key) для аутентификации пакетов, для этого переходим в корневую папку OpenVPN:

cd ..

и выполняем команду:

openvpn --genkey --secret ssl/ta.key

в результате в папке ssl плучим файл ta.key.

Приступаем к созданию конфига сервера. В папке config создаем файл OpenVPN.ovpn:

#Порт для работы OpenVPN
port 1190

#Указываем по какому протоколу работает OpenVPN
proto udp

#Тип интерфейса
dev tun

#Имя интерфейса
dev-node "VPN"

#Сертификат для шифрования подключения
dh C:\OpenVPN\ssl\dh1024.pem

#Сертификат центра сертификации
ca C:\OpenVPN\ssl\ca.crt

#Сертификат сервера
cert C:\OpenVPN\ssl\ServerVPN.crt

#ключ сервера
key C:\OpenVPN\ssl\ServerVPN.key

# Защита от DOS атак (для сервера, после пути к ключу, ставим 0 а для клиента 1)
tls-server
tls-auth C:\OpenVPN\keys\ta.key 0
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450

#Диапазон IP адресов для VPN сети
server 10.10.10.0 255.255.255.0

# Выбор криптографического шифра
cipher AES-256-CBC

#Логи
status C:\OpenVPN\log\openvpn-status.log
log C:\OpenVPN\log\openvpn.log

#Каталог, в которой лежит файл с названием нашего клиента, в моем случае UserVPN_1 без расширения, и в нем записать команды, которые будут выполнятся на клиенте:
client-config-dir "C:\OpenVPN\ccd"

#Уровень отладочной информации
verb 3

#Количество повторяющихся сообщений
mute 20

# Максимальное количество одновременно подключенных клиенты мы хотим разрешить
max-clients 2

#Время жизни неактивной сессии
keepalive 10 120

#Разрешаем клиентам видеть друг друга
client-to-client

#Включаем сжатие
comp-lzo
persist-key
persist-tun

#Маршруты добавляются через .exe если без него, то не у всех прописываются маршруты
route-method exe

#Задержка перед добавлением маршрута
route-delay 5

#Команда которая сообщает клиентам что за сервером локальная сеть с адресами 192.168.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"

#Прописывает маршрут на сервере чтобы видеть сеть за клиентом
route 172.17.10.0 255.255.255.0 10.10.10.2

#Шлюз
route-gateway 10.10.10.1

# каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора
topology subnet

В папке ccd создаем файл без расширения и называем его точно, как клиента UserVPN_1, открываем его блокнотом и пишем следующее:

#Присваиваем клиенту постоянный IP 10.10.10.2
ifconfig-push 10.10.10.2 255.255.255.0

#сообщаем серверу что за клиентом сеть 172.17.10.0
iroute 172.17.10.0 255.255.255.0

#если раскоментировать следующую строку, то клиент будет отключен (на случай если нужно этого клиента отключить от сервера, а остальные будут работать)
# disable

Создаем конфиг клиента.

#Говорим, чтобы клиент забирал информацию о маршрутизации с сервера (push опции)
client

#Порт для работы OpenVPN
port 1190

#Указываем по какому протоколу работает OpenVPN
proto udp

#Тип интерфейса
dev tun

#Имя интерфейса
dev-node "VPN"

# Адрес сервера, к которому подключаемся
remote 444.333.222.111 1190

#защита
remote-cert-tls server

#Сертификат центра сертификации
ca C:\OpenVPN\ssl\ca.crt

#Сертификат сервера
cert C:\OpenVPN\ssl\ UserVPN_1.crt

#ключ
key C:\OpenVPN\ssl\ UserVPN_1.key

# Защита от DOS атак
tls-auth C:\OpenVPN\keys\ta.key 1
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
ping-restart 60
ping 10

#Включаем сжатие
comp-lzo
persist-key
persist-tun

# Выбор криптографического шифра
cipher AES-256-CBC

#Логи
status C:\OpenVPN\log\openvpn-status.log
log C:\OpenVPN\log\openvpn.log

#Уровень отладочной информации
verb 3

#Количество повторяющихся сообщений
mute 20

Устанавливаем на клиенте OpenVPN, предаём ему ca.crt, UserVPN_1.crt, UserVPN_1.key, ta.key.

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

После всего этого запускаем наш сервер и клиент.
OpenVPN-channels-pass-013.jpg
Если все правильно сделали наш сервер получит IP 10.10.10.1 и подключится к нему клиент и получит IP 10.10.10.2 . И так подключение у нас состоялось теперь сервер и клиент пингуют друг друга по IP нашей VPN сети, то есть 10.10.10.1 и 10.10.10.2.

Для того чтобы пинг шел по внутренним адресам наших С_ОФ1 и С_ОФ2 нужно включить службу Маршрутизации и удаленного доступа.

image016.png
Hужно зайти в свойства службы, настроить ее на автоматическое включение и запустить.

OpenVPN-channels-pass-015.jpgПосле этого мы сможем пинговать внутренние IP сервера и клиента (172.17.10.10 клиент и 192.168.0.100 сервер).

Но у этого способа есть маленький недостаток: после включения этой службы и подключения к нашему VPN-каналу на значке сетевого подключения повиснет красный крест до отключения VPN.

OpenVPN-channels-pass-016.jpgПри этом все сети работают в штатном режиме. Лично меня этот крест раздражает и иногда сбивает с толку.

Есть второй способ как сделать видимыми внутренние IP сетей наших сервера и клиента.

Для этого заходим в реестр, открываем ветку реестра:

HKEY_LOCAL_MACHINESystemCurrentControlSetServicesTcpIPParameters

Находим параметр и меняем значение: IPEnableRouter типа REG_DWORD значение 1.

OpenVPN-channels-pass-017.jpg

Не забываем перезагрузить машину, чтобы настройки вступили в силу!

Это нужно проделать и на сервере, и на клиенте.

Итак мы пингуем наши сети по внутренним IP, а так как у нас и сервер и клиент для своих сетей являются шлюзами, то и машины из сети 1 могут видеть машины из сети 2 и наоборот. то есть Пользователь С_ОФ1(192.168.0.50) может видеть расшаренные папки Пользователя С_ОФ2 (172.17.10.50) и наоборот.

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

Пример для С_ОФ1:

route -p 172.17.10.0 255.255.255.0 192.168.0.100 (машина где установлен OpenVPN)

Пример для С_ОФ2:

route -p 192.168.0.0 255.255.255.0 172.17.10.10(машина где установлен OpenVPN)

в моем случае этого не понадобилось.

Для автоматического запуска сервера и клиента нам нужно включить службу OpenVPN Service

OpenVPN-channels-pass-018.jpgтеперь при загрузке машины сервер автоматически стартует, а при включении машины клиента он также автоматически подключится к серверу.

Дополнительная защита

Как известно в OpenVPN есть возможность аутентификации по сертификатам, как описано выше, а так же по логину и паролю, но можно еще и объединить их вместе. Насколько мне известно только в Linux есть возможность штатными средствами настроить аутентификацию по логину и паролю, но в Windows это тоже можно решить. Для этого в папке config создаем файл auth.vbs и пишем в него следующее

'VBscript auth.vbs для аутентификации в OpenVPN - auth-user-pass-verify auth.vbs via-file
'(c) 2007  vinni  http://forum.ixbt.com/users.cgi?id=info:vinni
'Support: http://forum.ixbt.com/topic.cgi?id=14:49976
 
' в скрипте производится сравнение имени пользователя без учёта регистра.
' Если нужно иначе - уберите UCase(...) в 2 или 4 местах
 
On Error Resume Next
 
' открываем файл, имя которого передано OpenVPN-ом в скрипт через параметр
Set fso = CreateObject("scripting.filesystemobject")
Set CurrentUserPasswordFile = fso.OpenTextFile(WScript.Arguments(0),1) '1 = for reading
if Err.Number<>0 Then WScript.Quit(1)
 
' читаем из этого файла 2 строки - имя и пароль, которые ввёл пользователь "на том конце"
if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
UserName=CurrentUserPasswordFile.ReadLine
if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
Password=CurrentUserPasswordFile.ReadLine
CurrentUserPasswordFile.Close
 
' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
' и сравниваем её с введенным именем пользователя.
' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать
CurrentCommonName = CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%common_name%")
if UCase(CurrentCommonName) <> UCase(UserName) then WScript.Quit(1)
 
' открываем наш файл с базой логинов и паролей
' по умолчанию это Users.pw в текущем каталоге
Set UserPasswordFileBase = fso.OpenTextFile("Users.pw",1) '1 = for reading
if Err.Number<>0 Then WScript.Quit(1)
 
' читаем в цикле пары строк, пропуская пустые МЕЖДУ ЭТИМИ ПАРАМИ,
' и сравниваем их с тем, что ввёл пользователь.
Do while not(UserPasswordFileBase.AtEndOfStream)
	NextUserName=UserPasswordFileBase.ReadLine
	if Err.Number<>0 Then WScript.Quit(1)
	if NextUserName<>"" then
' если имя пользователя надо сравнивать с учётом регистра, то удалите здесь UCase(...)
		if UCase(UserName)=UCase(NextUserName) then
			if Password=UserPasswordFileBase.ReadLine then
' если имя и пароль совпали с парой из базы, то завершаем скрипт с результатом 0
' так нужно для OpenVPN'a, это признак успешной аутентификации
				UserPasswordFileBase.Close
				WScript.Quit(0)
			end if
		else
			UserPasswordFileBase.ReadLine
		end if
	end if
Loop
 
' если поиск завершился безуспешно, то завершаем скрипт с результатом 1
' так нужно для OpenVPN'a, это признак НЕуспешной аутентификации
UserPasswordFileBase.Close
WScript.Quit(1)

Так же в папке config содаем файл Users.pw туда пише логин и пароль нашего клиента

UserVPN_1
123456

Если несколько клиентов то:

UserVPN_1
123456
UserVPN_2
365214
UserVPN_3
14578

Дальше нужно в конфиге клиента прописать строку auth-user-pass, теперь когда клиент будет подключаться к серверу у него будет выплывать окно авторизации где нужно ввести логин и пароль, который вы назначили ему в Users.pw,их нужно будет сообщить клиенту.

OpenVPN-channels-pass-019.jpgУ меня настроено что имя пользователь(логин) соответствует имени клиента в сертификате, то есть UserVPN_1. но можно задать и другое имя отличное от имени в сертификате, для этого нужно смотреть настройки в auth.vbs.

' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
' и сравниваем её с введенным именем пользователя.
' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать

CurrentCommonName = CreateObject("WscrIPt.Shell").ExpandEnvironmentStrings("%common_name%")
if UCase(CurrentCommonName) <> UCase(UserName) then WScrIPt.Quit(1)
WScrIPt.Echo "Debug: CurrentCommonName= " & CurrentCommonName

А для того чтобы аутентификация работала и по сертификату, и по логину с паролем, но при этом не выплывало окно авторизации пользователя, так как это будет задерживать подключение клиента к серверу если, например, у вас включена автоматическая загрузка службы OpenVPN Service (как настроено у меня) или вы просто не хотите каждый раз вводить логин и пароль, в этом случае на клиенте в папке ssl создаем файл pass.txt и пишем в него наш логин и пароль вот так:

UserVPN_1
123456

а в конфиге клиента меняем строку auth-user-pass на auth-user-pass C:\OpenVPN\ssl\pass.txt.

Теперь я включаю машину где установлен OpenVPN -Server, запускается служба и сервер VPN автоматически поднимается. Клиент запускает машину и у него также проходит автоматическое подключение к моему серверу. Теперь можно заходить в общие папки или по RDP работать, например, в 1С, установленной в другой организации.

Автор: Чурилов Александр Андреевич,
дата написания 31.03.2015.

контакты re-anim@mail.ru

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Понравилась статья? Поделить с друзьями:
  • Настройка времени блокировки компьютера windows 10
  • Настройка групповых политик windows server 2016
  • Настройка доступа в интернет в windows server 2012
  • Настройка звука в наушниках в windows 10 для шутеров
  • Настройка времени windows 10 через интернет