Ниже - рабочий сценарий, как поднять OpenVPN server на CentOS 7 и получить конфигурацию для клиента. Я сделал акцент на том, что реально нужно для подключения: сертификаты, конфиг сервера, правила маршрутизации и проверка, что туннель живой. Без «дальше смотрите в документации» - всё по шагам.

Подготовка: что нужно до установки

Требования к серверу CentOS 7

  • CentOS 7 (желательно с включенным TUN-драйвером на VPS/хостинге)
  • Публичный IP у сервера (либо доменное имя, которое на него указывает)
  • Открыт порт OpenVPN на вход (по умолчанию UDP 1194)
  • Доступ к root или пользователю с sudo

Сеть VPN

В большинстве инструкций используется подсеть VPN-клиентов 10.8.0.0/24, а адрес сервера в туннеле 10.8.0.1. Клиенты получают адреса из этой же сети.

  • VPN-сеть: 10.8.0.0/24
  • Сервер в туннеле: 10.8.0.1
  • Клиенты: обычно 10.8.0.2, 10.8.0.3 и дальше

Важная идея про безопасность

Шифрование делается не «каким-то параметром в конфиге», а связкой:
- сертификаты (CA + сертификат сервера + сертификаты клиентов)
- ключ Диффи-Хеллмана (DH)
- статический ключ для защиты TLS control channel (ta/tls-crypt)

Установка пакетов и подготовка

Подключить EPEL и поставить OpenVPN

sudo yum update -y
sudo yum install -y epel-release
sudo yum update -y
sudo yum install -y openvpn easy-rsa

Проверка:

openvpn --version

Подключить easy-rsa под вашу схему

В CentOS 7 часто встречаются варианты easy-rsa 2.x. Проще всего - завести удобную директорию под OpenVPN и работать в ней.

Создайте структуру:

sudo mkdir -p /etc/openvpn/easy-rsa/keys

Скопируйте easy-rsa в рабочую папку:

sudo cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

Если у вас нет /usr/share/easy-rsa/2.0, укажите нужную версию easy-rsa и скопируйте соответствующие файлы. Конкретика зависит от сборки пакета OpenVPN в вашей системе.

Подготовить файл vars

Откройте /etc/openvpn/easy-rsa/vars и выставьте базовые переменные сертификатов. Например:

sudo cp /etc/openvpn/easy-rsa/vars.example /etc/openvpn/easy-rsa/vars
sudo nano /etc/openvpn/easy-rsa/vars

Обязательно задайте:
- KEY_COUNTRY
- KEY_PROVINCE
- KEY_CITY
- KEY_ORG
- KEY_EMAIL
- KEY_OU
- KEY_CN
- KEY_NAME (обычно server для серверного набора)

Пример:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="MyOrg"
export KEY_EMAIL="admin@example.com"
export KEY_OU="IT"
export KEY_CN="vpn.example.com"
export KEY_NAME="server"

Генерация сертификатов и ключей (PKI)

Работайте строго по очереди.

Перейти в директорию easy-rsa и подгрузить переменные

cd /etc/openvpn/easy-rsa
source ./vars

Очистить старые ключи (если были)

./clean-all

Создать CA (сертификационный центр)

./build-ca

Будет запрос пароля CA и поля сертификата. Если переменные заданы в vars, можно часто жать Enter на значения по умолчанию.

CA - главный секрет. Файл ca.key нельзя раздавать клиентам.

Создать сертификат сервера

./build-key-server server

Во время подписания обычно:
- подтверждаете Y
- ставите common name server

Создать ta.key (ключ для TLS control channel)

openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

Сгенерировать DH-ключ Диффи-Хеллмана

В некоторых инструкциях это build-dh, в других - результат уже готовится от заданного размера.
Для классической easy-rsa 2.0:

./build-dh

Скопировать ключи/сертификаты в /etc/openvpn

cd /etc/openvpn/easy-rsa/keys
sudo cp dh2048.pem ca.crt server.crt server.key ta.key /etc/openvpn/

Примечание: имена файлов могут отличаться (например, dh-файл не всегда dh2048.pem). Ориентируйтесь на то, что реально лежит в /etc/openvpn/easy-rsa/keys.

Настройка файла server.conf для OpenVPN server

Обычно удобнее взять пример и отредактировать.

Создать файл конфигурации сервера

Скопируйте шаблон:

sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/server.conf
sudo nano /etc/openvpn/server.conf

Минимально нужные параметры (ориентир)

Вставьте/приведите к рабочему виду ключевые строки (остальное можно оставить как в шаблоне, если там нет конфликтов):

  • TCP/UDP и туннель:
port 1194
proto udp
dev tun
  • Сертификаты:
ca ca.crt
cert server.crt
key server.key
  • DH:
dh dh2048.pem
  • Защита TLS control channel:
tls-auth ta.key 0
  • Сеть VPN:
server 10.8.0.0 255.255.255.0
  • Раздача DNS клиентам:
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
  • Запуск без привилегий:
user nobody
group nobody
  • Персистенты и логи:
persist-key
persist-tun
verb 3

После сохранения проверьте, что server.conf ссылается на реальные файлы:
- ca.crt
- server.crt
- server.key
- dh dh2048.pem
- ta.key

Включить маршрутизацию и NAT (чтобы клиенты ходили в интернет и/или в вашу сеть)

Без этого клиенты могут подключаться, но не смогут нормально обмениваться трафиком наружу (или между подсетями).

Включить ip_forward

sudo nano /etc/sysctl.conf

