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

Подробное руководство по установке и настройке OpenVPN-сервера на Ubuntu 22.04: подготовка PKI, генерация сертификатов, настройка брандмауэра и клиентских подключений.

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

Собственный VPN-сервер на Ubuntu решает несколько практических задач: защита трафика в публичных Wi-Fi сетях, обход географических блокировок, безопасный удалённый доступ к корпоративной инфраструктуре и изоляция рабочих процессов от домашней сети. В отличие от коммерческих VPN-сервисов, самостоятельный сервер даёт полный контроль над конфигурацией, логами и политиками безопасности.

Однако важно понимать ограничения. Развёртывание требует базовых навыков администрирования Linux, времени на поддержку и ответственности за безопасность. Если вам нужен быстрый доступ к заблокированным ресурсам без технических хлопот, готовые сервисы могут быть удобнее. Но для постоянного использования, особенно в рабочих целях, собственный сервер часто оказывается надёжнее и дешевле в долгосрочной перспективе.

OpenVPN остаётся одним из самых зрелых и проверенных решений с открытым исходным кодом. Он поддерживает современные алгоритмы шифрования, гибкую настройку аутентификации и работает на всех популярных платформах. В этом руководстве мы рассмотрим установку на Ubuntu 22.04, используя подход с отдельным центром сертификации (CA) для повышения безопасности.

Предварительные требования: что нужно для установки

Перед началом убедитесь, что у вас есть:

  • Сервер под управлением Ubuntu 22.04 с доступом по SSH. Это может быть VPS от любого облачного провайдера или локальная машина.
  • Публичный IP-адрес, по которому сервер будет доступен из интернета. Если используете NAT или reverse-proxy, убедитесь, что порт 1194/UDP проброшен корректно.
  • Права суперпользователя (sudo) на сервере.
  • Желательно отдельный сервер для центра сертификации (CA), чтобы минимизировать риски при компрометации ключей. В тестовой среде можно совместить, но для production это не рекомендуется.

Также обновите систему перед установкой:

sudo apt update && sudo apt upgrade -y

Убедитесь, что межсетевой экран (UFW или iptables) настроен и разрешает входящие соединения на порт 1194/UDP. Если вы планируете использовать другой порт, откройте его.

Установка Easy-RSA и подготовка инфраструктуры открытых ключей

Easy-RSA — это набор скриптов для управления центром сертификации. Он позволяет создавать корневые сертификаты, подписывать запросы и управлять сроками действия.

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

sudo apt install openvpn easy-rsa

Создайте рабочую директорию и символические ссылки на скрипты:

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

Перейдите в директорию и инициализируйте PKI (инфраструктуру открытых ключей):

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

Эта команда создаст структуру каталогов для хранения ключей и сертификатов. Далее настройте параметры криптографии в файле vars:

nano vars

Добавьте строки:

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Использование эллиптических кривых (EC) вместо RSA ускоряет обмен ключами и снижает нагрузку на процессор. Это особенно важно для мобильных устройств.

Создание центра сертификации и корневых ключей

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

Создайте корневой сертификат:

./easyrsa build-ca

Вам будет предложено ввести парольную фразу для ключа CA. Обязательно сохраните её — она понадобится для подписи сертификатов. Также можно указать общее имя (CN), но можно оставить значение по умолчанию.

Если вы не хотите вводить пароль при каждом обращении к CA, используйте команду ./easyrsa build-ca nopass, но это снижает безопасность.

В результате будут созданы два файла:

  • ~/easy-rsa/pki/ca.crt — публичный сертификат CA, который нужно распространить среди всех клиентов и сервера.
  • ~/easy-rsa/pki/ca.key — закрытый ключ CA, который должен оставаться только на CA-сервере.

Рекомендуется держать CA-сервер в автономном режиме, когда он не используется для подписи, чтобы минимизировать риск кражи ключа.

Генерация сертификата и ключей для сервера OpenVPN

Теперь на сервере OpenVPN создайте отдельный PKI и сгенерируйте запрос на сертификат (CSR). Это необходимо, даже если вы используете один сервер для всего, чтобы разделить роли.

