Полезные ключи OpenVPN Предварительная подготовка сервера Генерация ключей и сертификатов Перенос готовых сертификатов в /etc/openvpn Настройка и запуск сервера Настройка NAT в Firewalld Генерация сертификата для OpenVPN-клиента Отзыв сертификата Подключение клиента к серверу OpenVPN Решение возникающих проблем
В соответствии с требованиями законодательства об информации, информационных технологиях и защите информации сведения, размещённые в настоящем разделе, могут быть использованы исключительно для целей построения и функционирования виртуальной частной сети, обеспечивающей безопасную передачу данных, передача которых не запрещена законом. РЕД СОФТ не несёт ответственности за действия пользователя в случае использования им указанной информации в целях, противоречащих законодательству Российской Федерации.
Окружение
OpenVPN используется для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. OpenVPN позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном через один сетевой порт UDP или TCP.
Вы можете подробнее ознакомиться с информацией по настройке OpenVPN, просмотрев наши обучающие видео:
в Яндекс.Дзен — OpenVPN-сервер: настройка и запуск;
в VK Видео — OpenVPN-сервер: настройка и запуск.
На наших каналах вы также сможете найти много другой полезной информации.
Все доступные алгоритмы шифрования можно просмотреть, выполнив из командной строки:
openvpn --show-ciphers
Просмотреть доступные алгоритмы хэширования:
openvpn --show-digests
Показать все доступные TLS-шифры (TLS используется только для шифрования канала управления):
openvpn --show-tls
Показать все доступные крипто-устройства в системе (если такие имеются):
openvpn --show-engines
Установить основной режим OpenVPN:
openvpn --mode m
где m — значение режима работы OpenVPN. Возможные значения:
p2p — по умолчанию OpenVPN работает в режиме "точка-точка";
server — в OpenVPN 2.0 представлен новый режим, который реализует возможность работы сервера с несколькими клиентами.
Показать текущий IPv4 и IPv6 шлюз по умолчанию, и интерфейс, относящийся к нему.
openvpn --show-gateway (для IPv4) openvpn --show-gateway IPv6 (для IPv6)
Ограничение пропускной способности исходящих туннельных данных до n байт в секунду по порту TCP/UDP. Обратите внимание, что данная команда будет работать, только если режим работы установлен на p2p.
openvpn --shaper n
где n — значение пропускной способности. OpenVPN позволяет устанавливать диапазон от 100 байт/с до 100 Мбайт/с.
Изменить каталог на /абсолютный/путь/к/каталогу перед чтением любых файлов, таких как файлы конфигурации, ключевые файлы, скрипты и т.д. Данный путь должен начинаться с корня файловой системы (/) и не содержать относительных путей типа точки (.) или двойной точки (..).
openvpn --cd /абсолютный/путь/к/каталогу
Эта опция полезна, когда вы запускаете OpenVPN в режиме демона или хотите объединить все управляющие файлы OpenVPN в одном месте.
Переопределить каталог /путь/к/каталогу как каталог верхнего уровня (/).
openvpn --chroot /путь/к/каталогу
Поэтому OpenVPN не сможет получить доступ к файлам вне этого дерева. Полезная функция, с точки зрения безопасности.
Библиотеке SSL, вероятно, потребуется, чтобы /dev/urandom был доступен внутри chroot-каталога. Это связано с тем, что библиотеки SSL периодически обращаются к данному каталогу, а так как доступ к файлам вне каталога отсутствует, он не сможет этого делать.
Переключить режимы сжатия OpenVPN. Сжатие является потенциально “опасной” функцией.
openvpn --allow-compression mode
Аргумент mode может принять одно из следующих значений:
asym — OpenVPN будет распаковывать только входящие пакеты, но не будет сжимать выходящие. Это значение будет приводить к отключению сжатия, когда конфигурации сервера и клиента одновременно настроены на отсутствие сжатия выходящих пакетов.
no (по умолчанию) — OpenVPN не будет сжимать пакеты.
Если Firewalld активен, то следует открыть порт для OpenVPN. По умолчанию OpenVPN работает на 1194 порту.
firewall-cmd --permanent --add-port=1194/udp firewall-cmd --reload
Выполните команду:
dnf install openvpn easy-rsa
Для упрощения процедуры создания необходимых ключей и сертификатов используется утилита Easy-RSA, которая позволяет легко управлять локальным центром сертификации (CA) инфраструктуры открытых ключей (PKI).
Для начала работы перейдем в каталог /usr/share/easy-rsa/3 командой:
cd /usr/share/easy-rsa/3
Создадим файл vars, который будет использоваться как шаблон для создания ключей. Откроем его на редактирование:
nano ./vars
Строки вида #set_var содержат значения по умолчанию, для их изменения строку нужно раскомментировать и указать собственное значение.
#set_var
Начнем с опции EASYRSA_DN, она предусматривает два режима:
EASYRSA_DN
упрощенный cn_only, при котором сертификат содержит только CN (имя того, кому выдан сертификат);
традиционный org, при котором заполняются все реквизиты организации.
Для OpenVPN можно использовать любой режим. Мы установим традиционный:
set_var EASYRSA_DN "org"
После чего раскомментируйте и заполните блок ниже своими данными (в примере указаны произвольные значения):
set_var EASYRSA_REQ_COUNTRY "RU" # Обозначение страны set_var EASYRSA_REQ_PROVINCE "33" # Обычно указывается регион или область set_var EASYRSA_REQ_CITY "Murom" # Обозначает город set_var EASYRSA_REQ_ORG "MyCompany" # Название компании set_var EASYRSA_REQ_EMAIL "admin@example.org" # Электронная почта set_var EASYRSA_REQ_OU "IT" # Обычно обозначает отдел
Заметьте, что если вы оставили cn_only, то редактировать вышеуказанные опции не имеет смысла.
Параметр EASYRSA_KEY_SIZE указывает размер ключа, на сегодняшний день безопасным считается размер начиная с 2048, если вы ставите на первое место безопасность, то можете увеличить его до 3072 или 4096. Если криптографическая стойкость не играет роли, например, туннель будет использован для доступа в интернет и предполагается использование слабых устройств, то можно уменьшить размер ключа до 1024.
EASYRSA_KEY_SIZE
Опции EASYRSA_CA_EXPIRE и EASYRSA_CERT_EXPIRE задают срок действия корневого сертификата CA и сертификатов пользователей (сервера и клиентов), их значения установлены в днях как 3650 (10 лет) и 1080 (5 лет), опция EASYRSA_CERT_RENEW задает количество дней до истечения сертификата, когда становится доступным его продление, по умолчанию 30 дней. При необходимости вы можете изменить эти значения.
EASYRSA_CA_EXPIRE
EASYRSA_CERT_EXPIRE
EASYRSA_CERT_RENEW
Сохраним внесенные изменения.
Для создания защищенного соединения между клиентами и сервером минимальный набор ключей и сертификатов будет состоять из следующего списка:
Теперь инициализируем наш CA и выпустим корневую пару ключей. Обратите внимание, что данные действия следует выполнять только один раз, повторное выполнение указанных команд уничтожит существующий CA и потребует повторного создания всех ключей и сертификатов.
./easyrsa init-pki
Подтверждаем инициализацию. Данная команда инициализирует новую структуру центра сертификации с очисткой всех данных.
Генерируем корневой сертификат (CA), им должны быть подписаны все сертификаты используемые OpepVPN-сервером.
Создайте файл для генерации случайных данных:
touch pki/.rnd
./easyrsa build-ca
На запрос "Enter New CA Key Passphrase" задайте пароль.
"Enter New CA Key Passphrase"
На запрос "Re-Enter New CA Key Passphrase" повторите пароль. Этот пароль защищает приватный ключ удостоверяющего центра. Также пароль потребуется каждый раз, когда нужно будет подписывать в удостоверяющем центре сертификаты для серверов и клиентов OpenVPN.
"Re-Enter New CA Key Passphrase"
Также команда уточнит введенные вами ранее значения в файле vars.
На запрос ввести "Common Name" можно просто нажать Enter или ввести имя, которое будет обозначать название центра сертификации.
"Common Name"
Кроме этого имеется возможно сформировать CA и без ключа:
./easyrsa build-ca nopass
Но это менее безопасно.
После выполнения этих команд будет выполнено создание структуры директорий CA, публичный сертификат центра сертификации ca.crt вы сможете найти в директории pki, а закрытый ключ ca.key в pki/private. Закрытый ключ является секретным и не при каких обстоятельствах не должен покидать свое расположение и тем более не должен передаваться по открытым каналам связи, доступ третьих лиц к закрытому ключу также следует ограничить.
Сменить директорию для файлов, относящихся к PKI, можно командой:
./easyrsa --pki-dir=<путь/к/каталогу>
Задать новый файл vars. Полезно, когда он уже создан, достаточно просто указать путь к нему:
./easyrsa --vars=<путь/к/файлу>
Изменить режим работы сертификата.
./easyrsa --dn-mode=<режим>
Имеет два значения:
cn_only — упрощенный режим, при котором в сертификате прописывается только CN (имя того, кому выдан сертификат);
org — традиционный режим, при котором заполняются все реквизиты организации.
OpenVPN может использовать любой режим.
Ключи для быстрой замены значений в файле vars:
./easyrsa --req-c=<имя> # Смена на <имя> страны ./easyrsa --req-st=<имя> # Смена на <имя> области/региона ./easyrsa --req-city=<имя> # Смена на <имя> названия города ./easyrsa --req-org=<имя> # Смена на <имя> наименования организации ./easyrsa --req-email=<имя> # Смена на <имя> электронной почты ./easyrsa --req-ou=<имя> # Смена на <имя> наименования отдела и т.п.
Изменить размер ключа шифрования:
./easyrsa --keysize=#
По умолчанию, стоит значение 2048. Если вы на первое место ставите безопасность, то рекомендуется увеличить размер ключа до 3072 или 4096. Если криптографическая стойкость не играет важной роли, можно установить значение 1024.
Установить срок действия корневого сертификата СА и сертификата пользователя:
./easyrsa --days=#
Следует учитывать, что этим ключом устанавливается срок для обоих сертификатов. Если хотите настроить разные сроки, это необходимо сделать вручную.
Изменить алгоритм шифрования — RSA (по умолчанию) или EC.
./easyrsa --use-algo=ALGO
Файл Диффи-Хеллмана используется для безопасного получения общего секретного ключа в незащищенных каналах связи, применяется для обеспечения защиты трафика от расшифровки между клиентом и сервером.
./easyrsa gen-dh
При этом будет создан файл /usr/share/easy-rsa/3/pki/dh.pem
На этом создание центра сертификации (CA) можно считать законченным.
Для создания сертификата сервера необходимо сначала создать файл запроса. Файл запроса для сервера рекомендуется создать без пароля с помощью опции nopass, иначе придется вводить пароль с консоли при каждом запуске сервера.
Находясь в каталоге /usr/share/easy-rsa/3/ выполните команду:
./easyrsa gen-req vpn-server nopass
где vpn-server — имя вашего сервера, а nopass означает, что закрытый ключ следует создать без пароля.
При выполнении данной команды будет создан запрос на сертификат и сгенерирован закрытый ключ сервера vpn-server.key, который будет располагаться в pki/private. Закрытый ключ является секретным и не должен передаваться по открытым каналам связи и доступ к нему также должен быть ограничен.
На запрос ввода Common Name нажмите Enter.
Common Name
Enter
Теперь необходимо подписать запрос на получение сертификата у нашего CA:
./easyrsa sign-req server vpn-server
Опция server обозначает выпуск сертификата для сервера.
После ввода команды подтверждаем правильность данных вводом yes.
Confirm request details: yes
Далее вводим пароль, который указывали при создании корневого сертификата. В результате сформируется сертификат сервера /usr/share/easy-rsa/3/pki/issued/vpn-server.crt.
Для активации tls-auth необходимо сгенерировать дополнительный секретный ключ. Сделать это можно с помощью команды:
openvpn --genkey --secret pki/ta.key
Tls-auth добавляет использование еще одной подписи HMAC к handshake-пакетам SSL/TLS, инициируя дополнительную проверку целостности. Теперь пакет, не имеющий такой подписи, будет сразу отбрасываться. Это обеспечит дополнительный уровень безопасности протокола SSL/TLS, защищая систему от таких атак, как:
Сертификаты сервера готовы и находятся в каталоге pki. В /etc создадим новый каталог, в котором будем хранить сертификаты:
mkdir -p /etc/openvpn/server/keys
Переходим в каталог pki:
cd /usr/share/easy-rsa/3/pki/
Копируем в /etc/openvpn/server/keys следующие сертификаты:
cp ca.crt issued/vpn-server.crt private/vpn-server.key dh.pem ta.key /etc/openvpn/server/keys/
Создаем конфигурационный файл для сервера openvpn:
nano /etc/openvpn/server/server.conf
Со следующим содержимым:
local 10.10.0.2 # Сетевой порт сервера port 1194 # Работа по протоколу UDP proto udp dev tun ca keys/ca.crt cert keys/vpn-server.crt key keys/vpn-server.key dh keys/dh.pem tls-auth keys/ta.key 0 # Область Ip-адресов виртуальных хостов server 192.168.10.0 255.255.255.0 # Назначение шлюза клиентам push "redirect-gateway def1" push "route-gateway 192.168.10.1" # Указывается DNS push "dhcp-option DNS 1.1.1.1" ifconfig-pool-persist ipp.txt keepalive 10 120 max-clients 15 client-to-client persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 0 mute 20 daemon mode server tls-server # Компрессия трафика comp-lzo yes # Алгоритм шифрования трафика cipher AES-256-CBC
Перед запуском сервера создадим каталог для "лог-файлов" сервера:
mkdir /var/log/openvpn
Разрешаем автоматический старт сервиса OpenVPN:
systemctl enable openvpn-server@server
Запускаем сервер openvpn-server:
systemctl start openvpn-server@server
Если необходимо, чтобы клиенты могли выходить через vpn в интернет, для этого необходимо настроить NAT. Откройте для редактирования файл sysctl.conf:
nano /etc/sysctl.conf
И добавьте в него строку:
net.ipv4.ip_forward=1
Примените настройки sysctl:
sysctl -p /etc/sysctl.conf
Добавьте правила в firewalld, где eth0 - внешний, tun0 - внутренний интерфейс OpenVPN:
firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i tun0 -o eth0 -j ACCEPT firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Для настройки клиента необходимо на сервере создать пользовательские сертификаты, а на клиентском компьютере установить программу OpenVPN и настроить ее.
Для создания клиентского сертификата переходим в каталог easy-rsa:
Формируем запрос на клиентский сертификат:
./easyrsa gen-req client1 nopass
Где client1 - имя клиента, а nopass предписывает создать закрытый ключ без пароля.
На основании запроса выпустим сертификат:
./easyrsa sign-req client client1
В данном случае опция client означает, что сертификат выпускается для клиента.
На запрос-подтверждение выпустить сертификат — вводим yes:
В результате создастся сертификат client1.ca и закрытый ключ client1.key.
Для удобства переноса пользовательских ключей на клиентский компьютер, скопируйте на сервере эти ключи во временную директорию (/tmp/keys), выполнив последовательно 3 команды:
mkdir /tmp/keys cp pki/issued/client1.crt pki/private/client1.key pki/dh.pem pki/ca.crt pki/ta.key /tmp/keys chmod -R a+r /tmp/keys
Единый файл .ovpn содержит в себе настройки клиента для подключения к OpenVPN-серверу, а также все необходимые сертификаты. Для подключению к OpenVPN-серверу, достаточно импортировать этот файл и подключение к vpn будет настроено.
Создайте каталог:
mkdir /etc/openvpn/keyovpn
Перейдите в этот каталог:
cd /etc/openvpn/keyovpn
Создайте файл:
nano ./base-client.conf
Пример содержимого файла base-client.conf:
base-client.conf
client resolv-retry infinite nobind # Адрес OpenVPN-сервера remote 10.10.0.2 1194 proto udp dev tun comp-lzo yes tls-client key-direction 1 float keepalive 10 120 persist-key persist-tun verb 0 # Алгоритм шифрования cipher AES-256-CBC
Создайте скрипт автоматической сборки файла *.ovpn.
nano /etc/openvpn/keyovpn/make_config.sh
Содержимое скрипта:
#!/bin/bash #каталог, где хранятся клиентские ключи KEY_DIR=/tmp/keys #каталог, в котором будет создан файл *.ovpn OUTPUT_DIR=/etc/openvpn/keyovpn/ #клиентский конфигурационный файл BASE_CONFIG=./base-client.conf cat ${BASE_CONFIG} \ <(echo ) \ <(echo -e '<ca>') \ ${KEY_DIR}/ca.crt \ <(echo -e '</ca>\n<cert>') \ ${KEY_DIR}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-auth>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-auth>') \ > ${OUTPUT_DIR}/${1}.ovpn
Назначьте файлу права на исполнение:
chmod +x make_config.sh
Запустите скрипт:
./make_config.sh client1
client1 - имя клиентского сертификата. На выходе будет создан файл client1.ovpn, который содержит все необходимые настройки, ключи и сертификаты для подключения.
Для отзыва ранее созданного сертификата client1 перейдите в каталог /usr/share/easy-rsa/3/:
Отзовите сертификат командой:
./easyrsa revoke client1
Подтвердите действия:
Continue with revocation: yes
И введите пароль от центра сертификации.
После этого создайте / обновите файл crl.pem:
./easyrsa gen-crl
Во время выполнения команды, необходимо будет ввести пароль центра сертификации.
Скопируйте файл crl.pem в каталог openvpn:
cp pki/crl.pem /etc/openvpn/server/keys/
Перезагрузите сервис openvpn:
systemctl restart openvpn-server@server
Для подключения клиента к VPN-серверу передайте файл client1.ovpn на клиентский ПК. В свойствах сетевого подключения импортируйте файл client1.ovpn, при этом будут импортированы настройки подключения к серверу OpenVPN, а также сертификаты и ключи.
В РЕД ОС 8 необходимо дополнительно установить пакет NetworkManager-openvpn-gnome следующей командой:
dnf install openvpn NetworkManager-openvpn-gnome
Ошибки подключения OpenVPN-клиента вида:
journalctl -u NetworkManager -f окт 15 09:59:49 localhost.localdomain nm-openvpn[4171770]: OpenSSL: error:0200100D:system library:fopen:Permission denied:fopen('/home/user/openvpn/user_sert.crt','r') окт 15 09:59:49 localhost.localdomain nm-openvpn[4171770]: OpenSSL: error:2006D002:BIO routines:BIO_new_file:system lib: окт 15 09:59:49 localhost.localdomain nm-openvpn[4171770]: OpenSSL: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib: окт 15 09:59:49 localhost.localdomain nm-openvpn[4171770]: Cannot load certificate file /home/user/openvpn/user_sert.crt
могут возникать из-за несоответствия меток безопасности SELinux.
В данном случае SELinux запрещает OpenVPN доступ к файлу сертификата /home/user/openvpn/user_sert.crt из-за некорректных меток безопасности. Решение данной проблемы возможно двумя способами — перемещением файлов сертификатов в каталог ~/.cert либо автоматическим исправлением настроек в графической утилите сетевых соединений.
Вариант 1. Перемещение файлов сертификатов в каталог ~/.cert
Переместите файл в каталог /home/user/.cert и установите корректный контекст безопасности с помощью следующих команд:
mv /home/user/openvpn/user_sert.crt ~/.cert restorecon -R -v ~/.cert
Вариант 2. Автоматическое исправление контекста безопасности
Перейдите в настройки VPN-соединения - кликните ПКМ по менеджеру сетевых соединений в трее, выберите пункт «Параметры соединений», выберите ваше VPN-соединение и нажмите «Настроить».
Во всплывающем уведомлении нажмите кнопку «Исправить» для автоматического перестроения меток безопасности.
journalctl -u NetworkManager -f окт 15 10:11:55 localhost.localdomain nm-openvpn[4172589]: VERIFY ERROR: depth=1, error=CA certificate key too weak: C=RU, ST=MOSCOW, L=MOSCOW, O=Red Soft Corporation, CN=red-soft.biz, emailAddress=info@red-soft.biz, serial=9761644548148397728 окт 15 10:11:55 localhost.localdomain nm-openvpn[4172589]: OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed: окт 15 10:11:55 localhost.localdomain nm-openvpn[4172589]: TLS_ERROR: BIO read tls_read_plaintext error окт 15 10:11:55 localhost.localdomain nm-openvpn[4172589]: TLS Error: TLS object -> incoming plaintext read error окт 15 10:11:55 localhost.localdomain nm-openvpn[4172589]: TLS Error: TLS handshake failed
могут возникать из-за применения устаревшего алгоритма шифрования ключа, например, SHA1 или длины ключа 1024 бит.
Сертификаты RSA с 1024-битными ключами являются устаревшими! С точки зрения безопасности рекомендуется использовать ключи длиной 2048 бит и более.
Для решения данной проблемы требуется перевыпустить ключ с параметрами, удовлетворяющими современным требованиям безопасности. Если риск использования небезопасного ключа оправдан, и администратор сети принимает на себя всю ответственность за возможную компрометацию передаваемых данных, требования к ключу можно понизить путем добавления значения PROFILE=SYSTEM@SECLEVEL=1 для параметра TLS cipher string в разделе «Дополнительных настроек» VPN-соединения.
PROFILE=SYSTEM@SECLEVEL=1
Дата последнего изменения: 09.06.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.