Открытая реализация защищённого туннеля
OpenVPN — программа с открытым исходным кодом для построения защищённых туннелей между устройствами. Она не связана с IPsec и использует собственный протокол, опираясь на библиотеку OpenSSL и на TLS для обмена ключами. Начав развитие в начале 2000-х, проект стал одним из самых распространённых инструментов для удалённого доступа и соединений между офисами благодаря гибкости и работе на большинстве систем.
Программа работает в пользовательском пространстве, а не в ядре, поэтому проще переносится между платформами, но обычно уступает по скорости решениям, встроенным в ядро. Плюс — тонкая настройка практически любого параметра.
Два канала: управление и данные
Внутри соединения различают канал управления и канал данных. Управляющий использует TLS: сервер и клиент обмениваются сертификатами, проверяют друг друга и вырабатывают ключи. Второй канал переносит сами пакеты пользователя, шифруя их симметричным шифром, как правило AES, с периодической сменой ключей. Разделение позволяет сочетать надёжность обмена ключами с быстротой шифрования данных.
Для защиты от сканирования и лёгких атак доступна дополнительная опция с общим ключом, добавляющая подпись к управляющим пакетам. Такой пакет с неверной подписью сервер отбрасывает молча, а значит, порт выглядит для стороннего наблюдателя менее отзывчивым.
Поскольку программа работает в пользовательском пространстве, каждый пакет проходит через границу между ядром и процессом, что даёт дополнительные накладные расходы. Для снижения их влияния доступны настройки размера буферов и режимы, при которых шифрование данных берёт на себя ядро, если это поддерживает система. Для домашних скоростей и большинства офисных сценариев этого достаточно.
tun и tap, UDP и TCP
Режим tun создаёт виртуальный сетевой интерфейс уровня IP, и по нему идёт маршрутизируемый трафик. Он используется в подавляющем большинстве случаев. Режим tap эмулирует Ethernet и передаёт кадры канального уровня, что нужно для редких задач вроде объединения сегментов сети или работы протоколов, зависящих от широковещания.
Транспортом служит либо UDP, либо TCP. UDP предпочтительнее и обычно быстрее: туннель поверх TCP страдает эффектом двойной повторной отправки, когда потеряться может и внутренний, и внешний сегмент. TCP выбирают, когда UDP в сети недоступен. Порт по умолчанию 1194, но он свободно меняется. Подробнее о самом понятии написано на странице про VPN-туннель.
Конфигурация и аутентификация
Параметры собраны в конфигурационном файле, обычно с расширением ovpn. В нём указаны адрес сервера, протокол и порт, шифры, способ проверки сертификатов, маршруты и сервера DNS, которые следует использовать. Клиенты часто получают такой файл в готовом виде, а иногда вместе с встроенными сертификатами.
Аутентификацию строят на сертификатах каждого клиента, на логине и пароле либо на их сочетании, иногда добавляя второй фактор. Сертификат клиента можно отозвать, если устройство утеряно, и при помощи списка отзыва сервер откажет в доступе конкретному устройству, не затрагивая остальных.
На практике администратор часто выпускает отдельный сертификат на каждого пользователя и устройство, а не один общий. Это позволяет отзывать доступ выборочно: при увольнении сотрудника или потере ноутбука закрывается только его сертификат. Так же удобно вести учёт: в журнале сервера видно, кто и когда подключался, и подозрительная активность привязана к конкретному устройству.
Заблуждения и что проверить у себя
Одно допущение: порт 1194 фиксирован и по нему протокол однозначно узнаётся. На деле порт любой, а вот узнавание по рукопожатию возможно при анализе трафика. Другое: OpenVPN всегда медленнее конкурентов. Скорость сильно зависит от шифра, процессора и режима, и на современном оборудовании с аппаратным ускорением AES её хватает для обычных скоростей. Третье: конфигурационный файл безопасно пересылать кому угодно. Если в нём встроен закрытый ключ, файл равнозначен паролю.
После подключения проверьте маршруты и адреса: в Windows команда ipconfig покажет новый виртуальный адаптер, а route print — таблицу маршрутов. Если трафик не идёт, часто виноваты неверные маршруты, закрытый порт на файрволе или несовпадающие шифры. Журнал клиента указывает, на каком этапе обрыв.