Как настроить VPN-сервер на Ubuntu: пошаговое руководство по OpenVPN

Подробное руководство по настройке VPN-сервера на Ubuntu с использованием OpenVPN: установка, PKI, сертификаты, конфигурация, клиенты, безопасность и оптимизация.

Зачем нужен собственный VPN-сервер и как выбрать подход

Собственный VPN-сервер даёт контроль над безопасностью и конфиденциальностью, что особенно важно, если вы не доверяете коммерческим VPN-провайдерам или хотите реализовать специфические политики сетевой безопасности. Например, можно ограничить доступ к почтовому серверу только с IP-адресов VPN, создав белый список в брандмауэре. Также собственный VPN позволяет обходить географические ограничения и цензуру, защищать трафик в общественных Wi-Fi сетях и скрывать местоположение.

Существует два основных подхода: использование OpenVPN Community Edition (бесплатного, гибкого, но требующего ручной настройки) и OpenVPN Access Server (коммерческого продукта с веб-интерфейсом, упрощающим управление). В этом руководстве мы сосредоточимся на OpenVPN Community, так как он полностью бесплатен, имеет открытый исходный код и поддерживает широкий спектр конфигураций. Однако стоит упомянуть, что Access Server может быть удобен для быстрого развёртывания, особенно если вам нужна веб-панель администратора, интеграция с Active Directory или RADIUS.

При выборе сервера учитывайте, что OpenVPN работает на большинстве дистрибутивов Linux, включая Ubuntu 20.04, 22.04, 24.04 и 25.04. Для тестового использования подойдёт VPS с 1 ГБ ОЗУ, но для продакшена рекомендуется больше ресурсов, особенно если планируется много одновременных подключений.

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

Для настройки VPN-сервера вам понадобятся два сервера Ubuntu: один будет выполнять роль VPN-сервера, второй — частного центра сертификации (CA). Разделение CA и VPN-сервера — это лучшая практика безопасности, рекомендованная официальной документацией OpenVPN. Если CA скомпрометирован, злоумышленник может подписывать поддельные сертификаты, поэтому CA должен быть изолирован и не запускать других служб.

На обоих серверах должен быть пользователь с правами sudo (не root) и включённый брандмауэр UFW. Также потребуется клиентское устройство (локальный компьютер, смартфон и т.д.) для подключения к VPN. Убедитесь, что все серверы обновлены: выполните sudo apt update && sudo apt upgrade.

Если вы отключили аутентификацию по паролю при настройке SSH, вам нужно будет настроить SSH-ключи для передачи файлов между серверами. В противном случае можно использовать пароль. Также обратите внимание, что некоторые хостинг-провайдеры взимают плату за превышение трафика, поэтому следите за объёмом данных, проходящих через VPN-сервер.

Установка OpenVPN и Easy-RSA на сервер

На VPN-сервере установите пакеты OpenVPN и Easy-RSA. Easy-RSA — это набор скриптов для управления инфраструктурой открытых ключей (PKI), который позволяет создавать запросы на сертификаты и подписывать их. В Ubuntu 20.04/22.04 используется OpenVPN 2.4.x и Easy-RSA 3.x, а в Ubuntu 24.04/25.04 — OpenVPN 2.6.x с улучшенными функциями безопасности. Синтаксис команд одинаков для всех версий.

Выполните:

sudo apt update
sudo apt install openvpn easy-rsa

Затем создайте каталог для Easy-RSA и символическую ссылку на установленные скрипты:

mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/

Ограничьте доступ к каталогу, чтобы только ваш пользователь мог читать и изменять файлы:

sudo chown $USER ~/easy-rsa
chmod 700 ~/easy-rsa

Использование символической ссылки (а не копирования) гарантирует, что обновления пакета easy-rsa автоматически отразятся в ваших скриптах.

Создание PKI и запроса сертификата сервера

На VPN-сервере создайте файл vars в каталоге ~/easy-rsa, чтобы задать параметры криптографии. Рекомендуется использовать эллиптическую кривую (ECC) и хэш SHA-512 для повышения производительности и безопасности. Добавьте в файл:

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Затем инициализируйте PKI:

cd ~/easy-rsa
./easyrsa init-pki

Теперь создайте закрытый ключ и запрос на подпись сертификата (CSR) для сервера. Используйте общее имя (CN) server и опцию nopass, чтобы избежать запроса пароля при запуске:

./easyrsa gen-req server nopass

Эта команда создаст файлы server.req (запрос) и server.key (закрытый ключ) в каталоге pki/. Скопируйте ключ в системный каталог OpenVPN:

sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/server/

Важно: закрытый ключ сервера должен храниться в защищённом месте и быть доступен только root-пользователю.

Настройка центра сертификации (CA) и подпись сертификата

