OpenVPN сервер
OpenVPN — проверенный временем протокол для собственного VPN-сервера: он шифрует весь трафик и заворачивает его через ваш VPS, а доступ клиентов разграничивается персональными сертификатами, а не общим паролем. В этой статье вы поднимете OpenVPN-сервер на VPS ForestsNet Cloud вручную — с нуля создадите центр сертификатов на Easy-RSA, настроите server.conf, соберёте клиентский файл .ovpn и откроете нужный порт в файрволе.
Что понадобится
- VPS ForestsNet Cloud на 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
apt update
apt install -y openvpn easy-rsaAlmaLinux / Rocky Linux
dnf install -y epel-release
dnf install -y openvpn easy-rsaПакета openvpn нет в базовых репозиториях AlmaLinux/Rocky — его даёт репозиторий EPEL, поэтому первой командой подключаем именно его.
Проверьте, что OpenVPN установился:
openvpn --versionШаг 2. Создайте PKI: центр сертификатов и ключи сервера с клиентом
Easy-RSA — это набор скриптов для управления собственным центром сертификатов (CA): именно он выпускает сертификат сервера и сертификаты клиентов, которые взаимно друг другу доверяют. Разверните рабочую копию Easy-RSA в отдельном каталоге.
Ubuntu / Debian
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsaAlmaLinux / Rocky Linux
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsaДальше — одинаково для всех систем:
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa gen-dh
./easyrsa build-client-full client1 nopassinit-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, но затем должен снизить привилегии):
id -u openvpn &>/dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin openvpnСкопируйте сертификат CA, сертификат и ключ сервера, а также параметры Диффи — Хеллмана рядом с будущим server.conf:
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Создайте сам конфиг:
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:
cat > /etc/sysctl.d/99-openvpn.conf <<'EOF'
net.ipv4.ip_forward = 1
EOF
sysctl --systemПроверьте, что значение применилось:
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:
ufw allow 1194/udpУзнайте имя основного сетевого интерфейса сервера — оно понадобится для правила NAT:
ip route show defaultВ выводе (что-то вроде default via 45.156.21.1 dev eth0 proto static) посмотрите на поле dev — это и есть имя интерфейса. В примерах ниже используется eth0, замените на своё при необходимости.
Откройте /etc/ufw/before.rules:
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:
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufwПримените изменения:
ufw reloadAlmaLinux / Rocky Linux (firewalld)
На этих дистрибутивах по умолчанию используется не ufw, а firewalld:
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), поэтому запускается так:
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@serverВ статусе должно быть active (running). Если что-то пошло не так, посмотрите журнал:
journalctl -u openvpn-server@server -n 50 --no-pagerУбедитесь, что появился виртуальный интерфейс:
ip addr show tun0Должен показаться интерфейс tun0 с адресом 10.8.0.1.
Шаг 7. Соберите клиентский профиль .ovpn и подключитесь
OpenVPN умеет собирать CA, сертификат и ключ прямо внутри одного .ovpn-файла — блоками <ca>, <cert>, <key>. Так профиль остаётся одним файлом, который удобно передать на устройство.
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:
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.
Проверьте на сервере, что клиент подключился:
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: порты».