Настройка OpenVPN на CentOS 7
Введение
OpenVPN — это открытое ПО для создания защищённой частной сети поверх публичного интернета. Оно устанавливает зашифрованный туннель между клиентом и сервером, позволяя безопасно передавать трафик. Кратко: VPN = защищённый туннель; CA = центр сертификации; DH = обмен ключами Диффи—Хеллмана.
В этой инструкции мы настроим OpenVPN-сервер и клиента на CentOS 7.
Ключевые шаги:
- Включить репозиторий EPEL
- Установить openvpn, easy-rsa и iptables-services
- Сгенерировать CA, сертификаты сервера и клиента, DH
- Настроить /etc/openvpn/server.conf
- Настроить маршрутизацию и iptables
- Запустить сервис openvpn@server
- Подготовить client.ovpn и подключиться
Важно: в примерах используются IP-сети и пути, которые нужно адаптировать под вашу инфраструктуру.
Требования
- Сервер с CentOS 7
- root-привилегии (или sudo)
- Доступ к порту сервера (по UDP/TCP) из клиентских сетей
Включение репозитория EPEL
Выполните:
sudo su
yum -y install epel-releaseПримечание: в некоторых системах пакет называется epel-release.
Установка OpenVPN, easy-rsa и iptables
yum -y install openvpn easy-rsa iptables-servicesГенерация ключей и сертификатов (easy-rsa)
На этом этапе мы создадим:
- CA (Certificate Authority)
- Сертификат и ключ сервера
- Diffie-Hellman параметры
- Сертификат и ключ клиента
Шаг 1 — скопировать шаблоны easy-rsa в /etc/openvpn:
cp -r /usr/share/easy-rsa/ /etc/openvpn/Перейдите в каталог easy-rsa и отредактируйте файл vars:
cd /etc/openvpn/easy-rsa/2.*/
vim vars
Шаг 2 — загрузить vars и очистить старые ключи:
source ./vars
./clean-allШаг 3 — создать CA. Вас попросят ввести Country, Province, City, Organization и Common Name:
./build-ca
Шаг 4 — сгенерировать серверный ключ и сертификат:
./build-key-server server
Шаг 5 — сгенерировать параметры Diffie-Hellman (занимает время):
./build-dh
Шаг 6 — сгенерировать клиентский ключ и сертификат (пример с именем client):
./build-key client
Шаг 7 — скопировать ключи в /etc/openvpn (путь важен для конфигурации сервера):
cd /etc/openvpn/easy-rsa/2.0/
cp -r keys/ /etc/openvpn/Примечание: в исходной инструкции была опечатка в названии каталога; используйте /etc/openvpn.
Настройка OpenVPN-сервера
Создайте файл конфигурации сервера:
cd /etc/openvpn/
vim server.confВставьте следующий пример и отредактируйте под свои значения (порт, интерфейс, путь к ключам, сеть VPN):
#change with your port
port 1337
#You can use udp or tcp
proto udp
# "dev tun" will create a routed IP tunnel.
dev tun
#Certificate Configuration
#ca certificate
ca /etc/openvpn/keys/ca.crt
#Server Certificate
cert /etc/openvpn/keys/server.crt
#Server Key and keep this is secret
key /etc/openvpn/keys/server.key
#See the size a dh key in /etc/openvpn/keys/
dh /etc/openvpn/keys/dh1024.pem
#Internal IP will get when already connect
server 192.168.200.0 255.255.255.0
#this line will redirect all traffic through our OpenVPN
push "redirect-gateway def1"
#Provide DNS servers to the client, you can use goolge DNS
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
#Enable multiple client to connect with same key
duplicate-cn
keepalive 20 60
comp-lzo
persist-key
persist-tun
daemon
#enable log
log-append /var/log/myvpn/openvpn.log
#Log Level
verb 3Создайте папку для логов и файл:
mkdir -p /var/log/myvpn/
touch /var/log/myvpn/openvpn.logВажно: храните серверный ключ (server.key) в безопасном месте и с нужными правами (600).
Отключение firewalld и SELinux (варианты)
В оригинале предлагается отключить firewalld и SELinux. Это рабочий, но менее безопасный путь. Лучший вариант — настроить брандмауэр и оставить SELinux в permissive или enabled с нужными правилами.
Если вы всё же отключаете (на тестовой машине):
systemctl mask firewalld
systemctl stop firewalldЧтобы отключить SELinux, отредактируйте:
vim /etc/sysconfig/selinuxИзмените строку:
SELINUX=disabledПосле изменения перезагрузите сервер.
Замечание: предпочтительнее настроить правила firewalld или использовать iptables-services и не отключать SELinux в продуктивной среде.
Маршрутизация и iptables
Шаг 1 — включить сервис iptables и очистить правила:
systemctl enable iptables
systemctl start iptables
iptables -FШаг 2 — добавить правило NAT для маршрутизации трафика из подсети VPN в интернет. В исходном примере была опечатка в сети. Правильный вариант:
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/sysconfig/iptablesvpnЗамените eth0 на имя внешнего интерфейса вашего сервера (ip addr show покажет список).
Шаг 3 — включить форвардинг IPv4:
vim /etc/sysctl.confДобавьте или отредактируйте строку:
net.ipv4.ip_forward = 1Примените изменения:
sysctl -pШаг 4 — запустить OpenVPN-сервер (юнит openvpn@server соответствует файлу /etc/openvpn/server.conf):
systemctl start openvpn@server
systemctl enable openvpn@serverПроверьте статус и логи:
systemctl status openvpn@server
tail -f /var/log/myvpn/openvpn.logНастройка клиента
Скопируйте на клиент 3 файла из /etc/openvpn/keys/: ca.crt, client.crt, client.key (через SCP или SFTP). Пример для Windows — WinSCP.
Создайте файл client.ovpn и вставьте пример ниже, заменив remote на реальный публичный IP/домен сервера и порт:
client
dev tun
proto udp
#Server IP and Port
remote 192.168.1.104 1337
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
Установите клиент:
- Windows: OpenVPN GUI (инсталлятор OpenVPN)
- macOS: Tunnelblick или OpenVPN Connect
- Linux: networkmanager-openvpn или запуск вручную
Пример запуска вручную на Linux:
sudo openvpn --config client.ovpnКритерии приёмки
- Серверный процесс openvpn@server запущен и активен
- Клиент успешно устанавливает соединение и получает IP из диапазона 192.168.200.0/24
- Маршрутизация: клиентский трафик выходит в интернет через сервер (проверяем внешним IP)
- Логи не содержат ошибок шифрования или проверки сертификатов
Типичные ошибки и как их исправить
- Неверный путь к ключам в server.conf — проверьте /etc/openvpn/keys/
- Опечатка в правиле iptables или неправильный внешний интерфейс — используйте ip addr
- SELinux блокирует доступ — временно переключите в permissive и проверьте audit.log
- Порт/протокол заблокирован провайдером — проверьте доступность порта через nc/telnet
Рекомендации по безопасности
- Используйте сильный ключ DH (2048 или выше) и RSA 2048/3072
- Ограничьте доступ к server.key: chmod 600
- В продакшне не отключайте SELinux: настройте политики или добавьте исключения
- Настройте автоматическую ротацию и отозвание сертификатов при компрометации
Сценарии отказа и откат
- Если после изменений сервер перестал поднимать туннель: верните предыдущую конфигурацию server.conf и перезапустите openvpn@server
- Если iptables сохранили неправильные правила, восстановите /etc/sysconfig/iptablesvpn или примените iptables-restore
Мини‑чеклист для ролей
Администратор сервера:
- Установил пакеты и скопировал keys/
- Проверил порты и внешний интерфейс
- Настроил ip_forward и iptables
Сетевой инженер:
- Проверил NAT/маршрутизацию
- Настроил мониторинг доступности порта
Пользователь клиента:
- Получил ca.crt, client.crt, client.key
- Импортировал client.ovpn и проверил подключение
Заключение
OpenVPN остаётся простым и гибким решением для создания защищённого VPN. Правильная генерация сертификатов, корректная маршрутизация и безопасное хранение ключей — основные составляющие надёжного развёртывания. Настройте брандмауэр и SELinux аккуратно, не отключая их в продакшене без крайней необходимости.
Полезные ссылки
- OpenVPN: https://openvpn.net/
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента