Зачем поднимать собственный VPN-сервер
Собственный VPN-сервер на Ubuntu 22.04 решает задачи, которые не всегда под силу коммерческим сервисам. Прежде всего, это независимость: вы не зависите от политики логирования провайдера и можете быть уверены, что ваши данные не передаются третьим лицам. Для системного администратора такой сервер — способ организовать безопасный удалённый доступ к внутренним ресурсам, например к почтовому серверу или базе данных, ограничив вход только через VPN-адрес.
Кроме того, самостоятельный VPN полезен, когда нужно обойти географические блокировки или фильтрацию трафика. В отличие от готовых решений, вы полностью контролируете конфигурацию: выбираете порты, протоколы, методы шифрования и даже можете добавить дополнительные меры защиты, такие как Stunnel для маскировки трафика. Это особенно актуально в странах с жёсткой интернет-цензурой.
Наконец, настройка VPN — отличный способ изучить, как работают туннели, сертификаты и сетевые маршруты. Даже если вы не планируете использовать его в продакшене, полученные навыки пригодятся при работе с другими сетевыми сервисами.
OpenVPN или OpenVPN Access Server: что выбрать
OpenVPN — это open-source решение, которое распространяется бесплатно и настраивается через конфигурационные файлы. Оно идеально подходит для тех, кто хочет полностью контролировать процесс и не нуждается в веб-интерфейсе. Однако для управления множеством пользователей и сертификатов придётся вручную редактировать файлы и использовать командную строку.
OpenVPN Access Server — коммерческий продукт на базе OpenVPN, который предоставляет удобную веб-панель для администрирования, автоматическое создание пользователей и профилей, а также поддержку RADIUS, LDAP и двухфакторной аутентификации. Он проще в установке: достаточно добавить репозиторий и выполнить несколько команд. Однако бесплатная лицензия ограничена двумя одновременными подключениями, а для большего числа пользователей потребуется покупка подписки.
Для небольших проектов и временных подключений достаточно классического OpenVPN. Если же вам нужно обслуживать десятки или сотни пользователей с минимальными усилиями, стоит рассмотреть Access Server. В этой статье мы сосредоточимся на настройке классического OpenVPN, так как он даёт больше гибкости и не требует лицензионных отчислений.
Подготовка сервера и установка пакетов
Перед началом убедитесь, что у вас есть сервер с Ubuntu 22.04, доступ к root-правам и открытый порт 1194/UDP (или другой, если вы планируете изменить стандартный). Если сервер находится за NAT или файрволом, необходимо настроить проброс портов.
Начните с обновления системы и установки необходимых пакетов:
sudo apt update
sudo apt upgrade -y
sudo apt install openvpn easy-rsaПакет easy-rsa содержит скрипты для управления PKI (Public Key Infrastructure). Создайте отдельную директорию для работы с ключами и сделайте символическую ссылку на скрипты:
mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/Установите права, чтобы только ваш пользователь мог читать и изменять файлы:
sudo chown $USER ~/easy-rsa
chmod 700 ~/easy-rsaТеперь система готова к созданию сертификатов.
Создание PKI и центра сертификации
PKI — это набор сертификатов и ключей, которые обеспечивают взаимную аутентификацию между сервером и клиентами. В OpenVPN используется собственная приватная PKI, отличная от публичных TLS-сертификатов для веб-сайтов.
Перейдите в директорию easy-rsa и инициализируйте PKI:
cd ~/easy-rsa
./easyrsa init-pkiЗатем создайте центр сертификации (CA):
./easyrsa build-caВ процессе вам будет предложено ввести пароль для защиты CA-ключа. Этот пароль потребуется при подписании сертификатов, поэтому сохраните его в надёжном месте. Также можно указать общее имя (Common Name) для CA, например my-vpn-ca.
Для повышения безопасности рекомендуется использовать алгоритм EC (Elliptic Curve) и хэш SHA-512. Для этого перед инициализацией PKI отредактируйте файл vars в директории easy-rsa:
nano ~/easy-rsa/varsДобавьте строки:
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"Это обеспечит современный уровень криптографии и совместимость с большинством клиентов.
Генерация сертификатов для сервера и клиентов
После создания CA сгенерируйте ключ и сертификат для сервера. Войдите в директорию easy-rsa и выполните:
./easyrsa gen-req myservername nopassЗамените myservername на имя вашего сервера (например, vpn-server). Параметр nopass означает, что ключ не будет защищён паролем, что необходимо для автоматического запуска сервиса.
Подпишите запрос сертификата:
./easyrsa sign-req server myservernameСкопируйте сгенерированные файлы в директорию /etc/openvpn/server/:
sudo cp ~/easy-rsa/pki/private/myservername.key /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/issued/myservername.crt /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/ca.crt /etc/openvpn/server/Также создайте ключ TLS-аутентификации (ta.key), который защищает от DoS-атак и сканирования портов:
openvpn --genkey secret ta.key
sudo cp ta.key /etc/openvpn/server/Для каждого клиента процесс аналогичен: создайте запрос, подпишите его и скопируйте ключи. Удобно хранить клиентские ключи в отдельной директории, например ~/client-configs/keys/.
Пример для клиента client001:
./easyrsa gen-req client001 nopass
./easyrsa sign-req client client001Скопируйте client001.crt, client001.key, ca.crt и ta.key в директорию клиента.
Конфигурация сервера OpenVPN
Создайте конфигурационный файл сервера /etc/openvpn/server/server.conf. В качестве основы можно использовать пример из документации OpenVPN:
sudo nano /etc/openvpn/server/server.confМинимальная рабочая конфигурация выглядит так:
port 1194
proto udp
dev tun
ca ca.crt
cert myservername.crt
key myservername.key
dh none
tls-crypt ta.key
server 10.8.0.0 255.255.255.0
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
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3Пояснения:
port 1194иproto udp— стандартные параметры, можно изменить при необходимости.dev tun— создаёт виртуальный туннельный интерфейс.dh none— отключает использование Diffie-Hellman, так как мы используем ECDH.tls-crypt ta.key— шифрует TLS-канал и защищает от сканирования.server 10.8.0.0 255.255.255.0— задаёт подсеть для VPN-клиентов.push "redirect-gateway def1 bypass-dhcp"— перенаправляет весь трафик клиента через VPN.push "dhcp-option DNS ..."— задаёт DNS-серверы для клиентов.user nobodyиgroup nogroup— запуск с пониженными привилегиями для безопасности.
Если вы не хотите, чтобы весь трафик шёл через VPN, закомментируйте строку redirect-gateway и добавьте маршруты для конкретных подсетей, например:
push "route 10.1.0.0 255.255.255.0"Настройка сетевых параметров и файрвола
Чтобы сервер мог маршрутизировать трафик между VPN-клиентами и интернетом, необходимо включить IP-пересылку. Отредактируйте файл /etc/sysctl.conf:
sudo nano /etc/sysctl.confРаскомментируйте строку net.ipv4.ip_forward=1 и примените изменения:
sudo sysctl -pЗатем настройте NAT (маскировку) через файрвол. Если используется UFW, отредактируйте /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 напрямую, добавьте аналогичные правила вручную.
Запуск сервера и создание клиентских профилей
После настройки конфигурации запустите сервер OpenVPN. В Ubuntu 22.04 сервис называется openvpn-server@server (имя соответствует имени конфигурационного файла без расширения). Выполните:
sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@serverПроверьте статус:
sudo systemctl status openvpn-server@serverЕсли всё в порядке, вы увидите сообщение Initialization Sequence Completed.
Для создания клиентских конфигурационных файлов удобно использовать скрипт, который собирает все ключи и сертификаты в один файл .ovpn. Создайте базовый конфиг ~/client-configs/base.conf:
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
key-direction 1Затем создайте скрипт make_config.sh, который подставляет ключи в файл:
#!/bin/bash
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '') \
${KEY_DIR}/ca.crt \
<(echo -e '\n') \
${KEY_DIR}/${1}.crt \
<(echo -e '\n') \
${KEY_DIR}/${1}.key \
<(echo -e '\n') \
${KEY_DIR}/ta.key \
<(echo -e '') \
> ${OUTPUT_DIR}/${1}.ovpnСделайте скрипт исполняемым и сгенерируйте профиль для клиента:
chmod 700 ~/client-configs/make_config.sh
~/client-configs/make_config.sh client001Файл client001.ovpn готов к использованию на клиентском устройстве.
Подключение клиентов на Ubuntu, Windows и macOS
На клиентском компьютере с Ubuntu установите OpenVPN:
sudo apt install openvpnСкопируйте файл .ovpn в /etc/openvpn/ и переименуйте в .conf:
sudo cp client001.ovpn /etc/openvpn/client001.confЕсли для аутентификации требуется имя пользователя и пароль, добавьте в конфиг строку auth-user-pass и создайте файл с учётными данными.
Запустите подключение:
sudo systemctl start openvpn@client001Проверьте статус и убедитесь, что появилось сообщение Initialization Sequence Completed.
Для управления через Network Manager установите плагины:
sudo apt install network-manager-openvpn network-manager-openvpn-gnomeПосле этого импортируйте .ovpn файл через графический интерфейс.
На Windows и macOS можно использовать официальный клиент OpenVPN Connect, который доступен на сайте OpenVPN. Просто импортируйте .ovpn файл и введите учётные данные, если они требуются.
Для проверки подключения посетите сайт типа icanhazip.com — вы должны увидеть IP-адрес вашего VPN-сервера.
Типичные проблемы и их решение
Проблема: не удаётся подключиться, в логах ошибка TLS.
Причины: несовпадение ключей, неправильные пути к файлам или неверный key-direction. Убедитесь, что на сервере и клиенте используются одинаковые ca.crt и ta.key, а также что в конфигурации клиента указано key-direction 1, а на сервере — key-direction 0 (или наоборот, в зависимости от версии).
Проблема: трафик не маршрутизируется.
Проверьте, включена ли IP-пересылка (sysctl net.ipv4.ip_forward должен возвращать 1), и правильно ли настроен NAT. Убедитесь, что в правилах файрвола разрешён форвардинг и что интерфейс в правиле MASQUERADE соответствует вашему внешнему интерфейсу.
Проблема: DNS не работает у клиентов.
Если вы используете push "dhcp-option DNS ...", убедитесь, что клиент поддерживает эту опцию. В некоторых случаях помогает указать DNS-серверы вручную в настройках сетевого подключения клиента.
Проблема: низкая скорость соединения.
Попробуйте включить алгоритм TCP BBR на сервере, добавив в /etc/sysctl.d/60-custom.conf:
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbrЗатем примените sudo sysctl -p. Также проверьте, не используете ли вы слишком тяжёлое шифрование — AES-256-GCM обычно оптимален.
Проблема: сервер не запускается.
Проверьте синтаксис конфигурационного файла командой sudo openvpn --config /etc/openvpn/server/server.conf. Часто ошибки возникают из-за неправильных путей к ключам или неверных параметров.
Вопросы и ответы
Можно ли использовать OpenVPN на Ubuntu 22.04 без easy-rsa?
Да, можно использовать статические ключи, но это менее безопасно и не масштабируется. easy-rsa позволяет создавать сертификаты для каждого клиента, что обеспечивает взаимную аутентификацию и возможность отзыва доступа. Для продакшена рекомендуется использовать PKI.
Как изменить порт OpenVPN с 1194 на другой?
В конфигурационном файле сервера измените строку port 1194 на нужный порт, например port 443. Также укажите соответствующий протокол (proto tcp или proto udp). Не забудьте открыть новый порт в файрволе и обновить клиентские конфигурации.
Что делать, если OpenVPN блокируется файрволом провайдера?
Можно использовать порт 443/TCP, который обычно не блокируется, или настроить Stunnel для маскировки трафика. Stunnel оборачивает OpenVPN-трафик в TLS, что делает его неотличимым от обычного HTTPS. Также можно использовать OpenVPN over SSH или другие туннели.
Как добавить нового пользователя в существующий OpenVPN-сервер?
Создайте новый сертификат для клиента с помощью easy-rsa: ./easyrsa gen-req client002 nopass и ./easyrsa sign-req client client002. Затем скопируйте ключи и сгенерируйте .ovpn файл с помощью скрипта make_config.sh. Никаких изменений на сервере не требуется, если вы используете сертификаты.
Нужно ли открывать порт 1194 в UFW, если используется OpenVPN Access Server?
Да, Access Server по умолчанию слушает TCP-порт 443 и UDP-порт 1194. Вам нужно открыть оба порта в файрволе, а также порт 943 для веб-интерфейса. В документации Access Server указаны точные требования.
Как обеспечить автоматический запуск OpenVPN при загрузке системы?
Используйте systemd: sudo systemctl enable openvpn-server@server для сервера и sudo systemctl enable openvpn@client001 для клиента. Убедитесь, что конфигурационные файлы имеют правильные имена и находятся в /etc/openvpn/server/ или /etc/openvpn/ соответственно.
Можно ли использовать один сертификат для нескольких клиентов?
Технически можно, но это небезопасно, так как невозможно отозвать доступ для одного клиента без отзыва сертификата для всех. Рекомендуется создавать уникальный сертификат для каждого пользователя или устройства.