Настройка OpenVPN на Ubuntu: пошаговое руководство для безопасного подключения

Узнайте, как установить и настроить OpenVPN на Ubuntu. Подробное руководство по созданию сервера, генерации сертификатов, настройке клиентов и обеспечению безопасности.

Что такое OpenVPN и зачем он нужен

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

Основные сценарии использования OpenVPN включают:

  • Объединение нескольких локальных сетей в единую виртуальную сеть через интернет.
  • Безопасный доступ к рабочей сети из дома или в поездках.
  • Обход географических блокировок и цензуры, если сервер расположен в другой стране.
  • Реализация политики сетевой безопасности, например, ограничение доступа к сервисам по IP-адресу VPN.

OpenVPN поддерживает два основных режима работы: режим моста (tap) и режим маршрутизации (tun). Режим tun используется чаще, так как он более эффективен и подходит для большинства задач, включая доступ в интернет и соединение сетей. Режим tap позволяет работать на канальном уровне, что может потребоваться для некоторых протоколов, но он менее производителен.

Важным преимуществом OpenVPN является его кроссплатформенность: клиенты доступны для Linux, Windows, macOS, Android и iOS. Это упрощает развертывание VPN в гетерогенной среде.

Выбор подхода: OpenVPN Community или Access Server

Перед началом настройки важно определиться, какой вариант OpenVPN использовать. Существует два основных: OpenVPN Community (бесплатная версия с открытым исходным кодом) и OpenVPN Access Server (коммерческий продукт с веб-интерфейсом и дополнительными функциями).

OpenVPN Community — это классический пакет, который устанавливается из репозиториев Ubuntu. Он предоставляет гибкость в настройке, но требует ручного редактирования конфигурационных файлов и управления сертификатами. Этот вариант подходит для опытных администраторов и тех, кто хочет полностью контролировать процесс.

OpenVPN Access Server — это проприетарное решение, которое упрощает управление через веб-панель администратора. Оно поддерживает такие функции, как интеграция с Active Directory/LDAP, двухфакторная аутентификация, RADIUS-учет и виртуальный хостинг. Access Server автоматически настраивает пересылку IP и маскировку, что снижает порог входа. Однако бесплатная лицензия ограничена двумя одновременными подключениями, а за большее количество пользователей придется платить.

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

Подготовка сервера и установка необходимых пакетов

Перед установкой OpenVPN необходимо подготовить сервер. Рекомендуется использовать VPS с Ubuntu 20.04 или 22.04, имеющий белый (публичный) IP-адрес. Если сервер находится за NAT, потребуется проброс портов на роутере.

Первым делом обновите систему:

sudo apt update && sudo apt upgrade -y

Затем установите OpenVPN и инструмент easy-rsa, который используется для генерации сертификатов:

sudo apt install openvpn easy-rsa

Если вы планируете использовать OpenVPN Access Server, установка отличается: необходимо добавить официальный репозиторий и импортировать GPG-ключ. Но в рамках этого руководства мы используем Community-версию.

После установки создайте каталог для easy-rsa и символические ссылки на скрипты:

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

Это обеспечит изоляцию PKI (инфраструктуры открытых ключей) и защитит файлы от несанкционированного доступа. Далее перейдите в каталог и инициализируйте PKI:

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

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

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

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

Установите easy-rsa на сервере CA:

sudo apt install easy-rsa
mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
chmod 700 ~/easy-rsa
cd ~/easy-rsa
./easyrsa init-pki

Создайте файл vars с параметрами организации. Например:

nano vars

Вставьте следующее содержимое (замените значения на свои):

set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
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 (эллиптических кривых) вместо RSA ускоряет обмен ключами и повышает производительность. Теперь создайте корневой сертификат CA:

./easyrsa build-ca

Вам будет предложено ввести парольную фразу для закрытого ключа CA. Запишите ее в надежное место — она понадобится для подписи сертификатов. Также можно использовать команду ./easyrsa build-ca nopass, если вы хотите избежать запроса пароля, но это менее безопасно.

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

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

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

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

На сервере OpenVPN (не на CA) выполните:

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

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

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

Затем скопируйте файл запроса на сервер CA, например, с помощью scp:

scp ~/easy-rsa/pki/reqs/server.req user@ca_server:/tmp/

На сервере CA импортируйте запрос и подпишите его:

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

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

scp ~/easy-rsa/pki/issued/server.crt user@vpn_server:/tmp/

На сервере OpenVPN переместите сертификат в нужное место:

sudo cp /tmp/server.crt /etc/openvpn/server/

Аналогичным образом создаются сертификаты для клиентов. Для каждого клиента выполните на сервере OpenVPN:

./easyrsa gen-req client1 nopass

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

Создание конфигурации сервера OpenVPN

После генерации сертификатов необходимо создать конфигурационный файл сервера. Пример конфигурации можно найти в документации 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
tls-server
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
push "redirect-gateway def1"
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 /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
mute 20

Обратите внимание на следующие параметры:

  • dh none — отключает использование файла Диффи-Хеллмана, если вы используете ECC-сертификаты. Если вы используете RSA, укажите путь к файлу dh.pem.
  • tls-auth — дополнительный уровень защиты от DoS-атак, использует статический ключ ta.key. Его можно сгенерировать командой openvpn --genkey --secret ta.key.
  • push "redirect-gateway def1" — перенаправляет весь трафик клиента через VPN.
  • push "dhcp-option DNS ..." — задает DNS-серверы для клиентов.

Если вы хотите, чтобы клиенты могли общаться друг с другом, добавьте директиву client-to-client. Для ограничения числа одновременных подключений используйте max-clients 10.

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

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

Проверьте статус и убедитесь, что интерфейс tun0 создан:

ip addr show tun0

Настройка маршрутизации и межсетевого экрана

Для того чтобы клиенты могли выходить в интернет через VPN-сервер, необходимо настроить пересылку IP-пакетов и NAT (маскировку). Включите пересылку IPv4, отредактировав файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

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

sudo sysctl -p

Затем настройте NAT с помощью iptables. Определите имя внешнего интерфейса (обычно eth0 или ens3) и выполните:

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

Чтобы правила сохранялись после перезагрузки, установите пакет iptables-persistent и сохраните правила:

sudo apt install iptables-persistent
sudo netfilter-persistent save

Если на сервере включен межсетевой экран UFW, разрешите входящие подключения к порту OpenVPN и исходящий трафик с tun0:

sudo ufw allow 1194/udp
sudo ufw allow out on tun0
sudo ufw enable

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

sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Эти настройки обеспечат корректную маршрутизацию трафика от клиентов через сервер.

Настройка клиента OpenVPN на Ubuntu

Для подключения к серверу OpenVPN с клиентского компьютера под управлением Ubuntu необходимо установить клиентское ПО и создать конфигурационный файл.

Установите OpenVPN:

sudo apt install openvpn

Скопируйте на клиент следующие файлы с сервера:

  • ca.crt — сертификат CA.
  • client1.crt — сертификат клиента.
  • client1.key — закрытый ключ клиента.
  • ta.key — статический ключ TLS (если используется).

Создайте конфигурационный файл /etc/openvpn/client.conf со следующим содержимым:

client
dev tun
proto udp
remote your-server-ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key
tls-auth /etc/openvpn/ta.key 1
cipher AES-256-GCM
auth SHA256
remote-cert-tls server
verb 3

Если вы используете единый файл .ovpn для импорта на мобильные устройства, включите сертификаты и ключи непосредственно в файл, используя теги `, , , . При этом замените директиву tls-auth на key-direction 1`, чтобы избежать ошибок аутентификации.

Запустите клиент с помощью systemd:

sudo systemctl start openvpn@client
sudo systemctl enable openvpn@client

Проверьте подключение, выполнив ping 10.8.0.1 или открыв сайт для проверки IP-адреса. Если все настроено правильно, вы увидите IP-адрес сервера.

Для управления VPN через Network Manager установите плагин:

sudo apt install network-manager-openvpn network-manager-openvpn-gnome

После этого вы сможете импортировать конфигурацию через графический интерфейс.

Обеспечение безопасности и дополнительные настройки

Безопасность VPN-сервера критически важна. Вот несколько рекомендаций по усилению защиты:

  • Используйте сильные алгоритмы шифрования. В конфигурации сервера и клиента укажите cipher AES-256-GCM и auth SHA256. Это обеспечит современный уровень защиты.
  • Ограничьте доступ по IP-адресам. С помощью межсетевого экрана можно разрешить подключения только с определенных IP-адресов, если клиенты имеют статические адреса.
  • Включите отзыв сертификатов. Если клиентский сертификат скомпрометирован, его можно отозвать. Для этого на сервере CA выполните:
./easyrsa revoke client1