Перейдите в директорию ~/easy-rsa на сервере OpenVPN и инициализируйте PKI:

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

Создайте закрытый ключ и запрос на сертификат для сервера:

./easyrsa gen-req server nopass

Здесь server — это общее имя (CN) сервера. Опция nopass позволяет не вводить пароль для ключа, что упрощает автоматический запуск сервиса.

Скопируйте закрытый ключ в директорию OpenVPN:

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

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

cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
./easyrsa sign-req server server

При подписи введите пароль CA и подтвердите детали запроса. После этого скопируйте подписанный сертификат server.crt и ca.crt обратно на сервер OpenVPN в /etc/openvpn/server/.

Настройка параметров сервера OpenVPN

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

Базовый минимальный конфиг:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
tls-crypt ta.key
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"
keepalive 10 120
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

Пояснения:

  • port 1194 и proto udp — стандартные параметры; UDP быстрее для VPN, но если сеть блокирует UDP, можно использовать TCP.
  • dev tun — создаёт виртуальный туннельный интерфейс.
  • tls-crypt ta.key — использует общий ключ для защиты от DDoS и сканирования портов. Этот ключ нужно сгенерировать заранее:
openvpn --genkey secret ta.key
  • server 10.8.0.0 255.255.255.0 — задаёт подсеть для клиентов.
  • push "redirect-gateway def1" — перенаправляет весь трафик клиента через VPN.
  • push "dhcp-option DNS 8.8.8.8" — задаёт DNS-сервер для клиентов; можно указать свой.
  • user nobody и group nogroup — понижают привилегии процесса для безопасности.

Если вы не хотите, чтобы весь трафик шёл через VPN, закомментируйте строку redirect-gateway и добавьте маршруты для нужных подсетей, например:

push "route 10.1.0.0 255.255.255.0"

Настройка сетевых параметров и брандмауэра

Чтобы сервер OpenVPN мог маршрутизировать трафик клиентов, необходимо включить IP-форвардинг и настроить NAT.

Отредактируйте файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Раскомментируйте строку net.ipv4.ip_forward=1 и примените изменения:

sudo sysctl -p

Если используете UFW, добавьте правила для NAT. Откройте файл /etc/ufw/before.rules и добавьте в начало:

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

Замените eth0 на ваш внешний интерфейс (можно узнать через ip route list default).

Также измените политику форвардинга в /etc/default/ufw:

DEFAULT_FORWARD_POLICY="ACCEPT"

Разрешите порт OpenVPN и SSH:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

Затем перезапустите UFW:

sudo ufw disable
sudo ufw enable

Если вы используете iptables напрямую, аналогичные правила можно добавить вручную или через скрипт. Важно, чтобы правила NAT применялись после перезагрузки.

Создание клиентских сертификатов и конфигурационных файлов

Для каждого клиента нужно создать отдельный сертификат. Это позволяет отзывать доступ индивидуально.

На сервере OpenVPN (или на CA-сервере, если он отдельный) выполните:

cd ~/easy-rsa
./easyrsa gen-req client001 nopass
./easyrsa sign-req client client001

Скопируйте файлы клиента в отдельную директорию, например ~/client-configs/keys/:

mkdir -p ~/client-configs/keys
cp ~/easy-rsa/pki/private/client001.key ~/client-configs/keys/
cp ~/easy-rsa/pki/issued/client001.crt ~/client-configs/keys/
cp ~/easy-rsa/ta.key ~/client-configs/keys/
cp /etc/openvpn/server/ca.crt ~/client-configs/keys/

Теперь создайте базовый конфигурационный файл клиента. Пример можно взять из официального репозитория, но мы приведём упрощённый вариант:

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

Вместо your-server-ip укажите реальный IP или домен сервера. Чтобы упростить распространение, можно создать скрипт, который объединяет сертификаты и ключи в один файл .ovpn. Пример такого скрипта приведён в статье на IT Pro Blog.

После генерации файла .ovpn его можно импортировать в любой клиент OpenVPN — на Windows, Linux, macOS, Android или iOS.

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

После настройки всех файлов запустите сервер OpenVPN:

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

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