На отдельном сервере CA установите Easy-RSA и создайте PKI аналогично VPN-серверу, но с дополнительными параметрами в vars, описывающими организацию (страна, город, email и т.д.). Пример:

set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "ExampleOrg"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "IT"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Затем инициализируйте PKI и создайте корневой сертификат CA:

./easyrsa init-pki
./easyrsa build-ca

Вам будет предложено ввести пароль для закрытого ключа CA (или используйте nopass для упрощения, но это менее безопасно). После создания CA у вас появятся файлы ca.crt (публичный сертификат) и ca.key (закрытый ключ). Закрытый ключ CA должен храниться в секрете и не должен покидать сервер CA.

Теперь скопируйте файл server.req с VPN-сервера на сервер CA (например, через scp). На сервере CA импортируйте запрос и подпишите его:

./easyrsa import-req /tmp/server.req server
./easyrsa sign-req server server

После подписания вы получите файл server.crt. Скопируйте его обратно на VPN-сервер в каталог /etc/openvpn/server/. Также скопируйте ca.crt на VPN-сервер.

Конфигурация сервера OpenVPN

Создайте файл конфигурации сервера /etc/openvpn/server/server.conf. Вот минимальный рабочий пример:

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh none
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 1.1.1.1"
keepalive 10 120
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1

Пояснения:

  • port 1194 и proto udp — стандартный порт и протокол UDP для оптимальной производительности. Если UDP блокируется, можно использовать TCP на порту 443.
  • dev tun — создание туннельного интерфейса.
  • dh none — отключает Diffie-Hellman, так как используется ECC.
  • server 10.8.0.0 255.255.255.0 — задаёт подсеть для VPN-клиентов.
  • push "redirect-gateway def1" — направляет весь трафик клиента через VPN.
  • push "dhcp-option DNS ..." — задаёт DNS-серверы для клиентов, чтобы избежать утечек DNS.
  • cipher AES-256-GCM — современный аутентифицированный шифр.
  • user nobody и group nogroup — снижение привилегий после запуска.

Включите IP-пересылку, отредактировав /etc/sysctl.conf или создав файл в /etc/sysctl.d/:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-openvpn.conf
sudo sysctl -p /etc/sysctl.d/99-openvpn.conf

Настройте брандмауэр UFW, разрешив SSH и порт 1194, а также добавьте правила маскирования NAT:

sudo ufw allow 22/tcp
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw enable

Добавьте правила NAT в файл /etc/ufw/before.rules перед секцией *filter:

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

Замените eth0 на ваш сетевой интерфейс (проверьте через ip a). Перезапустите UFW и OpenVPN:

sudo systemctl restart ufw
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server

Создание клиентских сертификатов и профилей

Для каждого клиента необходимо создать отдельный сертификат. На VPN-сервере (или на CA) сгенерируйте ключ и запрос для клиента, например, с именем client1:

cd ~/easy-rsa
./easyrsa gen-req client1 nopass

Затем подпишите запрос на сервере CA (если вы используете отдельный CA, скопируйте .req файл туда):

./easyrsa import-req /tmp/client1.req client1
./easyrsa sign-req client client1

После подписания скопируйте client1.crt и ca.crt на клиентское устройство. Также вам понадобится файл ta.key для дополнительной защиты TLS (опционально, но рекомендуется). Создайте его на сервере:

openvpn --genkey secret ta.key

Теперь создайте файл профиля клиента client1.ovpn со следующим содержимым:

client
dev tun
proto udp
remote your-server-ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
verb 3

[содержимое ca.crt]

[содержимое client1.crt]

[содержимое client1.key]

[содержимое ta.key]

Вставьте содержимое соответствующих файлов вместо плейсхолдеров. Если вы не используете tls-crypt, удалите этот блок. Передайте файл .ovpn на клиентское устройство безопасным способом (например, через зашифрованный канал).

Подключение клиентов на разных платформах

OpenVPN поддерживает клиенты для Windows, macOS, Linux, Android и iOS. Для настольных систем можно использовать официальный клиент OpenVPN Connect или сторонние приложения. В Linux также доступен Network Manager с плагином network-manager-openvpn.

Для подключения через командную строку в Ubuntu установите пакет openvpn и используйте:

sudo apt install openvpn
sudo openvpn --config client1.ovpn

Если вы хотите запускать VPN как службу systemd, скопируйте файл .ovpn в /etc/openvpn/, переименуйте в .conf и выполните:

sudo systemctl start openvpn@client1

Для автоматической аутентификации по паролю (если используется) можно создать файл auth.txt с логином и паролем и указать его в конфигурации через auth-user-pass /etc/openvpn/auth.txt.

