VPN сервер для Ubuntu: полное руководство по установке и настройке OpenVPN

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

Зачем нужен собственный VPN-сервер на Ubuntu

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

Основные сценарии использования:

  • Безопасное подключение к публичным Wi-Fi сетям в кафе, аэропортах и отелях.
  • Доступ к ресурсам корпоративной сети из любой точки мира.
  • Обход географических блокировок и цензуры.
  • Шифрование всего интернет-трафика для защиты от перехвата.

OpenVPN — одно из самых популярных решений с открытым исходным кодом. Оно использует SSL/TLS для шифрования и поддерживает аутентификацию на основе сертификатов. OpenVPN работает на большинстве операционных систем, включая Linux, Windows, macOS, Android и iOS. Благодаря гибкой настройке, OpenVPN подходит как для небольших личных проектов, так и для крупных корпоративных сетей, выдерживая тысячи одновременных подключений.

Выбор протокола: UDP или TCP, порт 1194 или 443

При настройке OpenVPN важно выбрать транспортный протокол. UDP (User Datagram Protocol) обычно предпочтителен для VPN, так как он быстрее и эффективнее на стабильных соединениях. Однако UDP не гарантирует доставку пакетов, что может быть проблемой на нестабильных линиях.

TCP (Transmission Control Protocol) обеспечивает надежность за счет повторной передачи потерянных пакетов. Это делает его лучшим выбором для нестабильных соединений, например, мобильного интернета. Кроме того, TCP-порт 443 часто используется для HTTPS-трафика, что позволяет маскировать VPN-трафик и обходить некоторые файрволы, которые блокируют неизвестные порты.

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

При выборе протокола учитывайте:

  • Стабильность вашего интернет-соединения.
  • Необходимость обхода файрволов.
  • Требования к скорости и надежности.

В большинстве случаев UDP на порту 1194 — оптимальный выбор для домашнего использования. Если вы часто путешествуете и подключаетесь из сетей с жесткими ограничениями, рассмотрите TCP на порту 443.

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

Перед установкой OpenVPN необходимо подготовить сервер. Убедитесь, что система обновлена, чтобы избежать уязвимостей:

sudo apt update && sudo apt upgrade -y

После обновления рекомендуется перезагрузить сервер, особенно если обновилось ядро.

Настройка файрвола — критически важный шаг. По умолчанию UFW (Uncomplicated Firewall) может быть включен или выключен. Для безопасности настройте его следующим образом:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp   # SSH
sudo ufw allow 1194/udp # OpenVPN (или 443/tcp, если выбран TCP)
sudo ufw enable

Это разрешит входящие соединения только на порты SSH и OpenVPN, а все остальные будет блокировать. Также можно отключить логирование UFW для снижения нагрузки на диск:

sudo ufw logging off

Дополнительные меры безопасности:

  • Ограничьте SSH-доступ только с определенных IP-адресов.
  • Используйте аутентификацию по SSH-ключам вместо паролей.
  • Установите fail2ban для защиты от brute-force атак.

Правильная настройка файрвола — первый шаг к защите вашего VPN-сервера от несанкционированного доступа.

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

OpenVPN и Easy-RSA доступны в стандартных репозиториях Ubuntu. Установите их одной командой:

sudo apt install openvpn easy-rsa

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

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

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

Ограничение прав доступа (chmod 700) гарантирует, что только владелец может читать и изменять файлы в этом каталоге, что важно для защиты ключей.

Теперь инициализируйте инфраструктуру открытых ключей (PKI):

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

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

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

Настройка центра сертификации (CA) и генерация ключей

Центр сертификации (CA) — это доверенный орган, который подписывает сертификаты для сервера и клиентов. В OpenVPN используется собственный приватный CA, отличный от публичных TLS-сертификатов.

Создайте файл vars в каталоге ~/easy-rsa, чтобы задать параметры для генерации ключей:

nano ~/easy-rsa/vars

Вставьте следующие строки (настройте под себя):

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 "MyOrg"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "IT"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

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

Теперь создайте корневой сертификат CA:

./easyrsa build-ca

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

Если вы не хотите вводить пароль каждый раз, используйте:

./easyrsa build-ca nopass

Но это менее безопасно, так как закрытый ключ CA будет храниться без шифрования.

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

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

Генерация сертификатов для сервера и клиентов

После создания CA необходимо сгенерировать сертификаты для сервера и каждого клиента.

Серверный сертификат:

Перейдите в каталог easy-rsa и выполните:

./easyrsa gen-req server nopass

Эта команда создаст закрытый ключ сервера и запрос на подпись сертификата (CSR). Затем подпишите его с помощью CA:

./easyrsa sign-req server server

Вам потребуется ввести пароль CA, если вы его задавали. После подписания скопируйте сертификат и ключ в каталог OpenVPN:

sudo cp pki/private/server.key /etc/openvpn/server/
sudo cp pki/issued/server.crt /etc/openvpn/server/
sudo cp pki/ca.crt /etc/openvpn/server/

Клиентские сертификаты:

Для каждого клиента создайте отдельный ключ и сертификат. Например, для клиента client1:

./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

Скопируйте файлы клиента (client1.crt, client1.key, ca.crt) на клиентское устройство. Обычно их объединяют в один файл .ovpn.

TLS-ключ для дополнительной защиты:

OpenVPN поддерживает tls-crypt или tls-auth для защиты от сканирования портов и DoS-атак. Создайте ключ:

sudo openvpn --genkey secret ta.key

Скопируйте ta.key в /etc/openvpn/server/ и включите его в конфигурацию сервера и клиентов.

Конфигурация сервера OpenVPN: основные параметры

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

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/server.conf

Отредактируйте файл, указав пути к сертификатам и ключам:

ca ca.crt
cert server.crt
key server.key
dh none  # если используется ECC, иначе укажите dh.pem
tls-crypt ta.key

Важные параметры:

  • port 1194 — порт, на котором слушает сервер.
  • proto udp — протокол (udp или tcp).
  • dev tun — тип устройства (tun для маршрутизации, tap для моста).
  • server 10.8.0.0 255.255.255.0 — подсеть для VPN-клиентов.
  • push "redirect-gateway def1 bypass-dhcp" — перенаправлять весь трафик клиента через VPN.
  • push "dhcp-option DNS 208.67.222.222" — задать DNS-сервер для клиентов (например, OpenDNS).
  • keepalive 10 120 — интервал проверки соединения.
  • user nobody и group nogroup — снижение привилегий для безопасности.
  • persist-key и persist-tun — сохранять ключи и туннель при перезапуске.

Включите IP-пересылку, чтобы клиенты могли выходить в интернет через сервер:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/50-enable-ipv4-forwarding.conf
sudo sysctl -p /etc/sysctl.d/50-enable-ipv4-forwarding.conf

Также настройте NAT в файрволе, чтобы пакеты от клиентов корректно маршрутизировались:

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Замените eth0 на ваш сетевой интерфейс.

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

После настройки конфигурации запустите сервер OpenVPN. В Ubuntu используется systemd с шаблонными юнитами:

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

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

sudo systemctl status openvpn-server@server

Логи можно посмотреть командой:

journalctl -u openvpn-server@server -f

Для добавления нового клиента можно использовать скрипт установки Nyr, который автоматизирует процесс. Скачайте и запустите его:

wget https://git.io/vpn -O openvpn-install.sh
chmod +x openvpn-install.sh
sudo ./openvpn-install.sh

Скрипт предложит выбрать протокол, порт, DNS и имя клиента. После завершения он создаст файл .ovpn в /root/.

Если вы предпочитаете ручное добавление, повторите шаги генерации сертификата и создайте файл конфигурации клиента вручную.

Файл .ovpn содержит все необходимые параметры: адрес сервера, порт, протокол, сертификаты и ключи. Его можно передать клиенту любым удобным способом (по электронной почте, через защищенный канал).

Настройка клиента на Linux, Windows и мобильных устройствах

Linux (NetworkManager):

Большинство дистрибутивов Linux включают NetworkManager с поддержкой OpenVPN. Импортируйте файл .ovpn через графический интерфейс или командой:

nmcli connection import type openvpn file client1.ovpn

