В 2001 году Джеймс Йонан (James Yonan), программист из Калифорнии, опубликовал первую версию OpenVPN — VPN-клиента с открытым исходным кодом. Сегодня OpenVPN остаётся одним из основных VPN-протоколов. Через 25 лет OpenVPN остаётся самым распространённым VPN-протоколом в мире: его используют более 50 миллионов устройств, он встроен в корпоративные решения Cisco, Palo Alto, Fortinet, поддерживается каждой крупной операционной системой и прошёл десятки независимых аудитов безопасности. Причиной долголетия OpenVPN не скорость (WireGuard быстрее) и не элегантность кода (100 000+ строк), а гибкость, проверенность и кроссплатформенность, которые не может предложить ни один другой протокол.
OpenVPN: что это, настройка и использование
История и развитие
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 для установления защищённого канала:
- Client Hello: клиент отправляет список поддерживаемых cipher suites — подробнее о принципах работы VPN, версию TLS, расширения
- Server Hello: сервер выбирает cipher suite, отправляет сертификат и параметры обмена ключами
- Certificate Verify: клиент проверяет сертификат сервера
- Key Exchange: обмен ключами через ECDHE (Ephemeral Elliptic Curve Diffie-Hellman)
- 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.keyMulti-factor аутентификация
OpenVPN поддерживает MFA через плагины:
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpnSplit tunneling
Направляйте через VPN только определённый трафик:
# Не перенаправлять весь трафик
# Вместо push "redirect-gateway def1":
route-nopull
route 192.168.1.0 255.255.255.0 vpn_gatewayНесколько серверов
OpenVPN поддерживает работу с несколькими серверами на одном хосте с разными портами и конфигурациями.
Производительность OpenVPN
Факторы, влияющие на скорость
- Протокол транспорта: UDP быстрее TCP на 20–40%
- Шифрование: AES-256-GCM быстрее AES-256-CBC (параллелизация)
- Аппаратное ускорение: AES-NI на Intel/AMD ускоряет AES в 3–5 раз
- Размер буфера: sndbuf и rcvbuf влияют на пропускную способность
- Компрессия: compress lz4-v2 — ускоряет передачу сжимаемых данных
Типичные результаты
| Конфигурация | Скорость (100 Мбит/с канал) |
|---|---|
| UDP, AES-256-GCM, AES-NI | 70–85 Мбит/с |
| UDP, AES-256-CBC | 55–70 Мбит/с |
| TCP, AES-256-GCM | 45–60 Мбит/с |
| TCP, AES-256-CBC | 35–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.
Рекомендации по безопасности
- Всегда используйте TLS 1.2+ (
tls-version-min 1.2) - Используйте AEAD шифры (AES-256-GCM или CHACHA20-POLY1305)
- Включите tls-auth или tls-crypt
- Используйте сертификаты вместо PSK
- Регулярно обновляйте OpenVPN
- Используйте revoke для отозванных сертификатов
OpenVPN vs. WireGuard
| Критерий | OpenVPN | WireGuard |
|---|---|---|
| Скорость | ★★★★☆ | ★★★★★ |
| Код (строк) | ~100 000 | ~4 000 |
| Аудиты | Множество | Cure53 |
| Гибкость | ★★★★★ | ★★★☆☆ |
| Корпоративное использование | ★★★★★ | ★★★☆☆ |
| Обфускация | ★★★☆☆ | ★★★☆☆ |
| Мобильные устройства | ★★★☆☆ | ★★★★★ |
OpenVPN по-прежнему лучше для корпоративных VPN и сложных конфигураций. WireGuard лучше для личного использования и мобильных устройств.
OpenVPN в России
Обход DPI
Стандартный OpenVPN на порту 1194 блокируется DPI. Решения:
- TCP на порту 443 — выглядит как HTTPS
- XOR обфускация — маскировка сигнатур
- tls-crypt — шифрование control channel
- Stunnel — инкапсуляция OpenVPN в TLS
Наш VPN использует OpenVPN с оптимизированными настройками для российских сетей: обфускация, tls-crypt, TCP 443 — стабильное соединение в условиях DPI. Подробнее — в статье как настроить OpenVPN.