На мобильных устройствах установите приложение OpenVPN Connect и импортируйте файл .ovpn. После подключения проверьте, что ваш публичный IP-адрес изменился, зайдя на сайт типа icanhazip.com.

Оптимизация производительности и безопасности

Для повышения скорости и стабильности соединения можно включить алгоритм TCP BBR на сервере. Добавьте в файл /etc/sysctl.d/60-custom.conf:

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

Примените изменения: sudo sysctl -p /etc/sysctl.d/60-custom.conf. BBR улучшает пропускную способность при потерях пакетов.

Для защиты от атак типа DoS и скрытия факта использования VPN можно использовать tls-crypt (уже упомянутый) или tls-auth. Также рекомендуется регулярно обновлять систему и OpenVPN.

Если вы используете OpenVPN Access Server, вы можете настроить двухфакторную аутентификацию (2FA) и интеграцию с Active Directory/LDAP. Для Community Edition такие функции требуют дополнительной настройки.

Важно: если ваш провайдер блокирует VPN-трафик, можно использовать stunnel для обёртки трафика OpenVPN в TLS-туннель. Это позволяет маскировать VPN-соединение под обычный HTTPS-трафик.

Устранение неполадок и частые ошибки

Если клиент не может подключиться, проверьте:

  • Статус службы OpenVPN: sudo systemctl status openvpn@server.
  • Логи: sudo journalctl -u openvpn@server.
  • Правила брандмауэра: sudo ufw status.
  • IP-пересылку: sysctl net.ipv4.ip_forward.

Частая ошибка — неправильный сетевой интерфейс в правиле NAT. Убедитесь, что вы используете правильное имя интерфейса (например, eth0, ens3).

Если клиент подключается, но нет доступа в интернет, проверьте, что в конфигурации сервера есть push "redirect-gateway def1" и что DNS-серверы доступны.

При использовании OpenVPN Access Server, если DNS не работает, настройте DNS-серверы в панели администратора (например, 8.8.8.8 и 1.1.1.1) и укажите частную подсеть клиентов (например, 172.27.240.0/20).

Если вы используете самоподписанные сертификаты, клиенты могут видеть предупреждения безопасности. Для Access Server можно установить бесплатный сертификат Let's Encrypt, чтобы избежать этого.

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

Можно ли использовать один сервер и как VPN-сервер, и как CA?

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

Какой протокол лучше: UDP или TCP для OpenVPN?

UDP (порт 1194) обеспечивает более высокую производительность и меньшую задержку, что идеально для потокового видео и игр. TCP (порт 443) может быть полезен в сетях, где UDP блокируется или фильтруется, например, в некоторых корпоративных сетях или странах с цензурой. TCP также позволяет маскировать трафик под HTTPS, если используется порт 443.

Как защитить VPN-сервер от атак?

Используйте сильные сертификаты (ECC), включите tls-crypt для скрытия рукопожатия, ограничьте доступ по брандмауэру (разрешите только нужные порты), регулярно обновляйте систему, используйте fail2ban для защиты от brute-force атак, и не забывайте про аннулирование сертификатов через CRL, если клиент скомпрометирован.

Что делать, если VPN-соединение устанавливается, но нет доступа в интернет?

Проверьте, включена ли IP-пересылка на сервере (sysctl net.ipv4.ip_forward должен быть 1). Убедитесь, что в конфигурации сервера есть push "redirect-gateway def1". Проверьте правила NAT в UFW: они должны быть добавлены в файл before.rules с правильным сетевым интерфейсом. Также убедитесь, что DNS-серверы, указанные в push "dhcp-option DNS", доступны.

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

На сервере CA выполните команду ./easyrsa revoke client1, затем сгенерируйте список отозванных сертификатов (CRL) с помощью ./easyrsa gen-crl. Скопируйте файл crl.pem на VPN-сервер и добавьте в конфигурацию crl-verify /etc/openvpn/server/crl.pem. После этого перезапустите OpenVPN. Это предотвратит подключение отозванного клиента.

Нужно ли настраивать DNS для клиентов VPN?

Да, рекомендуется. Если не указать DNS-серверы, клиенты будут использовать DNS своего интернет-провайдера, что может привести к утечке DNS-запросов и снижению конфиденциальности. В конфигурации сервера добавьте push "dhcp-option DNS 8.8.8.8" и push "dhcp-option DNS 1.1.1.1" (или другие DNS-серверы).

Как увеличить скорость VPN-соединения?

Используйте протокол UDP, включите алгоритм TCP BBR на сервере, выберите сервер с хорошим каналом и низкой задержкой, используйте шифрование AES-256-GCM (аппаратно ускоряемое на многих процессорах), и убедитесь, что на сервере достаточно ресурсов (CPU, RAM). Также можно отключить сжатие, если оно не нужно, так как оно может снижать производительность.