Добавьте строку в начало:

net.ipv4.ip_forward = 1

Применить:

sudo sysctl -p

NAT через iptables (классический вариант для CentOS 7)

Ставим iptables-services и отключаем firewalld:

sudo yum install -y iptables-services

sudo systemctl mask firewalld
sudo systemctl enable iptables
sudo systemctl stop firewalld
sudo systemctl start iptables
sudo iptables --flush

Определите внешний сетевой интерфейс (там, куда смотрит интернет):

ip route

Найдите интерфейс типа eth0, ens33, eth1 и т.п. Возьмите имя.

Добавьте маскарадинг для сети VPN:

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o <ИМЯ_ИНТЕРФЕЙСА> -j MASQUERADE
sudo iptables-save > /etc/sysconfig/iptables

Разрешить вход на порт OpenVPN

Порт по умолчанию UDP 1194. Если iptables пустой после --flush, добавьте правило:

sudo iptables -A INPUT -i <ИМЯ_ИНТЕРФЕЙСА> -p udp --dport 1194 -j ACCEPT
sudo service iptables save

Запуск OpenVPN server

Включите сервис:

sudo systemctl -f enable openvpn@server.service

Запустите:

sudo systemctl start openvpn@server.service

Проверка статуса:

sudo systemctl status openvpn@server.service

Если есть проблемы, смотрите логи:

sudo journalctl -u openvpn@server.service --no-pager -n 200

и/или:

sudo tail -n 200 /var/log/openvpn.log 2>/dev/null

Генерация сертификатов для клиентов и выдача файлов

Идея простая: на каждый client нужен свой сертификат (client.crt) и ключ (client.key), а CA и ta.key общие.

Сгенерировать ключ клиента client1

cd /etc/openvpn/easy-rsa
source ./vars
./build-key client1

На выходе будет:
- client1.crt
- client1.key

(и запросы подписания в промежуточных директориях)

Скопировать набор для клиента на сервере

Общие файлы:
- ca.crt
- ta.key

Для клиента:
- client1.crt
- client1.key

Обычно забирают так:

sudo ls -l /etc/openvpn/ca.crt /etc/openvpn/ta.key /etc/openvpn/server.conf
sudo ls -l /etc/openvpn/easy-rsa/keys/client1.crt /etc/openvpn/easy-rsa/keys/client1.key 2>/dev/null

Путь может отличаться. В классической схеме easy-rsa 2.0 сертификаты клиентов чаще лежат в keys/ или в подпапках.

Конфигурация client.ovpn для подключения

Создайте файл конфигурации на клиенте (или на сервере и потом скопируйте). Пример для одного client:

client
dev tun
proto udp
remote <IP_ИЛИ_ДОМЕН_СЕРВЕРА> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

ca /path/to/ca.crt
cert /path/to/client1.crt
key /path/to/client1.key

tls-auth /path/to/ta.key 1

Практичнее хранить файлы рядом с .ovpn и указать относительные пути, либо встроить сертификаты в один файл (но это уже отдельная автоматизация).

Подключение на Windows/Linux/macOS

  • Windows: положите конфиг и ключи в каталог клиента OpenVPN и подключитесь из GUI
  • Linux: запустите openvpn --config client.ovpn
  • macOS: используйте Tunnelblick и добавьте конфиг

Если подключение не поднимает туннель, почти всегда проблема в:
- неверном IP/порт в remote
- ошибочном наборе сертификатов (не те client.crt/client.key)
- правилах iptables (порт не открыт / нет NAT / не включен ip_forward)
- конфликте параметров шифрования/ключей в server.conf и .ovpn

Проверка, что всё работает

Проверка туннеля

На сервере после подключения клиентов должен появляться интерфейс tun0 и/или новые маршруты. Проверьте:

ip a

Проверка “наружного” IP

Откройте любой сервис, который показывает публичный IP (например, через браузер на клиенте). IP должен быть серверный.

Быстрые типовые ошибки

Симптом Причина Что проверить
Клиент соединяется, но трафик не идет Нет NAT/маскарадинга или не включен форвардинг net.ipv4.ip_forward=1, правило MASQUERADE для 10.8.0.0/24
Ошибка TLS/сертификата Неверные ca.crt / client1.crt / client1.key Что клиент использует именно свои файлы, а CA - тот же, что у сервера
Не поднимается туннель Нет доступа к порту UDP 1194 iptables: правило INPUT на UDP 1194 и сохранение iptables-save
Работает только частично В конфигурации клиента/сервера расходятся параметры ta/tls-auth tls-auth ta.key 0 на сервере и tls-auth ta.key 1 на клиенте

Альтернатива: автоматизация установке и настройке

Если хочется быстрее и меньше ручной возни с сертификатами и firewall, можно использовать готовые установщики, например openvpn-install от angristan. Он ставит и настраивает OpenVPN, а также управляет сертификатами клиентов через скрипт.

Документация проекта:
- https://github.com/angristan/openvpn-install

Подходит, если вы не принципиальны к “сделать всё вручную” ради полного контроля.

Итог

Для OpenVPN server на CentOS 7 самая важная часть - не “поставить пакет”, а связка:
- корректный server.conf с сертификатами, DH и tls-auth/tls-crypt
- включенный ip_forward
- работающий NAT (iptables/firewalld)
- уникальные сертификаты для каждого клиентского файла

Если эти элементы в порядке, подключение стабильно поднимает туннель и позволяет клиентам ходить в интернет и/или в нужные подсети.