OpenVPN: что это, настройка и использование

В 2001 году Джеймс Йонан (James Yonan), программист из Калифорнии, опубликовал первую версию OpenVPN — VPN-клиента с открытым исходным кодом. Сегодня OpenVPN остаётся одним из основных VPN-протоколов. Через 25 лет OpenVPN остаётся самым распространённым VPN-протоколом в мире: его используют более 50 миллионов устройств, он встроен в корпоративные решения Cisco, Palo Alto, Fortinet, поддерживается каждой крупной операционной системой и прошёл десятки независимых аудитов безопасности. Причиной долголетия OpenVPN не скорость (WireGuard быстрее) и не элегантность кода (100 000+ строк), а гибкость, проверенность и кроссплатформенность, которые не может предложить ни один другой протокол.

История и развитие

2001–2005: Зарождение

Джеймс Йонан начал разработку OpenVPN как альтернативу IPsec, который он считал чрезмерно сложным и уязвимым. Первая версия использовала OpenSSL для шифрования и TUN/TAP интерфейсы для создания виртуального сетевого адаптера. Ключевое решение — использование TLS (Transport Layer Security) вместо собственного протокола обмена ключами.

2005–2010: Рост популярности

OpenVPN 2.0 (2005) добавил поддержку множественных клиентов на одном сервере, аутентификацию по сертификатам и гибкую систему плагинов. К 2010 году OpenVPN стал стандартом де-факто для VPN.

2010–2018: Консолидация

OpenVPN 2.4 (2017) добавил поддержку TLS 1.2, AEAD шифров (AES-256-GCM), NCP (Negotiable Crypto Parameters) и улучшенную производительность. OpenVPN стал основой для коммерческих VPN-сервисов.

2018–2026: Современность

OpenVPN 2.5 (2020) и 2.6 (2023) добавили поддержку TLS 1.3, улучшенную обфускацию, оптимизации производительности и поддержку современных криптографических алгоритмов. Несмотря на появление WireGuard, OpenVPN остаётся основным протоколом для корпоративных VPN и сложных сетевых конфигураций.

Архитектура OpenVPN

Компоненты

OpenVPN Daemon (openvpn) — основной процесс, который управляет VPN-соединением. Может работать как сервер (openvpn --mode server) или как клиент (openvpn --config client.ovpn).

OpenSSL/libcrypto — криптографическая библиотека, обеспечивающая шифрование, хэширование и обмен ключами. OpenVPN использует OpenSSL для всех криптографических операций.

TUN/TAP драйвер — виртуальный сетевой интерфейс. TUN работает на уровне 3 (IP-пакеты), TAP на уровне 2 (Ethernet-кадры).

Конфигурационные файлы — текстовые файлы .ovpn (клиент) и .conf (сервер), содержащие все параметры VPN-соединения.

Транспортные протоколы

UDP (User Datagram Protocol): - Быстрее — нет overhead ретрансляции - Нет гарантии доставки — потерянные пакеты не переотправляются - Рекомендуется для большинства сценариев - Стандартный порт: 1194

TCP (Transmission Control Protocol): - Надёжнее — гарантия доставки, ретрансляция потерянных пакетов - Медленнее — TCP-over-TCP проблема (двойная ретрансляция) - Рекомендуется для обхода файрволов - Стандартный порт: 443 (HTTPS)

Уровни OSI

OpenVPN работает на разных уровнях в зависимости от конфигурации:

  • TUN-режим (dev tun): уровень 3 — инкапсуляция IP-пакетов. Стандартный режим.
  • TAP-режим (dev tap): уровень 2 — инкапсуляция Ethernet-кадров. Используется для bridging и не-IP протоколов.

Шифрование в OpenVPN

TLS-хэндшейк

OpenVPN использует TLS 1.2/1.3 для установления защищённого канала:

  1. Client Hello: клиент отправляет список поддерживаемых cipher suites — подробнее о принципах работы VPN, версию TLS, расширения
  2. Server Hello: сервер выбирает cipher suite, отправляет сертификат и параметры обмена ключами
  3. Certificate Verify: клиент проверяет сертификат сервера
  4. Key Exchange: обмен ключами через ECDHE (Ephemeral Elliptic Curve Diffie-Hellman)
  5. Finished: обе стороны подтверждают завершение handshake

Cipher suites

Рекомендуемые (AEAD): - AES-256-GCM — стандарт, аппаратное ускорение на x86 - AES-128-GCM — быстрее, достаточная стойкость - CHACHA20-POLY1305 — быстрее на ARM (мобильные устройства)

Допустимые (legacy): - AES-256-CBC + SHA256 — для совместимости с устаревшими клиентами

Не рекомендуемые: - BF-CBC (Blowfish) — устаревший - DES-CBC — 56-битный ключ, небезопасен - RC2-CBC — устаревший

Аутентификация

Сертификаты X.509: - CA (Certificate Authority) — корневой сертификат - Серверный сертификат — подтверждает личность сервера - Клиентский сертификат — подтверждает личность клиента - Приватные ключи — для подписи и расшифровки

Pre-Shared Key (PSK): - Статический ключ (ta.key) — дополнительный слой аутентификации (tls-auth/tls-crypt) - Не заменяет сертификаты, а дополняет

Логин/Пароль: - Для пользовательской аутентификации - Используется совместно с сертификатами

Perfect Forward Secrecy

OpenVPN обеспечивает PFS через ECDHE — это один из ключевых аспектов безопасности протокола — для каждой сессии генерируется уникальная пара ключей. Компрометация приватного ключа сервера не позволяет расшифровать прошлые сессии.

Настройка OpenVPN-сервера

Установка на Linux (Ubuntu/Debian)

# Установка OpenVPN и EasyRSA
sudo apt update
sudo apt install openvpn easy-rsa

# Инициализация PKI
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret ta.key

Базовая конфигурация сервера

# /etc/openvpn/server.conf
port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh.pem

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"

tls-auth ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

keepalive 10 120
persist-key
persist-tun

user nobody
group nogroup
verb 3

Запуск сервера

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

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

Конфигурационный файл клиента (.ovpn)

client
dev tun
proto udp
remote vpn.example.com 1194

resolv-retry infinite
nobind
persist-key
persist-tun

remote-cert-tls server
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
tls-auth ta.key 1

verb 3

<ca>
[содержимое ca.crt]
</ca>
<cert>
[содержимое client.crt]
</cert>
<key>
[содержимое client.key]
</key>
<tls-auth>
[содержимое ta.key]
</tls-auth>

Клиенты для разных платформ

Windows: OpenVPN GUI, OpenVPN Connect macOS: Tunnelblick, OpenVPN Connect Linux: openvpn (CLI), NetworkManager с плагином openvpn Android: OpenVPN Connect iOS: OpenVPN Connect

Продвинутые настройки

Обфускация

Для обхода DPI используйте XOR обфускацию:

# Сервер
scramble obfuscate password

# Клиент
scramble obfuscate password

Или TLS-crypt (шифрование TLS-control channel):

tls-crypt ta.key

Multi-factor аутентификация

OpenVPN поддерживает MFA через плагины:

plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn

Split tunneling

Направляйте через VPN только определённый трафик:

# Не перенаправлять весь трафик
# Вместо push "redirect-gateway def1":
route-nopull
route 192.168.1.0 255.255.255.0 vpn_gateway

Несколько серверов

OpenVPN поддерживает работу с несколькими серверами на одном хосте с разными портами и конфигурациями.

Производительность OpenVPN

Факторы, влияющие на скорость

  1. Протокол транспорта: UDP быстрее TCP на 20–40%
  2. Шифрование: AES-256-GCM быстрее AES-256-CBC (параллелизация)
  3. Аппаратное ускорение: AES-NI на Intel/AMD ускоряет AES в 3–5 раз
  4. Размер буфера: sndbuf и rcvbuf влияют на пропускную способность
  5. Компрессия: compress lz4-v2 — ускоряет передачу сжимаемых данных

Типичные результаты

КонфигурацияСкорость (100 Мбит/с канал)
UDP, AES-256-GCM, AES-NI70–85 Мбит/с
UDP, AES-256-CBC55–70 Мбит/с
TCP, AES-256-GCM45–60 Мбит/с
TCP, AES-256-CBC35–50 Мбит/с

Оптимизация скорости

# Увеличение буферов
sndbuf 393216
rcvbuf 393216

# Использование lz4-v2 компрессии
compress lz4-v2

# NCP (Negotiable Crypto Parameters)
ncp-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305

# Оптимизация TCP (если используется)
tcp-nodelay
mssfix 1450

Безопасность OpenVPN

Известные уязвимости

CVE-2017-7478 — уязвимость в управлении памятью. Исправлена в OpenVPN 2.4.2. CVE-2020-11810 — уязвимость, позволяющая клиенту обходить ограничения. Исправлена в OpenVPN 2.4.9. FREAK атака — принудительное использование экспортных шифров. Предотвращается настройкой tls-version-min 1.2.

Рекомендации по безопасности

  1. Всегда используйте TLS 1.2+ (tls-version-min 1.2)
  2. Используйте AEAD шифры (AES-256-GCM или CHACHA20-POLY1305)
  3. Включите tls-auth или tls-crypt
  4. Используйте сертификаты вместо PSK
  5. Регулярно обновляйте OpenVPN
  6. Используйте revoke для отозванных сертификатов

OpenVPN vs. WireGuard

КритерийOpenVPNWireGuard
Скорость★★★★☆★★★★★
Код (строк)~100 000~4 000
АудитыМножествоCure53
Гибкость★★★★★★★★☆☆
Корпоративное использование★★★★★★★★☆☆
Обфускация★★★☆☆★★★☆☆
Мобильные устройства★★★☆☆★★★★★

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

OpenVPN в России

Обход DPI

Стандартный OpenVPN на порту 1194 блокируется DPI. Решения:

  1. TCP на порту 443 — выглядит как HTTPS
  2. XOR обфускация — маскировка сигнатур
  3. tls-crypt — шифрование control channel
  4. Stunnel — инкапсуляция OpenVPN в TLS

Наш VPN использует OpenVPN с оптимизированными настройками для российских сетей: обфускация, tls-crypt, TCP 443 — стабильное соединение в условиях DPI. Подробнее — в статье как настроить OpenVPN.

Полезные статьи по теме