Установка и настройка OpenVPN на Rocky Linux 9

Виртуальная частная сеть (VPN) позволяет выходить в интернет, скрывая местоположение, безопасно использовать ненадёжные сети и обходить географические ограничения и цензуру. OpenVPN — свободное TLS‑решение для организации VPN.
В этом руководстве мы установим OpenVPN на сервер с Rocky Linux 9, настроим отдельный сервер как частный центр сертификации (CA), подпишем сертификаты, создадим конфигурацию сервера и клиента и настроим перенаправление всего трафика клиента через VPN.
Кому пригодится это руководство
- Системным администраторам, которые хотят запускать собственный VPN на Rocky Linux 9.
- Инженерам по информационной безопасности, которым нужен независимый PKI для OpenVPN.
- Любому, кто хочет перенаправлять весь трафик клиента через защищённый сервер.
Ключевые понятия
- CA — центр сертификации: генерирует и подписывает сертификаты.
- PKI — инфраструктура открытых ключей: структура каталогов и ключей/сертификатов.
- CSR — запрос на сертификат (Certificate Signing Request).
- tls‑crypt — пред‑поделённый ключ, скрывающий TLS‑подключения OpenVPN.
Предварительные условия
- Два сервера с Rocky Linux 9 (OpenVPN-сервер и CA‑сервер), оба с IPv4/IPv6 по необходимости.
- На сервере OpenVPN запущен firewalld.
- Неразовый пользователь с sudo на обоих серверах.
- Клиентское устройство (в примере — Rocky Linux 9) с OpenVPN‑клиентом.
- Система обновлена на обоих серверах:
$ sudo dnf updateВажно: CA‑сервер должен выполнять только операции по выпуску/подписанию сертификатов — по возможности держите его оффлайн, когда он не используется.
Шаг 1 — Подготовка CA‑сервера
CA — это сущность, которая подписывает сертификаты. Мы используем отдельный сервер как приватный CA.
Установка Easy‑RSA
EPEL‑репозиторий содержит пакет easy‑rsa. Установите его:
$ sudo dnf install epel-release
$ sudo dnf install easy-rsaСоздание директории PKI
$ mkdir ~/easy-rsa
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
$ chmod 700 /home//easy-rsa
$ cd ~/easy-rsa
$ ./easyrsa init-pki Ожидаемый вывод подтвердит создание PKI: /home/
Создание центра сертификации
Создайте файл vars для атрибутов CA и откройте в редакторе:
$ cd ~/easy-rsa
$ nano varsВставьте (локально скорректируйте значения при необходимости):
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "Howtoforge"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"Сохраните и выполните:
$ ./easyrsa build-caПри запросе задайте надёжную passphrase (или используйте nopass, если готовы к отсутствию пароля). Будут созданы ~/easy-rsa/pki/ca.crt и ~/easy-rsa/pki/private/ca.key. Файл ca.key надо хранить строго на CA‑сервере и защищать — при компрометации его надо деструктивно аннулировать CA.
Шаг 2 — Установка OpenVPN и Easy‑RSA на OpenVPN‑сервер
На OpenVPN‑сервере:
$ sudo dnf install epel-release
$ sudo dnf install openvpn easy-rsa
$ mkdir ~/easy-rsa
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
$ chmod 700 ~/easy-rsaШаг 3 — Создание PKI для OpenVPN‑сервера
На OpenVPN‑сервере создайте vars (минимально):
$ cd ~/easy-rsa
$ nano varsВставьте:
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"Инициализация PKI:
$ ./easyrsa init-pkiКаждый сервер имеет собственную PKI‑директорию: OpenVPN‑серверу нужны только запросы и приватные ключи сервера/клиентов, которые он хранит локально.
Шаг 4 — Создание серверного запроса и приватного ключа
Сгенерируйте пару ключ/CSR на OpenVPN‑сервере:
$ cd ~/easy-rsa
$ ./easyrsa gen-req server nopassЭто создаст:
- req: /home/
/easy-rsa/pki/reqs/server.req - key: /home/
/easy-rsa/pki/private/server.key
Скопируйте приватный ключ в защищённый каталог OpenVPN:
$ sudo cp /home//easy-rsa/pki/private/server.key /etc/openvpn/server/ CSR отправьте на CA для подписи (scp или копирование содержимого).
Шаг 5 — Подписание CSR CA‑сервером
Скопируйте server.req на CA‑сервер в /tmp и выполните там:
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/server.req server
$ ./easyrsa sign-req server serverПодтвердите подпись, введите passphrase CA. В результате появится /home/
$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp
$ scp pki/ca.crt username@your_vpn_server_ip:/tmp
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/serverШаг 6 — Настройка tls‑crypt
На OpenVPN‑сервере сгенерируйте общий секрет для tls‑crypt:
$ cd ~/easy-rsa
$ openvpn --genkey secret ta.key
$ sudo cp ta.key /etc/openvpn/serverЭто добавляет защиту от неавторизованного трафика и затрудняет обнаружение OpenVPN‑сессий.
Шаг 7 — Создание сертификата для клиента
Создайте директорию для клиентских ключей:
$ mkdir -p ~/client-configs/keys
$ chmod -R 700 ~/client-configs
$ cd ~/easy-rsa
$ ./easyrsa gen-req client1 nopass
$ cp pki/private/client1.key ~/client-configs/keys/Отправьте client1.req на CA, подпишите:
$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
# На CA
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/client1.req client1
$ ./easyrsa sign-req client client1Верните client1.crt на OpenVPN‑сервер и поместите всё в ~/client-configs/keys:
$ scp pki/issued/client1.crt username@your_server_ip:/tmp
$ cp /tmp/client1.crt ~/client-configs/keys/
$ cp ~/easy-rsa/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
$ sudo chown username.username ~/client-configs/keys/*Шаг 8 — Конфигурация OpenVPN‑сервера
Скопируйте пример конфигурации и отредактируйте:
$ sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
$ sudo nano /etc/openvpn/server/server.confИзменения, которые рекомендуется внести (вставить/раскомментировать/заменить соответствующие строки):
- HMAC: заменить tls-auth на tls‑crypt:
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key- Шифрование канала данных: заменить AES‑256‑CBC на AES‑256‑GCM:
;cipher AES-256-CBC
cipher AES-256-GCM- HMAC‑контроль сообщений:
auth SHA256- Отключить Diffie‑Hellman (при ECC):
;dh dh2048.pem
dh none- Низкопривилегированная работа демона:
user nobody
group nobodyПеренаправление всего трафика клиента
Чтобы заставить клиент использовать туннель по умолчанию, раскомментируйте:
push "redirect-gateway def1 bypass-dhcp"Настройка DNS (OpenDNS в примере):
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"Порт и протокол
По умолчанию OpenVPN слушает 1194/UDP. В примере меняем на TCP/443:
port 443
proto tcp
;proto udp
explicit-exit-notify 0Указание файлов сертификатов
Если вы использовали другие имена при gen‑req, проверьте строки cert/key:
cert server.crt
key server.key # This file should be kept secretЛоги и SELinux
По умолчанию статус логируется в /run — при включённом SELinux безопаснее записывать в /var/log:
status /var/log/openvpn-status.logСохраните файл.
Шаг 9 — Включение IP‑форвардинга
Откройте /etc/sysctl.conf и добавьте:
net.ipv4.ip_forward = 1Подгрузите параметры:
$ sudo sysctl -pЭто позволяет серверу маршрутизировать трафик клиентов в интернет.
Шаг 10 — Конфигурация firewall (firewalld)
Проверьте активные зоны:
$ sudo firewall-cmd --get-active-zonesЕсли интерфейс tun0 не в trusted, добавьте:
$ sudo firewall-cmd --zone=trusted --add-interface=tun0
$ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0Разрешите сервис OpenVPN и добавьте в trusted:
$ sudo firewall-cmd --permanent --add-service openvpn
$ sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services --zone=trustedВключите маскарадинг (NAT):
$ sudo firewall-cmd --add-masquerade
$ sudo firewall-cmd --add-masquerade --permanent
$ sudo firewall-cmd --query-masqueradeДобавьте явное POSTROUTING правило для подсети OpenVPN (в примере 10.8.0.0/24):
$ DEVICE=$(ip route | awk '/^default via/ {print $5}')
$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE
$ sudo firewall-cmd --permanent --add-port=443/tcp
$ sudo firewall-cmd --reloadВажно: адаптируйте подсеть 10.8.0.0/24 под свою топологию, если она конфликтует с локальной сетью клиента.
Шаг 11 — Запуск OpenVPN
Включите сервис при старте и запустите:
$ sudo systemctl -f enable [email protected]
$ sudo systemctl start [email protected]
$ sudo systemctl status [email protected]Ожидаемый статус: Active (running). Логи покажут Initialization Sequence Completed.
Шаг 12 — Создание клиентской конфигурации
Создайте базовый конфиг клиента:
$ mkdir -p ~/client-configs/files
$ cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf
$ nano ~/client-configs/base.confИзмените remote на публичный IP/порт сервера:
remote your_server_ip 443
proto tcp
user nobody
group nobodyЗакомментируйте ca/cert/key, потому что внутри .ovpn будут встраиваться PKI‑артефакты в секциях
Синхронизируйте шифр и auth с сервером:
cipher AES-256-GCM
auth SHA256
key-direction 1Создайте скрипт для сборки одного .ovpn файла с включёнными сертификатом, ключом и ta.key:
$ nano ~/client-configs/make_config.shВставьте (сохраните):
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '') \
${KEY_DIR}/ca.crt \
<(echo -e ' \n') \
${KEY_DIR}/${1}.crt \
<(echo -e ' \n') \
${KEY_DIR}/${1}.key \
<(echo -e ' \n') \
${KEY_DIR}/ta.key \
<(echo -e ' ') \
> ${OUTPUT_DIR}/${1}.ovpnСделайте исполняемым:
$ chmod 700 ~/client-configs/make_config.sh
$ cd ~/client-configs
$ ./make_config.sh client1
$ ls ~/client-configs/files
# client1.ovpnФайл client1.ovpn передайте клиенту безопасным способом (SCP, SFTP, USB и т.п.).
Шаг 13 — Установка и тестирование клиента
На клиенте (в примере Rocky Linux 9):
$ sudo dnf install openvpn
$ sudo openvpn --config client1.ovpnОжидайте лог, где будут сообщения VERIFY OK и Initialization Sequence Completed. Проверьте внешний IP через https://whatismyip.com — он должен совпадать с IP вашего OpenVPN‑сервера.

Проверьте DNS‑утечки на https://www.dnsleaktest.com/ — должны отображаться OpenDNS‑резолверы, если вы их запушили.

Чтобы запустить OpenVPN в фоне:
sudo openvpn --config client1.ovpn --daemon
$ ps aux | grep openvpn
$ sudo kill -9 OpenVPN также имеет GUI‑клиенты для Windows, macOS, Android и iOS, куда можно импортировать .ovpn.
Шаг 14 — Отзыв сертификатов (revoke)
На CA‑сервере:
$ cd ~/easy-rsa
$ ./easyrsa revoke client1
$ ./easyrsa gen-crlСкопируйте pki/crl.pem на OpenVPN‑сервер и поместите в /etc/openvpn/server:
$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
$ sudo cp /tmp/crl.pem /etc/openvpn/server/В серверной конфигурации добавьте:
crl-verify crl.pemПерезапустите OpenVPN. Отозванный клиент не сможет подключиться.
Рекомендации по безопасности и жёсткому ужесточению
- Храните ca.key исключительно на CA‑сервере, с ограниченным доступом и резервным копированием в зашифрованном хранилище.
- Используйте ECC (EASYRSA_ALGO=”ec”) и SHA‑512 в CA, а для канала данных AES‑GCM и HMAC SHA256.
- Регулярно проверяйте и обновляйте пакеты безопасности (dnf update).
- Разделяйте роли: один сервер — CA, другой — VPN. CA по возможности держите оффлайн.
- Ограничьте доступ SSH к CA по IP и ключам, не используйте парольную аутентификацию.
- Настройте журналирование и мониторинг: auditd, системные логи, alerting на аномалии.
- Подпишите CRL и автоматизируйте распространение нового crl.pem на OpenVPN‑сервер(а).
Важно: не используйте nopass для CA‑ключа без дополнительных мер защиты. Для CA допустимы более строгие процедуры, включая аппаратные HSM.
Руководство по расследованию проблем (runbook)
- Клиент не может подключиться:
- Проверьте журнал OpenVPN на сервере: sudo journalctl -u [email protected]
- Проверьте совпадение сертификатов и отсутствие crl‑браузинга.
- Убедитесь, что порт/протокол открыты в firewall и слушаются: sudo ss -lnpt | grep openvpn
- После подключения нет доступа в интернет:
- Проверьте net.ipv4.ip_forward = 1 и sysctl -p.
- Убедитесь, что MASQUERADE правило применено и правило POSTROUTING указано верно.
- DNS‑утечки:
- Убедитесь, что push dhcp‑option DNS … присутствует и клиент применил настройки.
- Разрыв по таймауту:
- Проверьте network MTU, latency, переключитесь на UDP, если нужно.
Чек‑листы по ролям
Администратор CA:
- Защитить /home/*/easy-rsa/pki/private/ca.key
- Запускать CA только при необходимости
- Хранить журнал подписаний
- Генерировать и передавать crl.pem после отзывов
Администратор VPN‑сервера:
- Хранить server.key в /etc/openvpn/server с правами root
- Настроить firewall и NAT
- Настроить sysctl ip_forward
- Обновлять OpenVPN и OpenSSL
Оператор клиента:
- Импортировать client.ovpn
- Проверить DNS и внешний IP
- Тестировать доступ к ресурсам за VPN
Мини‑методология создания PKI
- Инициализация PKI на CA и OpenVPN‑серверах отдельно.
- Генерация приватных ключей локально и генерация CSR на той же машине.
- Передача CSR на CA, подпись и возврат подписанных CRT пользователю.
- Контроль версий и резервных копий ключей и crl.
Критерии приёмки
- OpenVPN‑служба запущена и активна на сервере.
- Клиент получает адрес из диапазона OpenVPN и видит внешний IP сервера.
- DNS‑запросы проходят через указанные резолверы (нет утечек).
- Отзыв сертификата блокирует подключение отозванного клиента.
Типовые тесты и критерии приёмки
- Подключение клиента: успешная TLS‑аутентификация и инициализация туннеля.
- Маршрутизация: проверка traceroute/route по 0.0.0.0 → через туннель.
- NAT: проверка исходящего IP на whatismyip.com.
- DNS: стандартный и расширенный тест на dnsleaktest.com.
Модель зрелости внедрения VPN (уровни)
- Уровень 0 — Proof of Concept: OpenVPN с парой клиентов, ручное управление сертификатами.
- Уровень 1 — Production‑Basic: Автозагрузка сервиса, регулярные бэкапы, ручные отзывы.
- Уровень 2 — Production‑Hardened: Отдельный CA, автоматизация CRL, мониторинг, бэкапы с шифрованием.
- Уровень 3 — Enterprise: HSM для CA, централизованное управление сертификатами, аудит и SSO интеграция.
Типовые ошибки и способы их исправления
- “VERIFY ERROR” — проверьте совпадение ca.crt и цепочки сертификатов, проверьте дату/время на серверах.
- “Connection refused” — неверный порт/iptables/firewalld блокирует входящие.
- “TLS key negotiation failed” — проверьте ta.key и параметр key‑direction.
Матрица рисков и смягчения
- Компрометация ca.key: высокий риск → хранить оффлайн, использовать HSM, немедленно генерировать новую CA и отзывать старую.
- Неправильный NAT/маскарадинг: средний риск → автоматические тесты маршрута и CI проверка конфигурации.
- DNS‑утечки: средний риск → push dhcp‑option и принудительные правила DNS через firewall.
Простая диаграмма принятия решения (Mermaid)
flowchart TD
A[Нужен VPN] --> B{Есть ли собственный сервер?}
B -- Да --> C{Нужен приватный CA?}
B -- Нет --> D[Использовать облачный VPN или хостинг]
C -- Да --> E[Развернуть CA отдельно и следовать руководству]
C -- Нет --> F[Сгенерировать локальный самоподписанный сертификат]
E --> G[Настроить OpenVPN и клиенты]
F --> GПроверка совместимости и миграция
- OpenVPN 2.4+ поддерживает tls‑crypt и AES‑GCM; старые клиенты (до 2.4) могут не поддерживать AEAD. В этом случае используйте совместимые cipher‑списки или обновите клиента.
- Если у вас уже есть PKI на RSA и вы переходите на ECC — планируйте постепенную миграцию с параллельной поддержкой старых сертификатов.
Короткое объявление (для рассылки, 100–200 слов)
Мы подготовили полное руководство по установке OpenVPN на Rocky Linux 9 с отдельным приватным CA. В руководстве показано, как настроить PKI с помощью Easy‑RSA, подписать серверные и клиентские сертификаты, включить tls‑crypt, настроить шифрование AES‑GCM, выполнить настройки firewall и NAT, собрать единый .ovpn‑профиль и протестировать подключение. Включены советы по безопасности, runbook для устранения неполадок и процедуры отзыва сертификатов. Руководство пригодится администраторам, которые хотят контролировать собственную VPN‑инфраструктуру без привлечения внешних сервисов.
1‑строчный глоссарий
- CA — центр сертификации; PKI — инфраструктура открытых ключей; CSR — запрос на подпись; CRL — список отозванных сертификатов.
Итог
- Следуйте шагам по созданию PKI, подписи и конфигурации OpenVPN.
- Обеспечьте защиту CA и автоматизацию распространения CRL.
- Тестируйте подключение клиента и проверяйте DNS‑утечки.
Если у вас остались вопросы или нужна помощь с конкретной конфигурацией — опишите окружение (IP‑сеть, версии OpenVPN/OpenSSL, используемые порты) и мы поможем точечно.
Похожие материалы
Ошибка Microsoft Store 0x80d03801 — как исправить
Как защитить Windows от трояна Emotet
Как изменить язык YouTube — инструкция
iCloud Photos не синхронизируется — быстрые решения
Cordon и drain в Kubernetes — безопасное обслуживание узлов