Настройка VPN-сервера на Ubuntu 24.04: полное руководство с нуля

Пошаговое руководство по развёртыванию OpenVPN-сервера на Ubuntu 24.04. Рассмотрены установка, настройка PKI, генерация сертификатов, конфигурация сервера и клиентов, решение типичных проблем и автоматизация процессов.

Почему OpenVPN остаётся актуальным в 2025 году

Несмотря на появление более современных протоколов, таких как WireGuard, OpenVPN сохраняет позиции благодаря своей гибкости и проверенной временем архитектуре. Он поддерживает практически все операционные системы, включая Windows, macOS, Linux, Android и iOS, а также большинство роутеров с прошивками OpenWrt и DD-WRT. OpenVPN использует SSL/TLS для аутентификации и обмена ключами, что позволяет применять сертификаты X.509 и инфраструктуру открытых ключей (PKI). Это даёт администратору полный контроль над доступом: можно выпускать, отзывать и обновлять сертификаты для каждого клиента индивидуально. Кроме того, OpenVPN умеет работать через любые прокси и NAT, используя один UDP- или TCP-порт, что делает его незаменимым в сетях с жёсткими ограничениями. На Ubuntu 24.04 OpenVPN доступен в стандартных репозиториях, что упрощает установку и обновление.

Подготовка сервера: минимальные требования и начальная настройка

Для развёртывания OpenVPN-сервера подойдёт практически любой VPS или выделенный сервер с Ubuntu 24.04. Минимальные рекомендуемые характеристики: 1 CPU, 512 МБ оперативной памяти и 10 ГБ дискового пространства. Этого достаточно для обслуживания 5–10 одновременных подключений с умеренным трафиком. Если планируется больше клиентов или интенсивное использование (например, стриминг или торренты), стоит увеличить объём RAM до 1–2 ГБ и выбрать процессор с поддержкой аппаратного ускорения шифрования (AES-NI). Перед установкой OpenVPN необходимо выполнить базовую настройку сервера: обновить пакеты (sudo apt update && sudo apt upgrade -y), создать пользователя с правами sudo (если используется root, это допустимо, но менее безопасно) и настроить брандмауэр. Рекомендуется разрешить только SSH (порт 22) и порт для OpenVPN (по умолчанию 1194/UDP). Для управления правилами можно использовать UFW или iptables. Также важно включить IPv4 forwarding, чтобы сервер мог маршрутизировать трафик между VPN-интерфейсом и внешней сетью.

Установка OpenVPN и Easy-RSA: пошаговая инструкция

Установка OpenVPN и Easy-RSA на Ubuntu 24.04 выполняется одной командой: sudo apt install openvpn easy-rsa -y. Easy-RSA — это набор скриптов для управления PKI, который позволяет генерировать корневой сертификат центра сертификации (CA), серверные и клиентские ключи. После установки необходимо создать рабочий каталог для Easy-RSA. Рекомендуется разместить его в /etc/openvpn/easy-rsa для удобства, но можно использовать и домашнюю директорию пользователя. Если каталог создаётся в /etc/openvpn, потребуются права root: sudo install -d -m 700 /etc/openvpn/easy-rsa. Затем нужно скопировать файлы Easy-RSA из /usr/share/easy-rsa в этот каталог: sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/. После этого можно инициализировать PKI: cd /etc/openvpn/easy-rsa && sudo ./easyrsa init-pki. Важно: если PKI уже существует, команда выдаст предупреждение, но не перезапишет данные. На этом этапе также рекомендуется создать файл vars с настройками алгоритмов шифрования. Для современных систем оптимально использовать эллиптические кривые (ECC) и SHA512: set_var EASYRSA_ALGO "ec" и set_var EASYRSA_DIGEST "sha512". Это обеспечит высокую производительность и безопасность.

Генерация сертификатов: CA, сервер и клиенты

