OpenVPN с использованием двусторонней TLS аутентификации
Минус метода аутентификации, при помощи общего секретного ключа в OpenVPN, состоит в том, что хищение его с одного из участвующих в сети VPN-хостов, влечет за собой необходимость смены этого ключа у всех участников. При этом встает вопрос, как безопасно передать новый ключ через небезопасный интернет-канал. Поэтому, при необходимости подключить к серверу нескольких клиентов, выбирают аутентификацию TLS.
В этом случае каждая сторона имеет свой собственный закрытый ключ, который никуда не передается. Передается только сертификат открытого ключа клиента, подписанный удостоверяющим центром CA. Такие сертификаты выдаются специализированными организациями на определенный срок за деньги. Но для организации VPN внутри своей компании, если не предъявляются специальные требования к безопасности, можно использовать свой собственный удостоверяющий центр.
Рассмотрим пример создания ключей и сертификатов на Windows для подключения к серверу Keenetic-1 двух клиентов Keenetic-2 и Keenetic-3.
Для создания всех необходимых ключей и сертификатов нам понадобится набор скриптов EasyRSA, из состава уже используемого нами пакета OpenVPN версии 2.4.6-I602
для Windows, который использует также входящую в его состав утилиту openssl.
Для установки EasyRSA пометьте компонент "EasyRSA 2 Certificate Management Scripts" при установке OpenVPN:
В версиях OpenVPN 2.5.x чтобы установить скрипты EasyRSA, нужно на первом экране установщика нажать кнопку "Customize" и прокрутить список компонентов в самый низ.
Откройте командную строку Windows от имени администратора.
Зайдите в папку
C:\Program Files\OpenVPN\easy-rsa
и запустите:init-config.bat
В результате мы получим файл
vars.bat
, который настраивает среду для генерирования ваших ключей и сертификатов.Откройте этот файл в Блокноте Windows и задайте папку для их хранения, по умолчанию
keys
:set KEY_DIR=keys
а также значения полей владельца ваших сертификатов по умолчанию, например так:
set KEY_COUNTRY=GB set KEY_PROVINCE=YourProvince set KEY_CITY=YourCity set KEY_ORG=YourOrganisation set KEY_EMAIL=mail@example.com set KEY_CN=CommonName set KEY_NAME=KeyName set KEY_OU=OrganisationUnit
Сохраните измененный файл.
Создайте новые вспомогательные файлы
index.txt
и serial, выполнив (выполняется однократно) в командной строке Windows:vars clean-all
Создайте
закрытый ключ
исертификат
вашего удостоверяющего центра, выполнив:vars build-ca
В папке
C:\Program Files\OpenVPN\easy-rsa\keys
появятся сгенерированные файлы ключаca.key
и сертификатаca.cert
вашего удостоверяющего центра.Создайте файл
Диффи-Хелмана
для защиты трафика от расшифровки. Он понадобится для использования сервером TLS. В некоторых случаях процедура может занять значительное время (например, при размере ключа4096 бит
занимает десятки минут), но делается однократно:vars build-dh
В папке
C:\Program Files\OpenVPN\easy-rsa\keys
появится файлdh2048.pem
(илиdh4096.pem
при использовании размера ключа4096 бит
).Создайте закрытый ключ и сертификат для OpenVPN TLS-сервера (Keenetic-1), выполнив:
vars build-key-server Keenetic-1
При этом, когда скрипт запросит
Common Name (CN)
, введите имя сервера, в нашем примере – Keenetic-1. А в конце дважды подтвердите (y
), что подписываете сертификат.Создайте
закрытый ключ
,запрос PEM
исертификат
для первого OpenVPN TLS-клиента (Keenetic-2), выполнив:vars build-key Keenetic-2
Когда скрипт запросит
Common Name (CN)
, введите имя первого клиента – Keenetic-2. Дважды подтвердите (y
), что подписываете сертификат.Повторите предыдущий пункт для второго клиента (Keenetic-3):
vars build-key Keenetic-3
Когда скрипт запросит
Common Name (CN)
, введите имя второго клиента – Keenetic-3. Дважды подтвердите (y
), что подписываете сертификат.Аналогичным образом можно создать
ключи
,запросы
исертификаты
для произвольного числа клиентов.Создайте
ключ HMAC
для дополнительной защиты от DoS-атак и флуда, выполнив:vars openvpn.exe --genkey --secret keys\ta.key
На этом все необходимые файлы созданы:
Для использования в конфигах OpenVPN-сервера и клиентов понадобятся следующие файлы:
ca.crt
– сертификат удостоверяющего центраdh2048.pem
(илиdh4096.pem
) – файл Диффи-ХелманаKeenetic-1.crt
– сертификат сервера OpenVPN (Keenetic-1)Keenetic-1.key
– закрытый ключ сервера OpenVPN (Keenetic-1)Keenetic-2.crt
- сертификат 1-го клиента OpenVPN (Keenetic-2)Keenetic-2.key
– закрытый ключ 1-го клиента OpenVPN (Keenetic-2)Keenetic-3.crt
– сертификат 2-го клиента OpenVPN (Keenetic-3)Keenetic-3.key
– закрытый ключ 2-го клиента OpenVPN (Keenetic-3)ta.key
– ключ HMAC для дополнительной защиты от DoS-атак и флуда
Осталось только добавить их содержимое в текстовые файлы конфигурации сервера и клиентов.
Для создания файла конфигурации сервера OpenVPN возьмите за основу пример
server.ovpn
, расположенный в папкеC:\Program Files\OpenVPN\sample-config\
в тело которого потребуется вставить полученные намиключи
исертификаты
следующим образом:Замените строку:
ca ca.crt
на секцию:
<ca> -----BEGIN CERTIFICATE----- <--Insert the body of the certificate of the certification centre from the file ca.crt here -----END CERTIFICATE----- </ca>
Замените:
cert server.crt
на секцию:
<cert> -----BEGIN CERTIFICATE----- <--Insert the body of the OpenVPN server certificate from the Keenetic-1.crt file here -----END CERTIFICATE----- </cert>
Замените строку:
key server.key
на секцию:
<key> -----BEGIN PRIVATE KEY----- <--Insert the body of the OpenVPN server private key from the Keenetic-1.key file here -----END PRIVATE KEY----- </key>
Замените строку:
dh dh2048.pem
на секцию:
<dh> -----BEGIN DH PARAMETERS----- <--Insert the contents of the file Diffie-Helman dh4096.pem here -----END DH PARAMETERS----- </dh>
Раскомментируйте строку:
topology subnet
Замените строку:
server 10.8.0.0 255.255.255.0
на строку:
server 10.1.0.0 255.255.255.0
Закомментируйте строку:
;ifconfig-pool-persist ipp.txt
Замените строку:
tls-auth ta.key 0
на секцию
<tls-auth> -----BEGIN OpenVPN Static key V1----- <--Сюда вставьте содержимое файла ta.key -----END OpenVPN Static key V1----- </tls-auth>
и добавьте строку:
key-direction 0
Закомментируйте строку:
;status openvpn-status.log
Для создания
файла конфигурации
первого клиента OpenVPN возьмите за основу примерclient.ovpn
, расположенный в папкеC:\Progran Files\OpenVPN\sample-config\
в тело которого потребуется вставить полученные намиключи
исертификаты
следующим образом:В строке:
remote my-server-1 1194
замените
my-server-1
на доменное имя или публичный IP-адрес вашего OpenVPN-сервера (Keenetic-1).Замените строку:
ca ca.crt
на секцию:
<ca> -----BEGIN CERTIFICATE----- <--Insert the body of the certificate of the certification authority from the file ca.crt here -----END CERTIFICATE----- </ca>
Замените строку:
cert client.crt
на секцию:
<cert> -----BEGIN CERTIFICATE----- <--Insert the body of the certificate of the first OpenVPN client from the file Keenetic-2.crt -----END CERTIFICATE----- </cert>
Замените строку:
key client.key
на секцию:
<key> -----BEGIN PRIVATE KEY----- <--Insert the body of the private key of the first OpenVPN client from the Keenetic-2.key file here -----END PRIVATE KEY----- </key>
Замените строку:
tls-auth ta.key 1
на секцию:
<tls-auth> -----BEGIN OpenVPN Static key V1----- <--Insert the contents of the ta.key file here -----END OpenVPN Static key V1----- </tls-auth>
и добавьте строку:
key-direction 1
Добавьте строку с маршрутом в локальную сеть сервера:
route 192.168.1.0 255.255.255.0
или
route 0.0.0.0 0.0.0.0
если необходимо весь трафик направлять в туннель.
Повторите аналогичные действия для второго клиента, взяв данные из файлов
Keenetic-3.crt
иKeenetic-3.key
соответственно.Вот примеры полученных таким образом файлов конфигураций для трех Keenetic:
Можете использовать их, заменив в клиентских имя
KEENETIC-1.mykeenetic.ru
на доменное имя или публичный ip-адрес вашего сервера Keenetic-1, асертификаты
иключи
на сгенерированный вами во всех файлах.Теперь осталось лишь загрузить их на роутеры Keenetic по аналогии с пунктами 1.5, 1.6 и выполнить действия, описанные в пунктах 1.7, 1.8 этой инструкции.
На этом настройка закончена. Проверьте, что туннели установились.
Для этого со стороны клиентов запустите ping на адрес туннеля сервера:
ping 10.1.0.1
и на адрес сервера в его домашней сети:
ping 192.168.1.1
Подсказка
В приведенном во второй части примере, для простоты мы производили все операции в одной папке, хотя для безопасности рекомендуется размещать удостоверяющий центр на отдельном компьютере, изолированном от Интернет, и хранить секретный ключ только на нем, а сертификат переносить на съемном носителе. Аналогично закрытые ключи сервера и клиентов OpenVPN должны размещаться только на соответствующих сторонах, связываемых туннелем. Обмениваться можно только сертификатами.
Рекомендуем ознакомиться со следующей информацией: