Установка и настройка OpenVPN с сертификатной аутентификацией на CentOS 8
Важно: этот гид показывает конфигурацию с сертификатной аутентификацией (PKI). При работе в продакшене увеличьте ключи и сроки действия сертификатов, храните CA в безопасном месте и продумайте процедуру отзыва сертификатов.

Кому подходит это руководство
- Системным администраторам и инженерам DevOps, которые развертывают VPN-сервер на CentOS 8.
- Тем, кто хочет использовать сертификатную аутентификацию (PKI) и управлять собственным CA.
Предварительные требования
- Сервер с CentOS 8.
- Права root или sudo.
- Доступ в интернет для установки пакетов и скачивания Easy-RSA.
Что мы сделаем
- Установим OpenVPN и Easy-RSA.
- Настроим Easy-RSA 3 (vars).
- Сгенерируем CA, серверные и клиентские ключи и сертификаты.
- Настроим конфигурацию OpenVPN-сервера.
- Включим форвардинг и настроим firewalld (NAT).
- Подготовим клиентские файлы и покажем подключение на Linux, macOS и Windows.
Шаг 1 — Установка OpenVPN и Easy-RSA
Добавим репозиторий EPEL и установим пакет OpenVPN, затем загрузим Easy-RSA.
Выполните:
dnf install epel-releaseУстановите OpenVPN:
dnf install openvpnПерейдите в каталог конфигурации OpenVPN и скачайте Easy-RSA (версия из примера — v3.0.6):
cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgzРаспакуйте и переименуйте директорию:
tar -xf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6/ easy-rsa/; rm -f EasyRSA-unix-v3.0.6.tgz
Шаг 2 — Настройка Easy-RSA 3 (файл vars)
Создайте и отредактируйте скрипт vars в /etc/openvpn/easy-rsa/:
cd /etc/openvpn/easy-rsa/
vim varsВставьте (пример) конфигурацию vars:
set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "ID"
set_var EASYRSA_REQ_PROVINCE "Jakarta"
set_var EASYRSA_REQ_CITY "Jakarta"
set_var EASYRSA_REQ_ORG "hakase-labs CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "HAKASE-LABS EASY CA"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "HAKASE-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-easyrsa.cnf"
set_var EASYRSA_DIGEST "sha256"Сохраните файл и сделайте его исполняемым:
chmod +x varsПримечания:
- Подставьте свои значения для страны, города, организации и email.
- Для повышенной безопасности увеличьте EASYRSA_KEY_SIZE (например, 3072 или 4096).
- Отрегулируйте EASYRSA_CA_EXPIRE и EASYRSA_CERT_EXPIRE под вашу политику ротации.

Шаг 3 — Создание ключей и сертификатов
Перейдите в каталог Easy-RSA и инициализируйте PKI:
cd /etc/openvpn/easy-rsa/3/
./easyrsa init-pki
./easyrsa build-caПри создании CA вам будет предложено указать пароль для закрытого ключа CA. После успешного создания вы найдете ca.crt и ca.key в каталоге pki.

Создание серверного ключа
Генерируем запрос на подпись и приватный ключ сервера (в примере — hakase-server):
./easyrsa gen-req hakase-server nopassnopass означает, что приватный ключ сервера будет без пароля — удобно для автоматического старта сервиса. Затем подпишите серверный CSR с помощью CA:
./easyrsa sign-req server hakase-serverВведите пароль CA при запросе. После подписи сертификат появится в pki/issued/hakase-server.crt. Проверьте сертификат:
openssl verify -CAfile pki/ca.crt pki/issued/hakase-server.crtФайлы: приватный ключ — pki/private/hakase-server.key, сертификат — pki/issued/hakase-server.crt.

Создание клиентского ключа
Создаём ключ клиента client01:
./easyrsa gen-req client01 nopass
./easyrsa sign-req client client01Подтвердите запрос (‘yes’) и введите пароль CA. Проверьте клиентский сертификат:
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
Генерация Diffie-Hellman параметров
DH-параметры необходимы для некоторых схем обмена ключами:
./easyrsa gen-dhФайл dh.pem появится в каталоге pki.