Процесс генерации сертификатов состоит из нескольких этапов. Сначала создаётся корневой сертификат центра сертификации (CA). Он будет использоваться для подписи всех остальных сертификатов. Команда: EASYRSA_BATCH=1 sudo ./easyrsa build-ca nopass. Параметр nopass отключает запрос пароля для CA-ключа — это удобно для автоматизации, но снижает безопасность. В production-среде рекомендуется использовать пароль. Затем генерируется серверный сертификат и ключ: EASYRSA_BATCH=1 sudo ./easyrsa build-server-full server nopass. После этого создаются параметры Диффи-Хеллмана (DH) для обеспечения Perfect Forward Secrecy: sudo ./easyrsa gen-dh. Этот процесс может занять несколько минут. Далее генерируется ключ tls-crypt для дополнительной защиты от DoS-атак и сканирования портов: sudo openvpn --genkey --secret /etc/openvpn/server/tls-crypt.key. Наконец, создаётся список отзыва сертификатов (CRL): sudo ./easyrsa gen-crl. Для каждого клиента нужно повторить команду: EASYRSA_BATCH=1 sudo ./easyrsa build-client-full client1 nopass, заменяя client1 на уникальное имя. Все сгенерированные файлы сохраняются в подкаталогах pki/issued, pki/private и pki.

Конфигурация сервера: server.conf и ключевые параметры

Файл конфигурации сервера OpenVPN обычно располагается в /etc/openvpn/server/server.conf. Ниже приведён пример минимальной, но функциональной конфигурации для Ubuntu 24.04:

port 1194
proto udp
dev tun
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-crypt /etc/openvpn/server/tls-crypt.key
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
status /var/log/openvpn/status.log
verb 3

Пояснение ключевых параметров:

  • port 1194 — порт, который будет слушать сервер. Можно изменить для обхода блокировок.
  • proto udp — UDP обеспечивает более высокую скорость, чем TCP. В сетях с блокировкой UDP можно использовать TCP/443.
  • server 10.8.0.0 255.255.255.0 — задаёт подсеть для VPN-клиентов.
  • push "redirect-gateway def1" — перенаправляет весь трафик клиента через VPN.
  • push "dhcp-option DNS ..." — задаёт DNS-серверы для клиентов.
  • tls-crypt — шифрует TLS-рукопожатие и защищает от DoS.
  • crl-verify — проверяет список отозванных сертификатов.
  • cipher AES-128-GCM — современный алгоритм шифрования с аутентификацией.
  • tls-version-min 1.2 — запрещает устаревшие версии TLS.

После создания конфигурации необходимо включить IP forwarding и настроить NAT. Для этого выполните:

sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.d/99-openvpn.conf

Затем добавьте правило маскарадинга в iptables:

