Что такое 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-адрес сервера. Это позволит внешним клиентам устанавливать соединение. Также на роутере можно настроить маршрут для доступа к локальной сети за сервером.