- Подготовка: что нужно до установки
- Установка пакетов и подготовка
- Генерация сертификатов и ключей (PKI)
- Настройка файла server.conf для OpenVPN server
- Включить маршрутизацию и NAT (чтобы клиенты ходили в интернет и/или в вашу сеть)
- Запуск OpenVPN server
- Генерация сертификатов для клиентов и выдача файлов
- Конфигурация client.ovpn для подключения
- Подключение на Windows/Linux/macOS
- Проверка, что всё работает
- Быстрые типовые ошибки
- Альтернатива: автоматизация установке и настройке
- Итог
Ниже - рабочий сценарий, как поднять 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)
- уникальные сертификаты для каждого клиентского файла
Если эти элементы в порядке, подключение стабильно поднимает туннель и позволяет клиентам ходить в интернет и/или в нужные подсети.