2.5.5.5 Настройка OpenVPN
Скачать документ Полезные ключи OpenVPN
Предварительная подготовка сервера
Генерация ключей и сертификатов
Перенос готовых сертификатов в /etc/openvpn
Настройка и запуск сервера
Настройка NAT в Firewalld
Генерация сертификата для OpenVPN-клиента
Отзыв сертификата
Подключение клиента к серверу OpenVPN
Решение возникающих проблем
Окружение
- Версия РЕД ОС: 7.3
- Конфигурация: Сервер графический
- Версия ПО: openvpn-2.6.11-1, easy-rsa-3.0.6-4, NetworkManager-openvpn-gnome-1:1.10.2-1
OpenVPN используется для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. OpenVPN позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном через один сетевой порт UDP или TCP.
Вы можете подробнее ознакомиться с информацией по настройке OpenVPN, просмотрев наши обучающие видео:
на RuTube — OpenVPN-сервер: настройка и запуск;
в Яндекс.Дзен — OpenVPN-сервер: настройка и запуск;
в VK Видео — OpenVPN-сервер: настройка и запуск.
На наших каналах вы также сможете найти много другой полезной информации.
Полезные ключи OpenVPN
Все доступные алгоритмы шифрования можно просмотреть, выполнив из командной строки:
openvpn --show-ciphers
Просмотреть доступные алгоритмы хэширования:
openvpn --show-digests
Показать все доступные TLS-шифры (TLS используется только для шифрования канала управления):
openvpn --show-tls
Показать все доступные крипто-устройства в системе (если такие имеются):
openvpn --show-engines
Установить основной режим OpenVPN:
openvpn --mode m
По умолчанию OpenVPN работает в режиме "точка-точка" (p2p). В 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 Мбайт/с.
Изменить каталог на n перед чтением любых файлов, таких как файлы конфигурации, ключевые файлы, скрипты и т.д. n должен быть абсолютным путем, с ведущим "/", но без каких-либо ссылок на текущий каталог, таких как . или ....
openvpn --cd n
Эта опция полезна, когда вы запускаете OpenVPN в режиме демона или хотите объединить все управляющие файлы OpenVPN в одном месте.
Переопределить каталог n как каталог верхнего уровня (/).
openvpn --chroot n
Поэтому OpenVPN не сможет получить доступ к файлам вне этого дерева. Полезная функция, с точки зрения безопасности.
Библиотеке SSL, вероятно, потребуется, чтобы /dev/urandom был доступен внутри каталога n chroot. Это связано с тем, что библиотеки SSL периодически обращаются к данному каталогу, а так как доступ к файлам вне каталога отсутствует, он не сможет этого делать.
Переключить режимы сжатия OpenVPN. Сжатие является потенциально “опасной” функцией.
openvpn --allow-compression mode
Аргумент mode может принять одно из следующих значений:
asym - OpenVPN будет распаковывать только входящие пакеты, но не будет сжимать выходящие. Это значение будет приводить к отключению сжатия, когда конфигурации сервера и клиента одновременно настроены на отсутствие сжатия выходящих пакетов.
no (по умолчанию) - OpenVPN не будет сжимать пакеты.
- yes - OpenVPN будет отправлять и получать сжатые пакеты.
Предварительная подготовка сервера
Настройка Firewalld
Если Firewalld активен, то следует открыть порт для OpenVPN. По умолчанию OpenVPN работает на 1194 порту.
firewall-cmd --permanent --add-port=1194/udp firewall-cmd --reload
Установка OpenVPN и Easy-RSA
Выполните команду:
dnf install openvpn easy-rsa
Создание файла vars
Для упрощения процедуры создания необходимых ключей и сертификатов используется утилита Easy-RSA, которая позволяет легко управлять локальным центром сертификации (CA) инфраструктуры открытых ключей (PKI).
Для начала работы перейдем в каталог /usr/share/easy-rsa/3 командой:
cd /usr/share/easy-rsa/3
Создадим файл vars, который будет использоваться как шаблон для создания ключей. Откроем его на редактирование:
nano ./vars
Строки вида #set_var
содержат значения по умолчанию, для их изменения строку нужно раскомментировать и указать собственное значение.
Начнем с опции 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_CA_EXPIRE
и EASYRSA_CERT_EXPIRE
задают срок действия корневого сертификата CA и сертификатов пользователей (сервера и клиентов), их значения установлены в днях как 3650 (10 лет) и 1080 (5 лет), опция EASYRSA_CERT_RENEW
задает количество дней до истечения сертификата, когда становится доступным его продление, по умолчанию 30 дней. При необходимости вы можете изменить эти значения.
Сохраним внесенные изменения.
Для создания защищенного соединения между клиентами и сервером минимальный набор ключей и сертификатов будет состоять из следующего списка:
- Сертификат УЦ (CA);
- Сертификат сервера;
- Закрытый ключ сервера;
- Ключевая последовательность Диффи-Хеллмана;
- Закрытый ключ УЦ;
- Сертификат клиента;
- Закрытый ключ клиента.
Генерация ключей и сертификатов
Инициализация PKI (инфраструктура публичных ключей)
Теперь инициализируем наш CA и выпустим корневую пару ключей. Обратите внимание, что данные действия следует выполнять только один раз, повторное выполнение указанных команд уничтожит существующий CA и потребует повторного создания всех ключей и сертификатов.
./easyrsa init-pki
Подтверждаем инициализацию. Данная команда инициализирует новую структуру центра сертификации с очисткой всех данных.
Создание удостоверяющего центра CA
Генерируем корневой сертификат (CA), им должны быть подписаны все сертификаты используемые OpepVPN-сервером.
Создадим файл для генерации случайных данных:
touch pki/.rnd
и активируем наш CA:
./easyrsa build-ca
На запрос "Enter New CA Key Passphrase"
задайте пароль.
На запрос "Re-Enter New CA Key Passphrase"
повторите пароль. Этот пароль защищает приватный ключ удостоверяющего центра. Также пароль потребуется каждый раз, когда нужно будет подписывать в удостоверяющем центре сертификаты для серверов и клиентов OpenVPN.
Также команда уточнит введенные вами ранее значения в файле vars.
На запрос ввести "Common Name"
можно просто нажать Enter или ввести имя, которое будет обозначать название центра сертификации.
Кроме этого имеется возможно сформировать CA и без ключа:
./easyrsa build-ca nopass
Но это менее безопасно.
После выполнения этих команд будет выполнено создание структуры директорий CA, публичный сертификат центра сертификации ca.crt вы сможете найти в директории pki, а закрытый ключ ca.key в pki/private. Закрытый ключ является секретным и не при каких обстоятельствах не должен покидать свое расположение и тем более не должен передаваться по открытым каналам связи, доступ третьих лиц к закрытому ключу также следует ограничить.
Полезные ключи Easy-RSA
Сменить директорию для файлов, относящихся к PKI, можно командой:
./easyrsa --pki-dir=n
Задать новый файл 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
.
Теперь необходимо подписать запрос на получение сертификата у нашего CA:
./easyrsa sign-req server vpn-server
Опция server обозначает выпуск сертификата для сервера.
После ввода команды подтверждаем правильность данных вводом yes.
Confirm request details: yes
Далее вводим пароль, который указывали при создании корневого сертификата. В результате сформируется сертификат сервера /usr/share/easy-rsa/3/pki/issued/vpn-server.crt.
Создание TA ключа
Для активации tls-auth необходимо сгенерировать дополнительный секретный ключ. Сделать это можно с помощью команды:
openvpn --genkey secret pki/ta.key
Tls-auth добавляет использование еще одной подписи HMAC к handshake-пакетам SSL/TLS, инициируя дополнительную проверку целостности. Теперь пакет, не имеющий такой подписи, будет сразу отбрасываться. Это обеспечит дополнительный уровень безопасности протокола SSL/TLS, защищая систему от таких атак, как:
- Сканирование прослушиваемых VPN-сервером портов;
- Инициация SSL/TLS-соединения несанкционированной машиной (tls-auth отсекает их на значительно более раннем этапе, чем при использовании OpenVPN без tls-auth);
- DoS-атаки и флуд на порты OpenVPN;
- Переполнение буфера SSL/TLS.
Перенос готовых сертификатов в /etc/openvpn
Сертификаты сервера готовы и находятся в каталоге 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
Настройка NAT в Firewalld
Если необходимо, чтобы клиенты могли выходить через 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-клиента
Для настройки клиента необходимо на сервере создать пользовательские сертификаты, а на клиентском компьютере установить программу OpenVPN и настроить ее.
Создание клиентского сертификата
Для создания клиентского сертификата переходим в каталог easy-rsa:
cd /usr/share/easy-rsa/3
Формируем запрос на клиентский сертификат:
./easyrsa gen-req client1 nopass
Где client1 - имя клиента, а nopass предписывает создать закрытый ключ без пароля.
На основании запроса выпустим сертификат:
./easyrsa sign-req client client1
В данном случае опция client означает, что сертификат выпускается для клиента.
На запрос-подтверждение выпустить сертификат — вводим yes:
Confirm request details: 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
Сборка единого конфигурационного файла для подключения клиентов к OpenVPN
Единый файл .ovpn содержит в себе настройки клиента для подключения к OpenVPN-серверу, а также все необходимые сертификаты. Для подключению к OpenVPN-серверу, достаточно импортировать этот файл и подключение к vpn будет настроено.
Создайте каталог:
mkdir /etc/openvpn/keyovpn
Перейдите в этот каталог:
cd /etc/openvpn/keyovpn
Создайте файл:
nano ./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/:
cd /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
Подключение клиента к серверу OpenVPN
Для подключения клиента к VPN-серверу передайте файл client1.ovpn на клиентский ПК. В свойствах сетевого подключения импортируйте файл client1.ovpn, при этом будут импортированы настройки подключения к серверу OpenVPN, а также сертификаты и ключи.
Необходимо дополнительно установить пакет NetworkManager-openvpn-gnome следующей командой:
dnf install openvpn NetworkManager-openvpn-gnome
Решение возникающих проблем
Проблемы подключения openvpn-клиента. Несоответствие меток безопасности SELinux
Ошибки подключения 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-соединение и нажмите «Настроить».
Во всплывающем уведомлении нажмите кнопку «Исправить» для автоматического перестроения меток безопасности.
Проблемы подключения openvpn-клиента. Несоответствие ключа требованиям безопасности
Ошибки подключения OpenVPN-клиента вида:
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 в разделе «Дополнительных настроек»VPN-соединения.
Дата последнего изменения: 07.11.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.