Затем сгенерируйте список отозванных сертификатов (CRL) и скопируйте его на сервер OpenVPN. В конфигурации сервера добавьте директиву crl-verify /etc/openvpn/server/crl.pem.

  • Используйте tls-auth. Статический ключ ta.key защищает от DoS-атак и сканирования портов. Убедитесь, что ключ хранится в секрете.
  • Регулярно обновляйте систему. Устанавливайте обновления безопасности для OpenVPN и операционной системы.
  • Мониторинг логов. Включите подробное логирование и регулярно просматривайте /var/log/openvpn.log для обнаружения подозрительной активности.

Если вы находитесь в стране с жесткой цензурой, можно дополнительно обернуть трафик OpenVPN в TLS с помощью Stunnel. Это скроет факт использования VPN и позволит обойти блокировки. Настройка Stunnel включает установку пакета, создание конфигурации с сертификатом Let's Encrypt и перенаправление трафика на порт 1194.

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

При настройке OpenVPN могут возникать различные проблемы. Рассмотрим наиболее распространенные и способы их решения.

Ошибка: tls error: incoming packet authentication failed Эта ошибка возникает, когда клиент и сервер используют разные параметры tls-auth. Убедитесь, что на клиенте указана директива key-direction 1, а на сервере key-direction 0. Также проверьте, что файл ta.key идентичен на обеих сторонах.

Ошибка: Connection refused или таймаут подключения Проверьте, что порт 1194 открыт на сервере и доступен извне. Используйте telnet your-server-ip 1194 или nc -vz your-server-ip 1194. Если сервер за NAT, убедитесь, что проброс портов настроен правильно.

Клиент подключается, но нет доступа в интернет Проверьте настройки маршрутизации и NAT. Убедитесь, что ip_forward включен, и правила iptables корректны. Также проверьте, что клиент получает DNS-серверы через push.

Проблемы с разрешением DNS Если клиент не может разрешить доменные имена, добавьте в конфигурацию сервера директивы push "dhcp-option DNS 8.8.8.8" и push "dhcp-option DNS 1.1.1.1". На клиенте убедитесь, что файл /etc/resolv.conf обновляется автоматически.

Сертификат не подписан доверенным центром Если клиент не доверяет сертификату сервера, проверьте, что ca.crt на клиенте совпадает с сертификатом CA, использованным для подписи серверного сертификата. Также убедитесь, что remote-cert-tls server присутствует в конфигурации клиента.

Для диагностики используйте команду sudo journalctl -u openvpn@client -f на клиенте и sudo tail -f /var/log/openvpn.log на сервере. Эти логи помогут выявить причину проблемы.

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

Чем OpenVPN Community отличается от OpenVPN Access Server?

OpenVPN Community — это бесплатная версия с открытым исходным кодом, которая настраивается через конфигурационные файлы и требует ручного управления сертификатами. OpenVPN Access Server — коммерческий продукт с веб-интерфейсом, автоматической настройкой и дополнительными функциями, такими как интеграция с Active Directory и двухфакторная аутентификация. Бесплатная лицензия Access Server ограничена двумя одновременными подключениями.

Какой порт использует OpenVPN по умолчанию?

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

Можно ли использовать OpenVPN на мобильных устройствах?

Да, OpenVPN имеет клиенты для Android и iOS. Для подключения необходимо импортировать файл конфигурации .ovpn, который включает сертификаты и ключи. На мобильных устройствах рекомендуется использовать единый файл с встроенными сертификатами, чтобы упростить настройку.

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

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

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

Проверьте, включена ли пересылка IP-пакетов на сервере (sysctl net.ipv4.ip_forward должен возвращать 1). Убедитесь, что правила iptables для NAT настроены правильно: iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE. Также проверьте, что клиент получает DNS-серверы через директивы push.

Как ускорить работу OpenVPN?

Для повышения производительности используйте алгоритм шифрования AES-256-GCM, который аппаратно ускоряется на современных процессорах. Также можно включить алгоритм TCP BBR на сервере, добавив в /etc/sysctl.d/60-custom.conf строки net.core.default_qdisc=fq и net.ipv4.tcp_congestion_control=bbr. Это улучшит пропускную способность при передаче данных.

Нужно ли настраивать проброс портов, если сервер за NAT?

Да, если сервер OpenVPN находится за роутером с NAT, необходимо пробросить порт 1194 (или другой используемый порт) на внутренний IP-адрес сервера. Это позволит внешним клиентам устанавливать соединение. Также на роутере можно настроить маршрут для доступа к локальной сети за сервером.