Затем подключитесь:

nmcli connection up client1

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

Windows:

Установите официальный клиент OpenVPN с официального сайта. Импортируйте .ovpn файл через интерфейс или поместите его в папку config в каталоге установки. Запустите клиент от имени администратора и подключитесь.

macOS:

Используйте Tunnelblick или официальный клиент OpenVPN. Импортируйте .ovpn и подключитесь.

Android/iOS:

Установите приложение OpenVPN Connect из магазина приложений. Импортируйте .ovpn файл и подключитесь.

После подключения проверьте, что ваш публичный IP-адрес изменился на IP сервера, и что DNS работает корректно. Это можно сделать на сайтах типа dnsleaktest.com.

Безопасность, мониторинг и устранение неполадок

Регулярные обновления:

Своевременно обновляйте систему и OpenVPN, чтобы закрывать известные уязвимости:

sudo apt update && sudo apt upgrade -y

Мониторинг:

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

journalctl -u openvpn-server@server -f

Увеличьте уровень детализации логов (verb) в конфигурации, если нужно больше информации для диагностики.

Защита от атак:

  • Используйте tls-crypt для защиты от сканирования портов.
  • Ограничьте количество одновременных подключений.
  • Настройте fail2ban для блокировки повторяющихся неудачных попыток.

Типичные проблемы:

  • Нет соединения: проверьте, что порт открыт в файрволе и сервер запущен.
  • DNS не работает: убедитесь, что push-опции DNS заданы корректно.
  • Медленное соединение: попробуйте использовать UDP вместо TCP, проверьте качество канала.
  • Ошибки сертификатов: проверьте, что все файлы сертификатов на месте и имеют правильные права доступа.

Отзыв сертификата:

Если клиентский сертификат скомпрометирован, отзовите его с помощью easy-rsa:

./easyrsa revoke client1

После этого обновите список отозванных сертификатов (CRL) в конфигурации сервера.

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

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

UDP обычно быстрее и эффективнее, поэтому рекомендуется для стабильных соединений. TCP надежнее на нестабильных линиях и может помочь обойти файрволы, если использовать порт 443. Выбор зависит от ваших условий: если соединение стабильное и нет ограничений, выбирайте UDP; если вы часто подключаетесь из сетей с блокировками, TCP на порту 443 будет более универсальным.

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

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

Как добавить нового клиента к уже работающему серверу OpenVPN?

Самый простой способ — запустить скрипт установки Nyr (openvpn-install.sh) и выбрать опцию добавления нового клиента. Скрипт сгенерирует сертификаты и создаст файл .ovpn. Вручную нужно сгенерировать ключ и сертификат через easy-rsa, подписать их CA, а затем собрать файл конфигурации клиента, включив в него сертификаты и ключи.

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

Проверьте, включена ли IP-пересылка на сервере (net.ipv4.ip_forward = 1). Убедитесь, что настроен NAT (iptables MASQUERADE) для подсети VPN. Также проверьте, что DNS-серверы, передаваемые клиентам, доступны. Если проблема сохраняется, посмотрите логи сервера и клиента для выявления ошибок маршрутизации.

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

Используйте tls-crypt, чтобы скрыть порт от сканирования. Настройте fail2ban для блокировки IP-адресов после нескольких неудачных попыток. Ограничьте SSH-доступ (например, только по ключам) и используйте сложные пароли. Регулярно обновляйте систему и OpenVPN.

Можно ли использовать OpenVPN на роутере с OpenWrt?

Да, OpenVPN поддерживается на многих роутерах с OpenWrt. Это позволяет организовать VPN-подключение для всей домашней сети без настройки каждого устройства отдельно. Установите пакет openvpn в OpenWrt и импортируйте конфигурацию клиента или сервера.

Как проверить, что VPN действительно шифрует трафик и не пропускает DNS-запросы?

Используйте сервисы проверки утечек DNS, например dnsleaktest.com. Подключитесь к VPN и проверьте, что ваш IP-адрес соответствует серверу, а DNS-серверы — те, что вы настроили. Также можно использовать tcpdump или Wireshark для анализа трафика и убедиться, что пакеты зашифрованы.