Опционально: CRL (список отзыва сертификатов)
Чтобы иметь возможность отзывать клиентские сертификаты, выполните:
./easyrsa revoke client01
./easyrsa gen-crlCRL сохранится в pki/crl.pem.

Копирование файлов в каталоги OpenVPN
Скопируйте серверные файлы в /etc/openvpn/server/:
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/hakase-server.crt /etc/openvpn/server/
cp pki/private/hakase-server.key /etc/openvpn/server/
cp pki/dh.pem /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/Скопируйте клиентские файлы в /etc/openvpn/client/:
cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client01.crt /etc/openvpn/client/
cp pki/private/client01.key /etc/openvpn/client/
Шаг 4 — Настройка OpenVPN сервера
Создайте файл конфигурации сервера /etc/openvpn/server/server.conf:
cd /etc/openvpn/server/
vim server.confПример server.conf (перенесите содержимое как есть):
# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun
# OpenVPN Server Certificate - CA, server key and certificate
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/hakase-server.crt
key /etc/openvpn/server/hakase-server.key
#DH and CRL key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.0.0 255.255.255.0
push "redirect-gateway def1"
# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"
#Enable multiple clients to connect with the same certificate key
duplicate-cn
# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
# Other Configuration
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
# OpenVPN Log
log-append /var/log/openvpn.log
verb 3Сохраните и закройте.
Советы по безопасности и совместимости:
- Рассмотрите возможность использования tls-auth или tls-crypt для защиты TLS-рукопожатия.
- Для современных клиентов можно переключиться на AES-GCM и более новые TLS-профили.
- Если вы используете SELinux, проверьте контексты файлов и разрешения.
Шаг 5 — Включение форвардинга и настройка firewalld (NAT)
Включите перенаправление IPv4 в ядре:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -pНастройте firewalld:
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --permanent --add-masqueradeДобавьте правило NAT (замените SERVERIP полученным IP сервера):
SERVERIP=$(ip route get 1.1.1.1 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.5.0.0/24 -o $SERVERIP -j MASQUERADE
firewall-cmd --reload
Запустите и включите auto-start сервиса OpenVPN:
systemctl start openvpn-server@server
systemctl enable openvpn-server@serverПроверьте состояние и порты:
netstat -plntu
systemctl status openvpn-server@server
Шаг 6 — Подготовка клиентской конфигурации
Создайте клиентский профиль /etc/openvpn/client/client01.ovpn:
cd /etc/openvpn/client
vim client01.ovpnПример client01.ovpn:
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert client01.crt
key client01.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3Упакуйте клиентские файлы для передачи:
cd /etc/openvpn/
tar -czvf client01.tar.gz client/*Скачайте архив на локальную машину (scp или FTP):
scp [email protected]:/etc/openvpn/client01.tar.gz .
Шаг 7 — Подключение клиента и тестирование
Linux (терминал)
Установите OpenVPN и (опционально) network-manager-плагин:
sudo apt install openvpn network-manager-openvpn network-manager-openvpn-gnome -yПодключение из терминала:
openvpn --config client01.ovpnВ отдельном терминале проверьте внешний IP (через VPN):
curl ifconfig.ioОжидается, что адрес вернёт IP VPN-сервера.
macOS
Установите Tunnelblick. Распакуйте архив и переименуйте папку в .tblk:
tar -xzvf client01.tar.gz
mv client client01.tblkДважды щёлкните client01.tblk — Tunnelblick импортирует конфигурацию.
Windows
Установите официальный OpenVPN GUI для Windows и импортируйте client01.ovpn через интерфейс.
Тесты и приёмка
Критерии приёмки:
- OpenVPN-сервис запущен и слушает UDP/1194 (или указанную порт/протокол).
- Клиент подключается и получает IP из диапазона 10.5.0.0/24.
- Трафик клиента уходит в интернет через сервер (curl ifconfig.io показывает внешний IP сервера).
- Логи /var/log/openvpn.log не содержат ошибок TLS или проверок сертификатов.
Отладка: частые проблемы и решения
- Проблема: клиент не подключается — проверьте, открыты ли порт и протокол на внешнем фаерволе хостинга.
- Проблема: TLS ошибка — проверьте совпадение ca.crt между сервером и клиентом и корректность подписанных сертификатов.
- Проблема: нет доступа в интернет после подключения — убедитесь, что включён ip_forward и настроен MASQUERADE в firewalld.
- Проблема: SELinux блокирует доступ — проверьте audit.log и добавьте нужные контексты или временно переключите SELinux в permissive для диагностики.
Безопасность и эксплуатация (рекомендации)
- Храните приватный ключ CA офлайн или в защищённом хранилище (HSM, Vault).
- Регулярно ротация сертификатов и ключей — настройте процесс ревока и распространения новых клиентских конфигов.
- Отключите duplicate-cn, если хотите уникальные сертификаты для каждого клиента (рекомендуется).
- Используйте tls-crypt или tls-auth, чтобы защитить TLS-рукопожатие от несанкционированных запросов.
- Ограничьте доступ по IP/портам на уровне облачного фаервола.
Риски и меры по уменьшению
- Риск: компрометация CA → весь VPN скомпрометирован. Меры: хранить CA офлайн, ограничить доступ к CA, использовать HSM.
- Риск: утечка клиентского ключа (без пароля) → требовать пароль на приватный ключ и/или использовать smartcards.
- Риск: неправильный NAT → тщательно тестировать правила MASQUERADE и маршрутизацию.
Альтернативные подходы
- Использование OpenVPN с двухфакторной аутентификацией (cert + username/password) через PAM/LDAP.
- Использование WireGuard — проще по конфигу и с высокой производительностью, но отличается моделью ключей.
- Использование коммерческого VPN-решения (если требуется централизованное управление сертификатами и GUI).
Когда этот подход не подходит
- Если нужен очень простой и лёгкий VPN без PKI — рассмотрите WireGuard.
- Если требуется централизованное управление пользователями и политиками в масштабе предприятия — возможно, лучше корпоративное решение.
Чек-листы по ролям
Администратор:
- Проверить установку пакетов: openvpn, easy-rsa.
- Проверить файлы: ca.crt, server.crt, server.key, dh.pem, crl.pem.
- Убедиться в настройках firewalld и включённом ip_forward.
- Настроить бэкап CA и периодический аудит.
Пользователь (клиент):
- Получить архив client01.tar.gz.
- Импортировать client01.ovpn в клиентское приложение.
- Подключиться и проверить внешний IP и доступ к ресурсам.
Мини-методология развёртывания (5 шагов)
- Подготовка инфраструктуры (сервер, сетевые правила).
- Установка ПО (OpenVPN, Easy-RSA).
- Построение PKI (CA, серверные и клиентские сертификаты).
- Настройка сервера (server.conf, NAT, firewalld).
- Тестирование и перевод в эксплуатацию.
Шаблон для инцидентного отката
- Отключить автозапуск сервера: systemctl disable –now openvpn-server@server
- Вернуть настройки firewalld: rollback правил или восстановить из резерва.
- При компрометации CA — отозвать все клиентские сертификаты и выпустить новые.
Краткая галерея крайних случаев
- Если требуется массовая выдача сертификатов — автоматизируйте easyrsa через скрипты и храните метаданные клиентов.
- Если сервер в облаке и меняет публичный IP — используйте DNS-имя и обновляйте client.ovpn либо применяйте динамические DNS.
Краткий глоссарий (1 строка каждое)
- CA: Центр сертификации, подписывает сертификаты.
- CSR: Запрос на сертификат (Certificate Signing Request).
- CRL: Список отозванных сертификатов.
- DH: Параметры Диффи-Хеллмана для обмена ключами.
Контрольные тесты (acceptance)
- Клиент подключается менее чем за 30 секунд.
- Клиент получает IP 10.5.0.x и пингает шлюз 10.5.0.1.
- curl ifconfig.io показывает IP сервера.
Ссылки
- Официальный сайт OpenVPN: https://openvpn.net/
Итог: следуя этому руководству, вы получите рабочий OpenVPN-сервер на CentOS 8 с сертификатной аутентификацией, возможностью отзыва сертификатов и базовой безопасной конфигурацией для эксплуатации.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента