MHOSTMHOST

OpenVPN сервер

OpenVPN — проверенный временем протокол для собственного VPN-сервера: он шифрует весь трафик и заворачивает его через ваш VPS, а доступ клиентов разграничивается персональными сертификатами, а не общим паролем. В этой статье вы поднимете OpenVPN-сервер на VPS mHost вручную — с нуля создадите центр сертификатов на Easy-RSA, настроите server.conf, соберёте клиентский файл .ovpn и откроете нужный порт в файрволе.

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH под root или пользователем с правами sudo. Команды ниже даны от имени root: если вы работаете под sudo-пользователем, добавляйте sudo перед каждой командой — кроме команд вида cat > файл <<EOF, для них используйте sudo tee файл <<EOF ... EOF (иначе запись в файл выполнится не от root и упадёт с ошибкой доступа).
  • Порт 1194/udp, открытый в файрволе, — как это сделать, показано в шаге 5.
Совет: в VMmanager 6 есть готовый рецепт «Openvpn» (см. статью «Готовые рецепты VMmanager 6») — он поднимает OpenVPN-сервер в одно действие, без единой ручной команды. Рецепт кладёт клиентский ключ для подключения в /etc/openvpn/easy-rsa/keys — это путь классической схемы Easy-RSA 2.x (плоская папка keys/). В этой статье используется актуальная Easy-RSA 3, где файлы раскладываются иначе — по pki/issued/ и pki/private/ (см. шаг 2), поэтому пути ниже отличаются от рецепта. Если хотите не просто получить рабочий VPN, а понимать, что именно настроено и почему, — читайте дальше.
Совет: есть и сторонние скрипты-автоустановщики — например, angristan/openvpn-install (поддерживает и Ubuntu/Debian, и AlmaLinux/Rocky) или его предшественник Nyr/openvpn-install. Они интерактивно задают несколько вопросов и делают всё то же самое, что описано в шагах ниже, — но одной командой. Удобно, когда результат нужен быстро; здесь же — те же самые действия руками, с объяснением, что и зачем.

Шаг 1. Установите OpenVPN и Easy-RSA

Ubuntu / Debian

bash
apt update
apt install -y openvpn easy-rsa

AlmaLinux / Rocky Linux

bash
dnf install -y epel-release
dnf install -y openvpn easy-rsa

Пакета openvpn нет в базовых репозиториях AlmaLinux/Rocky — его даёт репозиторий EPEL, поэтому первой командой подключаем именно его.

Проверьте, что OpenVPN установился:

bash
openvpn --version

Шаг 2. Создайте PKI: центр сертификатов и ключи сервера с клиентом

Easy-RSA — это набор скриптов для управления собственным центром сертификатов (CA): именно он выпускает сертификат сервера и сертификаты клиентов, которые взаимно друг другу доверяют. Разверните рабочую копию Easy-RSA в отдельном каталоге.

Ubuntu / Debian

bash
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

AlmaLinux / Rocky Linux

bash
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

Дальше — одинаково для всех систем:

bash
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa gen-dh
./easyrsa build-client-full client1 nopass
  • init-pki создаёт в текущей папке пустую PKI — каталог pki/ со своей структурой.
  • build-ca nopass создаёт корневой центр сертификатов: закрытый ключ CA (pki/private/ca.key) и его самоподписанный сертификат (pki/ca.crt). Спросит Common Name — можно просто нажать Enter и согласиться со значением по умолчанию.
  • build-server-full server nopass генерирует ключ и сертификат сервера с именем server, сразу подписанные этим CA: pki/private/server.key и pki/issued/server.crt.
  • gen-dh генерирует параметры Диффи — Хеллмана (pki/dh.pem); на слабом VPS команда может выполняться пару минут.
  • build-client-full client1 nopass — то же самое для первого клиента: pki/private/client1.key и pki/issued/client1.crt. Для каждого нового устройства повторяйте эту команду с новым именем (client2, phone и т. д.) — свой сертификат на каждого клиента, один и тот же ключ на несколько устройств не переиспользуйте.

build-ca спросит только Common Name. А build-server-full и build-client-full дополнительно покажут данные запроса и попросят подтверждения — введите yes.

Совет: флаг nopass означает «не шифровать приватный ключ парольной фразой». Без него OpenVPN спрашивал бы пароль от ключа при каждом запуске сервиса — неудобно для сервера, который должен подниматься автоматически при перезагрузке.

Шаг 3. Настройте server.conf

Заведите отдельного системного пользователя, от имени которого OpenVPN будет работать после запуска (стартует он под root, но затем должен снизить привилегии):

bash
id -u openvpn &>/dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin openvpn

Скопируйте сертификат CA, сертификат и ключ сервера, а также параметры Диффи — Хеллмана рядом с будущим server.conf:

bash
mkdir -p /etc/openvpn/server
cp /etc/openvpn/easy-rsa/pki/ca.crt             /etc/openvpn/server/ca.crt
cp /etc/openvpn/easy-rsa/pki/issued/server.crt  /etc/openvpn/server/server.crt
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/server/server.key
cp /etc/openvpn/easy-rsa/pki/dh.pem             /etc/openvpn/server/dh.pem
chmod 600 /etc/openvpn/server/server.key

Создайте сам конфиг:

bash
cat > /etc/openvpn/server/server.conf <<'EOF'
port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh.pem

topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

keepalive 10 120

user openvpn
group openvpn

persist-tun

status openvpn-status.log
verb 3
explicit-exit-notify 1
EOF

Коротко о ключевых директивах:

  • port 1194 / proto udp — стандартный порт и протокол OpenVPN (пригодится в шаге 5 при открытии файрвола).
  • ca / cert / key / dh — пути к файлам из PKI; заданы без слэша, потому что systemd запускает OpenVPN с рабочим каталогом /etc/openvpn/server (см. шаг 6), где эти файлы и лежат.
  • server 10.8.0.0 255.255.255.0 — отдельная подсеть для VPN-клиентов; сам сервер займёт в ней адрес 10.8.0.1.
  • push "redirect-gateway def1 bypass-dhcp" — указывает клиенту заворачивать в туннель весь трафик, а не только обращения к самому серверу.
  • push "dhcp-option DNS ..." — какие DNS-серверы использовать клиенту, пока активен VPN.
  • user openvpn / group openvpn — после инициализации OpenVPN сбрасывает привилегии root до пользователя, созданного выше.
  • explicit-exit-notify 1 — работает только с proto udp: клиент быстрее узнаёт о перезапуске сервера и переподключается.

Шаг 4. Включите IP-форвардинг

По умолчанию ядро Linux не перекладывает пакеты между сетевыми интерфейсами — а без этого сервер не сможет пересылать трафик VPN-клиентов дальше в интернет. Включите форвардинг постоянно, отдельным файлом в /etc/sysctl.d:

bash
cat > /etc/sysctl.d/99-openvpn.conf <<'EOF'
net.ipv4.ip_forward = 1
EOF

sysctl --system

Проверьте, что значение применилось:

bash
sysctl net.ipv4.ip_forward

Ожидаемый вывод — net.ipv4.ip_forward = 1. Настройка в /etc/sysctl.d/ переживёт перезагрузку сервера — отдельно ничего для автозапуска настраивать не нужно.

Шаг 5. Откройте UDP 1194 в файрволе и включите NAT

Важно: без этого шага клиенты либо вообще не смогут подключиться (закрыт порт), либо подключатся, но не получат доступа в интернет через туннель (не настроен NAT). Если ufw на сервере ещё не установлен и не включён, сначала пройдите статью «Файрвол ufw: порты» — она ставит ufw, разрешает SSH (это обязательно сделать до включения файрвола) и включает его. Ниже — только правила, специфичные для OpenVPN.

Ubuntu / Debian (ufw)

Разрешите сам порт VPN:

bash
ufw allow 1194/udp

Узнайте имя основного сетевого интерфейса сервера — оно понадобится для правила NAT:

bash
ip route show default

В выводе (что-то вроде default via 45.156.21.1 dev eth0 proto static) посмотрите на поле dev — это и есть имя интерфейса. В примерах ниже используется eth0, замените на своё при необходимости.

Откройте /etc/ufw/before.rules:

bash
nano /etc/ufw/before.rules

и добавьте эти четыре строки в самое начало файла — перед строкой *filter:

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Разрешите форвардинг пакетов и на уровне самого ufw:

bash
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw

Примените изменения:

bash
ufw reload

AlmaLinux / Rocky Linux (firewalld)

На этих дистрибутивах по умолчанию используется не ufw, а firewalld:

bash
firewall-cmd --permanent --add-port=1194/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
Совет: если меняли подсеть server 10.8.0.0 255.255.255.0 в server.conf на шаге 3, подставьте свою и в правиле NAT — они должны совпадать.

Шаг 6. Запустите OpenVPN

Конфигурация лежит в /etc/openvpn/server/server.conf — юнит systemd openvpn-server@ берёт имя инстанса из имени файла без расширения (server), поэтому запускается так:

bash
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server

В статусе должно быть active (running). Если что-то пошло не так, посмотрите журнал:

bash
journalctl -u openvpn-server@server -n 50 --no-pager

Убедитесь, что появился виртуальный интерфейс:

bash
ip addr show tun0

Должен показаться интерфейс tun0 с адресом 10.8.0.1.

Шаг 7. Соберите клиентский профиль .ovpn и подключитесь

OpenVPN умеет собирать CA, сертификат и ключ прямо внутри одного .ovpn-файла — блоками <ca>, <cert>, <key>. Так профиль остаётся одним файлом, который удобно передать на устройство.

bash
cd /etc/openvpn/easy-rsa

{
cat <<'EOF'
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-tun
remote-cert-tls server
verb 3
<ca>
EOF
cat pki/ca.crt
echo '</ca>'
echo '<cert>'
cat pki/issued/client1.crt
echo '</cert>'
echo '<key>'
cat pki/private/client1.key
echo '</key>'
} > /root/client1.ovpn

Замените YOUR_SERVER_IP на публичный IP-адрес (или домен) вашего VPS.

Совет: файл pki/issued/client1.crt начинается с человекочитаемой распечатки сертификата (Certificate: Data: ...), и только потом идёт сам блок -----BEGIN CERTIFICATE-----. Это нормально: OpenVPN при чтении инлайн-блока ищет именно маркеры BEGIN/END, а текст перед ними просто игнорирует.

Скопируйте файл на клиентское устройство, например через scp:

bash
scp root@YOUR_SERVER_IP:/root/client1.ovpn .

Дальше — в зависимости от устройства:

  • Windows / macOS / iOS / Android — установите официальное приложение OpenVPN Connect и импортируйте в него файл client1.ovpn.
  • Linux — импортируйте профиль в NetworkManager (nmcli connection import type openvpn file client1.ovpn) либо запустите напрямую: openvpn --config client1.ovpn.

Проверьте на сервере, что клиент подключился:

bash
cat /etc/openvpn/server/openvpn-status.log
Готово: в openvpn-status.log появилась строка с именем клиента (client1) и его виртуальным IP из подсети 10.8.0.0/24, а на клиентском устройстве весь трафик пошёл через VPN.

Что дальше

Нужно больше клиентов — повторите build-client-full с новым именем (шаг 2) и соберите под него новый .ovpn (шаг 7); свой сертификат на каждое устройство, один и тот же ключ на несколько устройств не переиспользуйте. Устройство потеряно или его пора отключить — отзовите сертификат (./easyrsa revoke-issued client1, затем ./easyrsa gen-crl) и подключите получившийся pki/crl.pem в server.conf директивой crl-verify crl.pem.

Тот же результат в одно действие даёт готовый рецепт «Openvpn» в VMmanager 6 или сторонние скрипты вроде angristan/openvpn-install (см. начало статьи). Нужен более простой в настройке протокол — посмотрите статью «WireGuard VPN» (тоже доступен готовым рецептом в VMmanager 6). А чтобы держать под контролем остальные открытые порты сервера — статья «Файрвол ufw: порты».