Skip to the content.

Глава 1. Введение в OpenVPN

Интернет в современном обществе так же широко распространен как и любое коммунальное сооружение. Когда кто-то покупает дом или переезжает в новую квартиру, или бизнес переезжает в новое место, интернет является первой услугой в списке, за которой следует электричество, тепло, мусор и, возможно (но маловероятно) наземная линия или телефонная служба. Вы можете даже возразить, что современный квалификатор даже не нужен. С помощью таких программ, как One Laptop per Child, в сочетании с усилиями таких компаний как Facebook и Google, так называемые страны третьего мира, где нет водопроводов, канализации или даже телефонной связи, имеют Интернет.

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

Правительственные учреждения уже давно стали мишенями для разведки. На протяжении тысячелетий методы и процедуры медленно совершенствовались и настраивались для защиты конфиденциальной информации от врагов и других любопытных глаз. Первоначально запечатанные воском письма, которые носили доверенные лица, означали, что вы и получатель можете быть уверены в том, что сообщение прибыло безопасно и беспрепятственно. С течением времени и развитием технологий стало легче перехватывать эти сообщения, читать или изменять их и отправлять далее по пути.

Вторая мировая война дала развитие многим величайшим достижениям в криптографии и защищенной связи. От таких устройств, как немецкая машина “Энигма” до Кодовых говорунов Навахо, надежная связь между войсками и командованием была бесконечной гонкой вооружений. Сегодня правительства и военные - не единственные группы, которые стремятся к уединению. Корпорации хотят поддерживать целостность данных и защиту стандартов индустрии платежных карт (PCI) для защиты потребителей. Члены семьи хотят обсуждать семейные дела по частным каналам, где сообщество в целом не может подслушивать. Другие хотят прорваться через национальные брандмауэры, предназначенные для наблюдения за населением и ограничения контента, считающегося спорным или противоречащим политике партии.

Каждый день большинство людей используют VPN или имеют возможность использовать VPN независимо от того, осознают они это или нет. Существует множество различных технологий VPN как от коммерческих поставщиков, так и в виде проектов с открытым исходным кодом. Одним из самых популярных программных проектов для VPN с открытым исходным кодом является OpenVPN. Цель этой книги - сделать вас мастером OpenVPN; вы узнаете не только технологию, лежащую в ее основе, но и рассуждения, логику и логистику всего, что связано с этим. В то время как эта книга будет упоминать и касаться коммерческого предложения от OpenVPN Technologies Inc., Access Server, основной акцент будет сделан на open source/community версию OpenVPN.

Что такое VPN?

Проще говоря, VPN позволяет администратору создавать “локальную” сеть между несколькими компьютерами в разных сегментах сети. В некоторых случаях эти машины могут находиться в одной и той же локальной сети, они могут быть удалены друг от друга через общедоступный Интернет или даже могут быть подключены через множество соединительных сред, таких как беспроводные восходящие каналы, спутниковая связь, коммутируемая сеть, и так далее. P в VPN происходит от дополнительной защиты (private), чтобы сделать эту виртуальную сеть приватной. Сетевой трафик, проходящий через VPN, часто называют внутри туннеля (VPN) по сравнению со всем другим трафиком за пределами туннеля.

На следующем рисунке показан сетевой трафик, который традиционно проходит через несколько сегментов сети и общий Интернет. Здесь этот трафик относительно открыт для проверки и анализа. Хотя защищенные протоколы, такие как HTTPS и SSH, менее уязвимы, их все же можно идентифицировать; если злоумышленник отслеживает сетевой трафик, он все еще может видеть, какой тип соединения установлен, с какого компьютера к какому серверу.

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

Трафик внутри VPN может быть любым, какой бы вы не отправили через локальную или глобальную сеть: веб-трафик, электронная почта, текст, графика и т.д. Примеры некоторых приложений включают следующее:

Вот пример трафика внутри VPN. В то время как сама VPN маршрутизируется через Интернет, как на предыдущем рисунке, устройства по сетевому пути видят только трафик VPN; эти устройства совершенно не знают о том, что передается внутри частного туннеля. Защищенные протоколы, такие как HTTPS и SSH, по-прежнему будут защищены внутри туннеля от других пользователей VPN, но будут дополнительно неопознаваемы извне туннеля. VPN не только шифрует трафик внутри, но и скрывает и защищает отдельные потоки данных от потоков вне туннеля.

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

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

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

Вторым компонентом аутентификации является дополнительная защита потока связи. В этом случае устанавливается метод подписи каждого отправленного пакета. Каждая система проверяет, что полученные VPN-пакеты правильно подписаны, прежде чем расшифровывать полезную нагрузку. За счет аутентификации пакетов, которые уже зашифрованы, система может сэкономить время обработки, даже не расшифровывая пакеты, которые не соответствуют правилам аутентификации. В конце концов, это серьезно мешает потенциальной атаке Отказ в обслуживании (Denial of Service - DoS), а также срыве Атаки посредника (Man in the middle - MITM), предполагая что ключи подписи хранятся в безопасности!

Типы VPN

Есть множество продуктов VPN, доступных на рынке, как коммерческих, так и с открытым исходным кодом. Почти всех их можно разделить на следующие четыре категории:

Некоторые люди утверждают что OpenVPN - это также VPN на основе SSL, поскольку он использует протокол SSL или TLS для установления безопасного соединения. Тем не менее, мы сделали отдельную категорию для OpenVPN, так как она отличается от любого другого SSL-решения VPN.

Теперь мы рассмотрим более подробно каждый из четырех типов VPN:

PPTP

Одним из самых старых протоколов VPN является Туннельный протокол типа точка-точка (Point-to-Point Tunneling Protoco - PPTP), разработанный Microsoft и Ascend в 1999 году. Он официально зарегистрирован как RFC2637 (полный стандарт см. https://www.ietf.org/rfc/rfc2637.txt). Клиент PPTP был включен в Windows с 1995 года и до сих пор входит в большинство операционных систем.

В настоящее время протокол PPTP считается принципиально небезопасным, так как степень безопасности соединения напрямую связана с силой выбранного механизма аутентификации (например, пароля). Таким образом, небезопасный пароль приводит к небезопасному VPN-соединению. Большинство настроек PPTP используют протокол MS-CHAPv2 для шифрования паролей и именно этот протокол существенно небезопасен. Безопасность протокола PPTP, включая расширения Microsoft MS-CHAPv2, обсуждалась в статье, доступной по адресу https://www.schneier.com/paper-pptpv2.html.

Также можно использовать сертификаты X.509 для защиты соединения PPTP, что приводит к довольно безопасному соединению. Однако не все клиенты PPTP поддерживают EAP-TLS, что необходимо для использования сертификатов X.509.

PPTP использует два канала: канал управления для настройки соединения и другой канал для передачи данных. Канал управления инициируется через TCP-порт 1723. Канал данных использует протокол General Routing Encapsulation (GRE), который является IP-протоколом 47. Для сравнения, «обычный» трафик TCP/IP передается с использованием IP-протокола 6 (TCP) и 17 (UDP).

Клиенты PPTP доступны практически во всех операционных системах от Windows до Linux и производных Unix, для устройств iOS и Android.

IPSec

Стандарт IPSec является официальным стандартом IEEE/IETF для защиты IP. Он официально зарегистрирован как RFC2411 (полный стандарт см. https://www.ietf.org/rfc/rfc2411.txt). IPSec также встроен в стандарт IPv6.

IPSec работает на уровне 2 и 3 сетевого стека модели OSI. Он вводит концепцию политик безопасности, что делает его чрезвычайно гибким и мощным, а также чрезвычайно сложным в настройке и устранении неполадок. Политики безопасности позволяют администратору шифровать трафик между двумя конечными точками на основе многих параметров, таких как IP-адрес источника и назначения, а также TCP и UDP-порты источника и назначения.

IPSec может быть настроен на использование предустановленных общих ключей или сертификатов X.509 для защиты VPN-подключения. Кроме того, для аутентификации VPN-подключения используются сертификаты X.509, одноразовые пароли или протоколы имени_пользователя/пароля.

В IPSec есть два режима работы: туннельный и транспортный режим. Транспортный режим чаще всего используется в сочетании с протоколом туннелирования 2 уровня (Layer 2 Tunneling Protocol - L2TP). Этот протокол L2TP выполняет аутентификацию пользователя, как описано в предыдущем разделе. Клиенты IPSec, встроенные в большинство операционных систем, обычно выполняют IPSec + L2TP, хотя также возможно установить соединение только для IPSec. VPN-клиент IPSec, встроенный в Microsoft Windows, по умолчанию использует IPSec + L2TP, но его можно отключить или обойти. Тем не менее он включает в себя команды шифрования и изменения политики безопасности.

Как и PPTP, IPSec также использует два канала: канал управления для настройки соединения и канал для передачи данных. Канал управления инициируется через UDP-порт 500 или 4500. Канал данных использует протокол Encapsulated Security Payload (ESP), который является IP-протоколом 50. Для сравнения, «обычный» трафик TCP/IP передается с использованием IP-протокола 6 (TCP) и 17 (UDP). Целостность пакетов IPSec обеспечивается с помощью кода аутентификации сообщений на основе хэша (Hash-based Message Authentication Code - HMAC), который является тем же методом, который используется в OpenVPN.

Одним из основных недостатков IPSec является то, что многие производители оборудования внедрили собственные расширения в стандарт, что затрудняет (если не делает невозможным) подключение двух конечных точек IPSec от разных производителей.

Программное обеспечение IPSec включено практически во все операционные системы, а также в микропрограммы межсетевого экрана, маршрутизатора и коммутатора.

VPN на основе SSL

В настоящее время наиболее часто используемый VPN - это VPN на основе SSL, основанный на протоколе SSL/TLS. VPN на основе SSL часто называют VPN без клиентского доступа или VPN на основе Интернета, хотя есть некоторые поставщики, которые предоставляют отдельное клиентское программное обеспечение, например Cisco AnyConnect и Microsoft SSTP. Большинство VPN на основе SSL используют тот же сетевой протокол, который используется для безопасности веб-сайтов (HTTPS), тогда как OpenVPN использует собственный формат для шифрования и подписи трафика данных. Это основная причина почему OpenVPN указан как отдельная категория VPN.

Не существует четко определенного стандарта для VPN на основе SSL, но большинство используют протокол SSL/TLS для настройки и защиты соединения. В большинстве случаев соединение защищено с помощью сертификатов X.509 с одноразовым паролем или протоколами имени_пользователя/пароля для аутентификации соединения. VPN на основе SSL очень похожи на соединения, используемые для защиты веб-сайтов (HTTPS) и часто используется один и тот же протокол и канал (TCP и порт 443).

Несмотря на то, что VPN на основе SSL часто называют веб-интерфейсом или бесклиенским, существует довольно много производителей, которые используют плагин для браузера или элемент управления ActiveX для «улучшения» VPN-соединения. Это делает VPN несовместимым с неподдерживаемыми браузерами или операционными системами.

OpenVPN

OpenVPN часто называют VPN на основе SSL, так как он использует протокол SSL/TLS для защиты соединения. Однако OpenVPN также использует HMAC в сочетании с алгоритмом дайджеста (или хеширования) для обеспечения целостности доставляемых пакетов. Он может быть настроен на использование предустановленных ключей, а также сертификатов X.509. Эти функции обычно не предлагаются другими VPN на основе SSL.

Кроме того, OpenVPN использует виртуальный сетевой адаптер (устройство tun или tap) в качестве интерфейса между программным обеспечением OpenVPN пользовательского уровня и операционной системой. В общем, любая операционная система, поддерживающая устройство tun/tap, может запускать OpenVPN. В настоящее время это ОС на основе Linux, Free/Open/NetBSD, Solaris, AIX, Windows и Mac OS, а также устройства iOS/Android. Для всех этих платформ необходимо установить клиентское программное обеспечение, которое отличает OpenVPN от клиентских или веб-сетей VPN.

Протокол OpenVPN не определен в стандарте RFC, но протокол общедоступен, поскольку OpenVPN является частью программного обеспечения с открытым исходным кодом. Тот факт что это открытый исходный код, на самом деле делает OpenVPN более безопасным, чем VPN с закрытым исходным кодом, так как код постоянно проверяется разными людьми. Кроме того, очень мало шансов что секретные бэкдоры будут встроены в OpenVPN.

OpenVPN имеет понятие канала управления и канала данных, которые зашифрованы и защищены по-разному. Однако весь трафик проходит через одно соединение UDP или TCP. Канал управления зашифрован и защищен с использованием SSL/TLS, канал данных зашифрован с использованием специального протокола шифрования.

Протокол и порт по умолчанию для OpenVPN - это UDP и порт 1194. Прежде чем IANA предоставила OpenVPN официальное назначение порта, старые клиенты (2.0-beta16 и старше) по умолчанию использовали порт 5000.

Сравнение VPN

Каждая из различных технологий VPN имеет свои особенности, преимущества и недостатки. Несмотря на то, что эта книга посвящена OpenVPN, существуют случаи, когда, например, VPN на основе IPSec подходит больше, в зависимости от требований пользователей.

Преимущества и недостатки PPTP

Основным преимуществом VPN на основе PPTP является встроенность программного обеспечения VPN-клиента в большинство операционных систем. Кроме того, время запуска для настройки и инициализации PPTP VPN-соединения довольно мало.

Недостатками VPN на основе PPTP являются отсутствие безопасности и параметров конфигурации как на стороне клиента, так и на стороне сервера. Кроме того, расширение EAP-TLS, которое позволяет использовать сертификаты X.509, полностью поддерживается только в Microsoft Windows, хотя существует патч для пакета pppd с открытым исходным кодом для включения поддержки EAP-TLS. Пакет pppd входит почти в каждый дистрибутив Linux. Кроме того, если нужно использовать EAP-TLS, то простота настройки PPTP VPN значительно уменьшается. Это связано с тем, что EAP-TLS требует настройки инфраструктуры открытого ключа, как IPSec и OpenVPN.

Другим существенным недостатком PPTP является использование протокола GRE, который плохо интегрируется с устройствами NAT.

Преимущества и недостатки IPSec

Преимуществами протокола IPSec являются его высокая безопасность, хорошая поддержка от различных производителей и платформ, включая маршрутизаторы xDSL и Wi-Fi, а также возможность использовать детализированные политики безопасности для управления потоком трафика.

Недостатки IPSec заключаются в том, что его общеизвестно сложно настраивать и устранять неисправности, разные реализации IPSec от разных поставщиков оборудования плохо работают вместе, а IPSec плохо интегрируется с сетями с NAT. В частности, не рекомендуется, а иногда даже невозможно, запустить сервер IPSec, который находится в сети с NAT.

Преимущества и недостатки VPN на основе SSL

Преимущество VPN на основе SSL или веб-интерфейса заключается в том, что клиентское программное обеспечение не задействовано или почти не используется. Это делает установку и инициализацию на стороне клиента очень простой.

Недостаток веб-сети VPN заключается в том, что она часто не является полноценной VPN и обеспечивает доступ к одному серверу или набору серверов. Также сложнее обмениваться локальными данными с удаленными точками или сервером.

Преимущества и недостатки OpenVPN

Преимуществами OpenVPN являются простота развертывания, его конфигурируемость и возможность развертывания OpenVPN в сетях с ограниченным доступом, включая сети с поддержкой NAT. Кроме того, OpenVPN включает функции безопасности, которые столь же сильны, как и решения на основе IPSec, в том числе безопасность аппаратного токена и поддержка различных механизмов аутентификации пользователей.

Недостатками OpenVPN являются отсутствие масштабируемости и зависимость от установки клиентского программного обеспечения. Еще одним недостатком является отсутствие графического интерфейса для настройки и управления. В частности, драйвер интерфейса tap для Microsoft Windows часто вызывал проблемы развертывания при выпуске новой версии Windows.

История OpenVPN

OpenVPN был первоначально написан Джеймсом Йонаном с первоначальным выпуском, версией 0.90 в 2001 году под лицензией GPL. Первоначальный выпуск позволял пользователям создавать простые VPN типа «точка-точка» по UDP с использованием шифра Blowfish и, опционально, подписи HAAC SHA1. С версией 1.0, проверка подлинности на основе TLS и обмен ключами были добавлены вместе со страницей man.

Улучшения для OpenVPN 1.x включали улучшенную поддержку TLS, защиту от повторов и перенос на другие операционные системы. Некоторые порты были включены для OpenBSD, Mac OS и улучшены пакеты для RedHat. До версии 1.1.1 устройство tun должно было настраиваться вручную вне OpenVPN. В этом выпуске добавлена опция --ifconfig, которая автоматически настраивала устройство tun, значительно упрощая общую настройку.

Серия 1.x была относительно сырой по сравнению с текущей версией OpenVPN 2.3.8, как и следовало ожидать от нового проекта. Одним из основных препятствий была интеграция OpenSSL. Поскольку OpenSSL был известен своей плохой или полностью отсутствующей документацией, разработчик должен был перейти непосредственно к исходному коду, чтобы интегрировать проект с OpenVPN. Так же на ранних этапах требовались изменения лицензии, чтобы позволить более специфичному общедоступному лицензионному коду GNU связываться с библиотекой OpenSSL не-GPL. Эти проблемы были проработаны, и в журнале изменений на протяжении серии 1.x были добавлены новые функции.

Некоторые заметные обновления в серии 1.x включают в себя:

OpenVPN 2.0 видел большие успехи от выпусков 1.x. В версии 2.0 были предприняты усилия для обеспечения многоклиентных экземпляров сервера, улучшенной работы с потоками и улучшенного tun/tap адаптера Windows. Разработка для 2.0 пересекалась с 1.x более года, с начальными тестовыми выпусками для 2.0, датируемыми ноябрем 2003 года и финальной версией 1.x не выходившей до 9 мая 2004 года. Пока она была окончательно выпущена, 2.0 увидела 29 тестовых выпусков, 20 бета-релизов и 21 релиз-кандидат за полтора года усилий (с ноября 2003 года по апрель 2005 года).

Некоторые ключевые особенности релиза 2.0 по сравнению с 1.6.0 следующие:

Разработка с 2.0 до 2.0.9 в основном состояла из исправлений ошибок и исправлений для нескольких уязвимостей безопасности. Помимо некоторых случайных вкладов от сторонних разработчиков, OpenVPN был разработан Джеймсом до выпуска 2.1. 2.0.9 оставался неизменным официальным выпуском с октября 2006 года до версии 2.1.0 в декабре 2009 года.

OpenVPN 2.1 был первым крупным выпуском с заметным количеством кода, написанного кем-то кроме Джеймса Йонана. Алон Бар-Лев внес значительный вклад, начиная с 2.1-beta3 со многими исправлениями для поддержки криптографии и поправками. Рассматривая первый реальный выпуск сообщества, 2.1 увидел большую работу в базовом ядре кода, включая интерфейс управления и сетевую адресацию. Некоторые заметные примечания к выпуску включают следующее:

В августе 2008 года официального релиза с 2.0.9 не было. Кроме того, было мало поддержки со стороны сообщества, кроме списка рассылки. Был интерес к созданию сообщества и Кризе Кинг и Эрик Крист подталкивали к созданию сообщества вокруг проекта. Изначально все усилия были направлены на поддержку пользователей.

Поскольку группа людей, поддерживающих OpenVPN, росла, это привлекало людей, которые могли писать хороший код. Был установлен контакт с OpenVPN Inc. с целью не только обеспечить более высокий уровень поддержки OpenVPN, но также создать и расширить программное обеспечение, которое написал Джеймс, но попытки сотрудничества были отвергнуты.

Начались переговоры по Internet Relay Chat (IRC), который является средством коммуникации, предпочитаемым многими разработчиками, для переноса проекта, чтобы можно было добиться прогресса. Разработка началась; некоторые участники управляли IRC и помогали в списках рассылки. Другие создали репозиторий, вики и веб-форум. Среднее использование было примерно 2 сообщения в день на форуме и около 8 пользователей в IRC.

В начале 2009 года OpenVPN Technologies наняли Самули Сеппанена чтобы помочь создать сообщество с открытым исходным кодом и взаимодействовать с ним. Самули способствовал установлению прочных отношений между корпорацией, энтузиастами и волонтерами. Было построено сильное сообщество вокруг проекта. Сегодня на форуме в среднем 16 сообщений в день (всего более 35 000 сообщений), а IRC колеблется от 150 до 250 пользователей в любой день.

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

Первоначально для OpenVPN 2.2 Джеймс по-прежнему полностью контролировал то, что было объединено с основным исходным деревом, так как дерево все еще управлялось с использованием подверсий у OpenVPN Technologies. Позже дерево исходных текстов было перенесено в GIT, а роли поменялись местами, где изменения Джеймса были приняты и объединены в дерево проектов с открытым исходным кодом.

Заметные изменения в OpenVPN 2.2:

OpenVPN 2.3 - начало серьезного поворота в структуре сборки OpenVPN. Вкратце, конечная цель - создать более расширяемый и удобный источник для плагинов. Поскольку сборка для мобильных платформ, таких как Android и iOS, уже требует переписывания с нуля, Джеймс и другие разработчики почистили старый код в пользу более компактных и нормализованных функций. Эти переписывания сделаны на C++, в отличие от используемого языка C.

Хотя они и перечислены в журнале изменений предыдущих версий, поддержка IPv6, как полезной нагрузки, так и транзита в OpenVPN, действительно не достигла зрелости до выпуска 2.3. Подавляющее большинство вкладов в поддержку IPv6 было результатом тяжелой работы Герт Деринг.

Еще одной важной особенностью выпуска 2.3 было добавление поддержки PolarSSL. PolarSSL - это альтернативная криптографическая библиотека для OpenSSL, и теперь OpenVPN может быть создан на основе любой библиотеки. Эта тема более подробно обсуждается далее в этой главе.

Список улучшений и дополнений для выпуска 2.3 огромен, но основные моменты заключаются в следующем (полный журнал изменений находится по адресу https://community.openvpn.net/openvpn/wiki/ChangesInOpenvpn23):

Версия 2.3.8 была самой последней версией на момент написания.

Пакеты OpenVPN

В Интернете доступно несколько пакетов OpenVPN:

Версия с открытым исходным кодом (сообщество)

Версии OpenVPN с открытым исходным кодом становятся доступными после публикации каждого выпуска. Сообщество располагает ресурсами для создания бинарных пакетов для нескольких платформ, включая как 32-х, так и 64-разрядных клиентов Windows. Доступные в настоящее время варианты загрузки находятся по адресу http://openvpn.net/index.php/download/community-downloads.html.

Некоторые сопровождающие пакетов операционной системы отслеживают разработку и делают доступными выпуски моментальных снимков. FreeBSD, например, имеет порт security/openvpn-devel, который отслеживает еженедельные снимки тарболла из разработки OpenVPN. Если вы хотите запустить последнюю и самую передовую версию OpenVPN - сначала посмотрите на сопровождающего вашего пакета. В противном случае вы всегда можете собрать напрямую из исходников.

Версия OpenVPN от сообщества может выступать как в качестве VPN-сервера, так и в качестве VPN-клиента. Нет отдельной только клиентской версии.

Закрытые исходники (коммерческий) Access Server

OpenVPN Technologies Inc. предлагает коммерческую версию OpenVPN под названием Access Server. По сравнению с проектом с открытым исходным кодом, Access Server предлагает множество функций и вариантов развертывания, которые могут понравиться некоторым организациям. Access Server является платным продуктом, но на сайте доступна пробная версия с двумя лицензионными ключами.

Пакеты программ, виртуальные устройства и облачные сервисы все доступны от OpenVPN Technologies Inc. на https://openvpn.net/index.php/access-server/overview.html.

OpenVPN Access Server включает в себя собственный клиент OpenVPN - OpenVPN Connect для Windows и Mac OS. Это клиентское программное обеспечение обычно работает только с OpenVPN Access Server. Также можно использовать версию сообщества в качестве клиента для OpenVPN Access Server.

Мобильная платформа (смешанная) OpenVPN/OpenVPN Connect

Для мобильных устройств, таких как iPhone/iPad и Android, OpenVPN Technologies Inc. предоставляет специальный OpenVPN Connect Client. OpenVPN Technologies Inc. и Джеймс специально приложили немало усилий и юридически спорили с такими компаниями как Google и Apple, чтобы получить доступ к используемому VPN API на каждой платформе.

Из-за особенностей NDA Apple, в настоящее время исходные коды OpenVPN Connect недоступны и не могут быть открыты для общего доступа. Клиент iOS OpenVPN Connection можно загрузить из Apple App Store по адресу https://itunes.apple.com/us/app/openvpn-connect/id590379981?mt=8.

Есть Android-клиенты, написанные несколькими разработчиками, но официально поддерживается только версия OpenVPN for Android, написанная Арне Швабе, которую можно найти по адресу https://play.google.com/store/apps/details?id=de.blinkt.openvpn&hl=ru.

OpenVPN Connect, написанный OpenVPN Technologies Inc. также доступен. Вы можете загрузить клиент Android OpenVPN Connect по адресу https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ru.

Одним из серьезных преимуществ OpenVPN Connect является то, что он поддерживает/поддерживается как общедоступной версией OpenVPN, так и OpenVPN Access Server с закрытым исходным кодом. Если вам нужен доступ к обоим типам серверов - рекомендуется OpenVPN Connect.

Другие платформы

Некоторые производители оборудования пытаются интегрировать поддержку OpenVPN в свои устройства. Некоторые предлагают версии прошивки для VoIP-телефонов, которые включают более старую версию OpenVPN. Другие проекты микропрограмм, такие как DD-WRT для маршрутизаторов Linksys, а также проекты FreeNAS, pfSense и другие также интегрируют OpenVPN.

Внутренности OpenVPN

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

Драйвер tun/tap

Одним из основных составных блоков OpenVPN является драйвер tun/tap. Концепция драйвера tun/tap происходит из мира Unix/Linux, где он часто доступен как часть операционной системы. Это виртуальный сетевой адаптер, который обрабатывается операционной системой как двухточечный адаптер (в стиле tun) для трафика только по IP или как полноценный виртуальный адаптер Ethernet для всех типов трафика (в стиле tap). В основе этого адаптера находится приложение, такое как OpenVPN, для обработки входящего и исходящего трафика. Linux, Free/Open/NetBSD, Solaris и Mac OS включают в себя драйвер ядра tun, который может работать как в стиле tun, так и в стиле tap. Недавно аналогичный драйвер был добавлен в AIX - производную Unix от IBM.

Для Microsoft Windows Джеймс Йонан написал специальный драйвер NDIS, называемый адаптером TAP-WIN32. На данный момент доступны версии драйверов NDIS5 и NDIS6, поддерживающие Windows XP через Windows 8.1. Разработка этого адаптера теперь официально отделена от основной разработки OpenVPN, но OpenVPN по-прежнему сильно зависит от него.

Поток трафика из пользовательского приложения через OpenVPN изображен на предыдущей диаграмме. На схеме приложение отправляет трафик на адрес, доступный через туннель OpenVPN. Шаги следующие:

  1. Приложение передает пакет операционной системе.
  2. ОС решает, используя обычные правила маршрутизации, что пакет должен маршрутизироваться через VPN.
  3. Пакет затем пересылается на устройство ядра - tun.
  4. Устройство ядра tun пересылает пакет в процесс OpenVPN (в пользовательском пространстве).
  5. Процесс OpenVPN шифрует и подписывает пакет, фрагментирует его при необходимости, а затем снова передает его ядру, чтобы отправить на адрес удаленной конечной точки VPN.
  6. Ядро забирает зашифрованный пакет и перенаправляет его на удаленную конечную точку VPN, где происходит обратный процесс.

На этой диаграмме также видно, что производительность OpenVPN всегда будет ниже, чем у обычного сетевого подключения. Для большинства приложений потеря производительности минимальна и/или приемлема. Однако для скоростей, превышающих 1 Гбит/с, существует узкое место в производительности как с точки зрения пропускной способности, так и с точки зрения задержки.

Следует отметить, что производительность драйвера Windows намного ниже, чем производительность встроенных адаптеров tun/tap в других операционных системах. Это верно даже для самой последней реализации драйвера TAP-Win32 в NDIS6. Для одного клиента OpenVPN влияние довольно мало, но для крупномасштабного сервера OpenVPN, обслуживающего множество клиентов, легко может вызвать проблемы с производительностью. Это одна из основных причин того, почему сообщество разработчиков исходного кода обычно рекомендует использовать хост на основе Unix или Linux в качестве сервера OpenVPN.

Режимы UDP и TCP

OpenVPN в настоящее время поддерживает два способа обмена данными между конечными точками: использование пакетов UDP или TCP. UDP - это протокол без установления соединения или с потерями; если пакет отбрасывается при передаче, то сетевой стек не может прозрачно исправить это. TCP-пакеты - это протокол, ориентированный на соединение; пакеты отправляются и доставляются с использованием протокола квитирования, обеспечивая доставку каждого пакета на другую сторону.

Оба способа общения имеют свои преимущества и недостатки. На самом деле это зависит от типа трафика, который отправляется через VPN-туннель, для определения более подходящего режима связи. Использование приложения на основе TCP через VPN на основе TCP может привести к двойной потере производительности, особенно если основное сетевое соединение не работает. В этом случае повторная передача потерянных пакетов выполняется для пакетов, потерянных как внутри, так и вне туннеля, что приводит к удвоению нагрузки. Это хорошо объясняется в статье «Почему TCP через TCP - плохая идея» на http://sites.inka.de/~W1011/devel/tcp-tcp.html.

Однако аналогичным образом можно утверждать, что отправка UDP через UDP также не является хорошей идеей. Если приложение, использующее UDP для своего трафика, подвержено атакам удаления сообщений или переупорядочения пакетов, то основное зашифрованное TCP-соединение повысит безопасность таких приложений даже в большей степени, чем базовая VPN на основе UDP. Если большая часть трафика через VPN основана на UDP, то иногда лучше использовать TCP-соединение между конечными точками VPN.

При выборе между транспортным протоколом UDP или TCP общее практическое правило следующее: если UDP (режим udp) работает для вас, используйте его; если нет, то попробуйте TCP (режим tcp-server и режим tcp-client). Некоторые коммутаторы и маршрутизаторы неправильно перенаправляют трафик UDP, что может быть проблемой, особенно если к одному коммутатору или маршрутизатору подключено несколько клиентов OpenVPN. Точно так же на производительность OpenVPN через TCP может сильно повлиять выбор интернет-провайдеров (ISP): некоторые интернет-провайдеры используют нечетные размеры MTU или правила фрагментации пакетов, что приводит к крайне низкой производительности OpenVPN через TCP по сравнению с незашифрованным TCP-трафиком.

Протокол шифрования

Было сказано, что OpenVPN реализует TLS через UDP. Это более или менее верно, но то, как OpenVPN использует TLS, отличается от того, как его использует веб-браузер. Таким образом, когда OpenVPN запускается по протоколу TCP (использование порта 443 является распространенным методом для защиты межсетевых экранов), трафик можно отличить от обычного трафика TLS. Брандмауэр, использующий Deep Packet Inspection (DPI), может легко отфильтровать трафик OpenVPN.

Основное различие между OpenVPN-TLS и браузер-TLS заключается в способе подписи пакетов. OpenVPN предлагает функции для защиты от DoS-атак, подписывая пакеты канала управления с помощью специального статического ключа (--tls-auth ta.key 0|1). Пакеты канала данных, отправляемые через одно и то же соединение UDP или TCP, подписываются совершенно по-разному и очень легко отличаются от трафика HTTPS. На сайте OpenVPN (http://openvpn.net) показано, как зашифрованы пакеты для транспорта UDP, что показано ниже.

Тот же механизм используется для транспорта TCP (http://openvpn.net/index.php/open-source/documentation/security-overview.html).

Это также основная причина, по которой совместное использование портов, когда OpenVPN и защищенный веб-сервер используют один и тот же IP-адрес и номер порта, может работать.

Каналы управления и передачи данных

OpenVPN использует два виртуальных канала для связи между клиентом и сервером:

Исключением является старый двухточечный режим с общим ключом, в котором используется только канал данных.

Шифрование и аутентификация (подпись) для канала управления и канала данных определяются по-разному. Канал управления инициируется с использованием протокола в стиле TLS, аналогично тому, как инициируется безопасное подключение к веб-сайту. Во время инициализации канала управления шифрование и алгоритм хеширования согласовываются между клиентом и сервером.

Алгоритмы шифрования и аутентификации для канала данных не подлежат обсуждению, но они устанавливаются в файлах конфигурации клиента и сервера для OpenVPN. Текущими настройками по умолчанию являются Blowfish в качестве алгоритма шифрования и SHA1 в качестве алгоритма хеширования. Возможность согласования алгоритмов шифрования и хеширования для канала данных занимает важное место в списке пожеланий группы разработчиков, но требует значительных изменений в коде.

Алгоритмы шифрования и хеширования

OpenVPN поддерживает широкий спектр алгоритмов шифрования и хеширования. Они используются для шифрования полезной нагрузки, а функция HMAC использует алгоритм дайджеста или хеширования для аутентификации входящих пакетов. Поскольку OpenVPN использует канал управления и канал данных, существует два набора алгоритмов шифрования и хеширования, которые можно настроить.

Алгоритмы шифрования канала управления и хеширования обычно согласовываются при запуске. Список доступных комбинаций шифрования и хеширования можно отобразить с помощью следующей команды:

$ openvpn --show-tls

Доступные варианты шифрования TLS перечислены в порядке предпочтения:

TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA
TLS-DHE-DSS-WITH-AES-256-GCM-SHA384
TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
TLS-DHE-DSS-WITH-AES-256-CBC-SHA256
TLS-DHE-RSA-WITH-AES-256-CBC-SHA
TLS-DHE-DSS-WITH-AES-256-CBC-SHA
TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA
TLS-DHE-DSS-WITH-CAMELLIA-256-CBC-SHA
TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384
[…]

Этот вывод был получен на хосте CentOS 6 с использованием библиотеки OpenSSL 1.0.1e.

Доступные комбинации во многом зависят от конкретной версии используемой библиотеки SSL. Вы можете указать список tls-шифров в файле конфигурации OpenVPN способом, очень похожим на настройку модуля Apache mod_ssl:

tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSAWITH-AES-256-CBC-SHA384
:TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384

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

Для канала данных алгоритмы шифрования и хеширования управляются с помощью параметров --cipher и --auth. Если алгоритмы шифрования и аутентификации не указаны, то используются значения по умолчанию bf-cbc и sha1, соответственно.

Чтобы получить список доступных алгоритмов шифрования используйте следующую команду:

$ openvpn --show-ciphers

Следующие алгоритмы и режимы шифрования доступны для использования с OpenVPN. Каждый показанный здесь шифр может использоваться в качестве параметра опции --cipher. Размер ключа по умолчанию отображается независимо от того, может ли он быть изменен с помощью директивы --keysize. Рекомендуется использовать режим CBC. В режиме статического ключа допускается только режим CBC:

[…]
BF-CBC 128 bit default key (variable)
BF-CFB 128 bit default key (variable) (TLS client/server mode)
BF-OFB 128 bit default key (variable) (TLS client/server mode)
[…]
AES-128-CBC 128 bit default key (fixed)
AES-128-OFB 128 bit default key (fixed) (TLS client/server mode)
AES-128-CFB 128 bit default key (fixed) (TLS client/server mode)
AES-192-CBC 192 bit default key (fixed)
AES-192-OFB 192 bit default key (fixed) (TLS client/server mode)
AES-192-CFB 192 bit default key (fixed) (TLS client/server mode)
AES-256-CBC 256 bit default key (fixed)
AES-256-OFB 256 bit default key (fixed) (TLS client/server mode)
AES-256-CFB 256 bit default key (fixed) (TLS client/server mode)
[…]

В этом выводе показаны только наиболее часто используемые шифры. Список доступных шифров снова зависит от точной версии базовой библиотеки шифрования. Однако в большинстве случаев должны быть доступны шифры Blowfish (BF-*) и AES (AES-*).

Точно так же для алгоритмов аутентификации (HMAC-подписи) мы используем следующую команду, чтобы перечислить все доступные параметры:

$ openvpn --show-digests

Следующие дайджесты сообщений доступны для использования с OpenVPN. Дайджест сообщения используется вместе с функцией HMAC для аутентификации полученных пакетов. Вы можете указать дайджест сообщения в качестве параметра опции --auth:

[…]
SHA 160 bit digest size
SHA1 160 bit digest size
[…]
ecdsa-with-SHA1 160 bit digest size
[…]
SHA256 256 bit digest size
SHA384 384 bit digest size
SHA512 512 bit digest size
SHA224 224 bit digest size

В этом выводе показаны только наиболее часто используемые дайджесты или алгоритмы хеширования. Список доступных дайджестов зависит от точной версии базовой библиотеки шифрования. В большинстве случаев должны быть доступны алгоритмы хэширования семейства SHA-1 и SHA-2.

OpenSSL против PolarSSL

Начиная с OpenVPN 2.3, добавлена ​​поддержка новой библиотеки SSL. Библиотека PolarSSL (http://polarssl.org) может быть скомпилирована вместо библиотеки OpenSSL по умолчанию. Основная причина добавления второй библиотеки состояла в том, чтобы обеспечить независимость лежащих в основе библиотек шифрования и гарантировать, что никаких проблем с авторским правом не возникнет, поскольку лицензия на авторские права OpenSSL отличается от той, которую использует OpenVPN.

Резюме

В этой главе мы начали с объяснения что такое VPN. Затем обсудили некоторые примеры различных типов протоколов VPN, включая PPTP, IPSec и OpenVPN. После краткого обзора истории OpenVPN мы приступили к более глубокому погружению в методы, используемые в OpenVPN. Эти методы включают адаптер tun/tap и используемые алгоритмы шифрования и подписывания пакетов.

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