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.
Шаг 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.
Шаг 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
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Шаг 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.
Скопируйте файл на клиентское устройство, например через 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Что дальше
Нужно больше клиентов — повторите 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: порты».