WAN_IF=$(ip route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $WAN_IF -j MASQUERADE

Сохраните правила с помощью sudo netfilter-persistent save.

Запуск сервера и проверка работоспособности

После настройки конфигурации и правил брандмауэра можно запустить OpenVPN-сервер. В Ubuntu 24.04 используется systemd-юнит openvpn-server@server. Команды для запуска и включения автозапуска:

sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server

Проверьте статус:

sudo systemctl status openvpn-server@server --no-pager -n 20

В выводе должно быть active (running) и строка Initialization Sequence Completed. Если сервер не запустился, проверьте журнал ошибок:

sudo journalctl -u openvpn-server@server -n 50

Также убедитесь, что создан виртуальный интерфейс tun0:

ip addr show tun0

Ожидается, что интерфейс имеет IP-адрес из подсети, указанной в конфигурации (например, 10.8.0.1). Проверьте, что порт открыт:

ss -lunp | grep 1194

Должна отобразиться строка с openvpn. Если порт не виден, проверьте настройки брандмауэра. Убедитесь, что IP forwarding включён:

sysctl net.ipv4.ip_forward

Должен быть net.ipv4.ip_forward = 1. Наконец, проверьте правило NAT:

sudo iptables -t nat -L POSTROUTING -n -v | grep 10.8.0.0

Должна быть строка с MASQUERADE.

Создание клиентских конфигураций: .ovpn-файлы без ошибок

Клиентский конфигурационный файл (.ovpn) содержит все необходимые сертификаты и ключи, а также параметры подключения. Важно генерировать его правильно, чтобы избежать проблем, особенно на iOS-устройствах. Типичная ошибка — повреждение PEM-блоков при использовании sed или неправильного экранирования в heredoc. Это приводит к тому, что клиент не может распарсить сертификат, и подключение зависает на стадии «Активация». Правильный подход — использовать последовательные операции cat без подстановок переменных внутри heredoc. Пример корректного скрипта генерации:

#!/usr/bin/env bash
NAME="${1:-client1}"
OUT_DIR="/root/ovpn"
PORT="1194"
HOST="$(curl -4 -s ifconfig.me)"
EASYRSA_DIR="/etc/openvpn/easy-rsa"
TLS_KEY="/etc/openvpn/server/tls-crypt.key"

install -d -m 755 "$OUT_DIR"
cd "$EASYRSA_DIR"

if [ ! -f "pki/issued/${NAME}.crt" ]; then
    EASYRSA_BATCH=1 ./easyrsa build-client-full "${NAME}" nopass
fi

CRT="pki/issued/${NAME}.crt"
KEY="pki/private/${NAME}.key"
CA="pki/ca.crt"
OUT="${OUT_DIR}/${NAME}.ovpn"

cat >"$OUT" <
EOF
cat "$CA" >>"$OUT"
cat >>"$OUT" <<'EOF'

EOF
cat "$CRT" >>"$OUT"
cat >>"$OUT" <<'EOF'

EOF
cat "$KEY" >>"$OUT"
cat >>"$OUT" <<'EOF'

EOF
cat "$TLS_KEY" >>"$OUT"
cat >>"$OUT" <<'EOF'

EOF

echo "Профиль создан: ${OUT}"

После создания профиля обязательно проверьте его корректность:

awk '//{flag=1;next}/<\/cert>/{flag=0}flag' client.ovpn | openssl x509 -noout -text | head -5

Если команда возвращает ошибку Unable to load certificate, значит PEM-блок повреждён, и профиль нужно перегенерировать.

Автоматизация развёртывания: скрипты и лучшие практики

Для ускорения развёртывания и уменьшения вероятности ошибок рекомендуется использовать скрипты автоматизации. Один из подходов — создать единый bootstrap-скрипт, который выполняет все шаги: установку пакетов, инициализацию PKI, генерацию сертификатов, настройку конфигурации сервера, включение IP forwarding и NAT, запуск сервиса и создание первого клиента. Такой скрипт можно запускать на свежеустановленной Ubuntu 24.04, и через несколько минут получить полностью рабочий VPN-сервер. Пример структуры скрипта:

#!/usr/bin/env bash
set -euo pipefail

PORT="${PORT:-1194}"
SUBNET="${SUBNET:-10.8.0.0/24}"
DNS1="${DNS1:-1.1.1.1}"
DNS2="${DNS2:-1.0.0.1}"
CLIENT_NAME="${CLIENT_NAME:-client1}"

# Установка пакетов
apt-get update -y
apt-get install -y openvpn easy-rsa iptables-persistent curl

# Настройка Easy-RSA и PKI
install -d -m 700 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
if [ ! -f "./easyrsa" ]; then
    cp -r /usr/share/easy-rsa/* .
fi
if [ ! -d "pki" ]; then
    ./easyrsa init-pki
fi
if [ ! -f "pki/ca.crt" ]; then
    EASYRSA_BATCH=1 ./easyrsa build-ca nopass
fi
if [ ! -f "pki/issued/server.crt" ]; then
    EASYRSA_BATCH=1 ./easyrsa build-server-full server nopass
fi
if [ ! -f "pki/dh.pem" ]; then
    ./easyrsa gen-dh
fi
if [ ! -f "pki/crl.pem" ]; then
    ./easyrsa gen-crl
fi

# Генерация tls-crypt ключа
install -d -m 755 /etc/openvpn/server
if [ ! -f /etc/openvpn/server/tls-crypt.key ]; then
    openvpn --genkey --secret /etc/openvpn/server/tls-crypt.key
fi

# Создание server.conf (аналогично примеру выше)
# ...

# Включение IP forwarding
sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-openvpn.conf

# Настройка NAT
WAN_IF="$(ip route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')"
iptables -t nat -A POSTROUTING -s "${SUBNET}" -o "${WAN_IF}" -j MASQUERADE
netfilter-persistent save

# Запуск сервиса
systemctl enable openvpn-server@server
systemctl restart openvpn-server@server

# Создание скрипта для генерации клиентов (make_client.sh)
# ...

# Создание первого клиента
/root/make_client.sh "${CLIENT_NAME}"

echo "Готово! Клиентский профиль: /root/ovpn/${CLIENT_NAME}.ovpn"

Такой скрипт можно запускать с переменными окружения для кастомизации. Например:

PORT=11940 SUBNET=10.9.0.0/24 CLIENT_NAME=myrouter /root/bootstrap_openvpn.sh

Лучшие практики:

  • Храните скрипты в системе контроля версий (Git).
  • Используйте отдельный сервер для CA в production-среде.
  • Регулярно обновляйте сертификаты и отзывайте ключи уволенных сотрудников.
  • Настройте мониторинг подключений и логов (например, через fail2ban).
  • Рассмотрите возможность интеграции с LDAP/Radius для централизованной аутентификации.

Решение типичных проблем и диагностика

При настройке OpenVPN на Ubuntu 24.04 могут возникнуть следующие проблемы:

1. ./easyrsa: No such file or directory Причина: скрипты Easy-RSA не скопированы в рабочий каталог. Решение: выполните cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/.

2. OpenVPN активен, но tun0 не создаётся Возможные причины: ошибка в конфигурационном файле, отсутствие сертификатов или неправильные права доступа. Проверьте синтаксис конфига: openvpn --config /etc/openvpn/server/server.conf --test-parse. Также проверьте права на файлы ключей: они должны быть доступны пользователю, от которого запускается OpenVPN (обычно nobody).

3. Конфликт nftables и iptables-nft На Ubuntu 24.04 по умолчанию используется nftables, но iptables-команды транслируются через iptables-nft. При попытке использовать nft напрямую может появиться предупреждение Warning: table ip nat is managed by iptables-nft, do not touch!. Решение: используйте только iptables-команды для настройки NAT.

4. Клиентские профили повреждены Симптомы: iOS-клиенты зависают на «Активация», в логах ошибка PEM routines::no start line. Решение: перегенерируйте профиль, используя последовательные cat без подстановок, как описано в разделе о создании клиентских конфигураций. После генерации обязательно проверьте сертификат командой openssl x509 -noout -text.

5. Нет подключения к интернету через VPN Проверьте, включён ли IP forwarding и правильно ли настроен NAT. Убедитесь, что DNS-серверы, указанные в конфигурации, доступны. Также проверьте, не блокирует ли брандмауэр исходящий трафик с интерфейса tun0.

6. Низкая скорость соединения Причины: использование TCP вместо UDP, слабый процессор без аппаратного ускорения AES, неправильный выбор алгоритма шифрования. Рекомендации: используйте UDP, выберите AES-128-GCM (он быстрее AES-256-GCM на большинстве устройств), включите сжатие (если поддерживается клиентом).

Вопросы и ответы

Можно ли использовать один сервер для CA и OpenVPN?

Технически да, но это не рекомендуется. Если злоумышленник получит доступ к серверу OpenVPN, он сможет подписать поддельные сертификаты. В production-среде CA должен быть на отдельной машине, доступ к которой строго ограничен.

Какой алгоритм шифрования выбрать для OpenVPN?

Для большинства сценариев оптимален AES-128-GCM. Он обеспечивает хороший баланс между скоростью и безопасностью. AES-256-GCM даёт более высокий уровень защиты, но требует больше вычислительных ресурсов. Использование ECC для обмена ключами (алгоритм Диффи-Хеллмана на эллиптических кривых) значительно ускоряет установку соединения.

Почему клиентский профиль .ovpn не работает на iPhone?

Наиболее частая причина — повреждение PEM-блоков сертификата или ключа при генерации профиля. Это происходит из-за неправильного использования sed или heredoc. Используйте последовательные операции cat без подстановок переменных внутри heredoc. После создания профиля обязательно проверьте его командой openssl x509 -noout -text.

Как изменить порт OpenVPN, если 1194/UDP заблокирован?

Измените параметр port в server.conf на любой другой порт, например 443 или 11940. Если UDP полностью заблокирован, используйте proto tcp и порт 443 — это часто маскируется под HTTPS-трафик. Не забудьте обновить правила брандмауэра и клиентские конфигурации.

Нужно ли отзывать сертификат, если клиентский ключ скомпрометирован?

Да, обязательно. Используйте команду ./easyrsa revoke client_name и затем ./easyrsa gen-crl для обновления списка отзыва. После этого перезапустите OpenVPN-сервер. Без отзыва скомпрометированный ключ может быть использован для несанкционированного доступа.

Как автоматизировать создание клиентских сертификатов?

Создайте скрипт, который принимает имя клиента как аргумент, генерирует сертификат с помощью ./easyrsa build-client-full, а затем собирает .ovpn-файл, как описано в разделе о клиентских конфигурациях. Такой скрипт можно вызывать по SSH или через веб-интерфейс.

Какие минимальные требования к VPS для OpenVPN?

Для 5–10 клиентов достаточно 1 CPU, 512 МБ RAM и 10 ГБ SSD. Если планируется больше подключений или интенсивное использование (стриминг, торренты), увеличьте RAM до 1–2 ГБ и выберите процессор с поддержкой AES-NI.