sudo systemctl status openvpn-server@server

Если сервис не запустился, посмотрите логи:

sudo journalctl -u openvpn-server@server -f

Типичные ошибки: неправильные пути к сертификатам, отсутствие ключа ta.key, проблемы с правами на файлы. Убедитесь, что все файлы в /etc/openvpn/server/ доступны для чтения процессом.

Для проверки подключения с клиента импортируйте .ovpn файл и установите соединение. После подключения проверьте IP-адрес на клиенте — он должен быть IP вашего VPN-сервера, если включён redirect-gateway.

Также можно проверить статус подключений на сервере:

sudo cat /etc/openvpn/server/openvpn-status.log

Здесь будут видны IP-адреса и время подключения клиентов.

Дополнительные настройки: статические IP, ограничения и безопасность

В некоторых случаях требуется назначать клиентам статические IP-адреса. Для этого используйте директорию client-config-dir (в конфиге сервера укажите client-config-dir /etc/openvpn/ccd). Создайте файл с именем клиента (например, client001) в этой директории и добавьте:

ifconfig-push 10.8.0.10 255.255.255.0

Это закрепит за клиентом адрес 10.8.0.10.

Для повышения безопасности:

  • Используйте tls-crypt вместо tls-auth — он шифрует весь TLS-канал, скрывая метаданные.
  • Ограничьте количество одновременных подключений директивой max-clients.
  • Включите client-to-client только если клиентам нужно общаться между собой.
  • Регулярно обновляйте сертификаты и отзывайте неиспользуемые.
  • Настройте fail2ban для защиты от brute-force атак на SSH.

Также стоит настроить мониторинг: проверяйте логи, следите за нагрузкой на сервер. Если VPN используется для обхода блокировок, учитывайте, что провайдер может блокировать стандартные порты — в этом случае можно изменить порт на 443/TCP, что часто маскирует трафик под HTTPS.

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

Сколько времени занимает установка OpenVPN-сервера на Ubuntu?

При наличии подготовленного сервера и базовых навыков установка занимает около 30–60 минут. Основное время уходит на генерацию сертификатов и настройку брандмауэра. Если вы используете скрипты автоматизации, процесс можно сократить до 10–15 минут.

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

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

Какой алгоритм шифрования лучше выбрать: RSA или ECC?

ECC (эллиптические кривые) обеспечивает более высокую производительность при том же уровне безопасности, так как использует меньшие ключи. Для OpenVPN рекомендуется использовать ECC с алгоритмом ec и дайджестом sha512. Это особенно важно для мобильных устройств с ограниченными ресурсами.

Что делать, если клиент не может подключиться к серверу?

Проверьте несколько моментов: доступность порта 1194/UDP с внешней стороны (используйте nc -u -v server-ip 1194), правильность путей к сертификатам в конфиге сервера, наличие ta.key на клиенте, синхронизацию времени (TLS чувствителен к расхождению часов). Также посмотрите логи на сервере: journalctl -u openvpn-server@server -f.

Как отозвать доступ для конкретного клиента?

Самый простой способ — удалить сертификат клиента из доверенных. В OpenVPN можно использовать CRL (Certificate Revocation List). Сгенерируйте CRL на CA-сервере: ./easyrsa revoke client001, затем ./easyrsa gen-crl. Скопируйте crl.pem на сервер и добавьте в конфиг директиву crl-verify crl.pem. После этого перезапустите сервер.

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

Рекомендуется, чтобы избежать утечек DNS-запросов. В конфиге сервера используйте push "dhcp-option DNS 8.8.8.8" или укажите свой DNS-сервер. Если вы используете redirect-gateway, все DNS-запросы пойдут через VPN, что повышает конфиденциальность.

Можно ли использовать OpenVPN для обхода блокировок в России?

OpenVPN может помочь обойти некоторые блокировки, но провайдеры активно блокируют стандартные порты и используют DPI для обнаружения VPN-трафика. В таких случаях помогает смена порта на 443/TCP или использование протоколов, маскирующихся под HTTPS (например, OpenVPN over SSL). Однако гарантий нет, и это может нарушать местное законодательство.