Перейти к содержимому

Что такое open vpn и для чего он нужен

  • автор:

Для чего использовать OpenVPN

url image

OpenVPN — одна из самых распространенных реализаций технологии VPN, которую, в основном, используют для организации доступа к внутренним корпоративным сетям. По сравнению с другими протоколами, например, SSTP, Wireguard, SoftEther, он более удобный, эффективный, надёжный и стабильный. Распространяется с открытым исходным кодом, что вызывает ещё большее доверие у пользователей. Также не все поддерживают , а OpenVPN работает на большом количестве платформ: Windows, macOS, iOS, Android, Linux, на маршрутизаторах, FreeBSD, OpenBSD, NetBSD и даже Solaris, в том числе, и на мобильных. Самым новым реализациям VPN он может проигрывать в скорости, и то, лишь при использовании . Но эта проблема решается, так как OpenVPN работает и с более быстрым UDP подключением. Примечание. TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) — протоколы транспортного уровня, которые отвечают за передачу данных в интернете. Безопасность OpenVPN обеспечивается с помощью шифрования и аутентификации посредством библиотеки OpenSSL, ключей шифрования и шифров высокого уровня. В 2017 году VPN Private Internet Access провела аудит безопасности Open VPN, в результате которого разработчики протокола исправили найденные баги и уязвимости. Так что после 2017 года Open VPN стал ещё безопаснее.

Как работает OpenVPN

OpenVPN используется для создания защищённого соединения между и . VPN может иметь широкий спектр применения. Один из самых типичных примеров — использование VPN для корпоративной работы, с целью обеспечить безопасность подключения к корпоративной сети удаленно работающих сотрудников или объединить целые здания и офисы географически распределенные в единую сеть. Также VPN защищает обычного пользователя, использующего публичную сеть . Ведь такие сети часто не безопасны и использовать их рискованно. Еще один из вариантов — обход блокировок различных ресурсов. Например, чтобы заходить на привычные для нас сайты, например, ВКонтакте, на Украине или в Китае нужно использовать VPN. OpenVPN — наиболее удобная реализация VPN, которая позволяет решать те же задачи, плюс имеет дополнительные возможности. Например, позволяет усовершенствовать процедуру авторизации и аутентификации пользователя за счёт привлечения сторонних плагинов и скриптов. Также, OpenVPN можно использовать, чтобы легко соединить два хоста или сети безопасным туннелем типа «точка — точка». В этом формате OpenVPN может работать со статическими ключами ( key), без сертификатов. Кроме того, эти ключи генерирует сам OpenVPN. Идентификация осуществляется по ключу, адреса хостов никак не учитываются. Благодаря этой возможности, OpenVPN удобен для соединений с хостами без статического адреса и хостами за NAT.

Как начать работу с OpenVPN

Установка и настройка OpenVPN может вызвать сложности, но если действовать по инструкциям, то особого труда не составит провести настройку как на стороне сервера, так и на стороне клиента. Мы решили упростить задачу и реализовали рецепт, который вы можете установить на сервер вместе с ОС. Для этого нужно выбрать в пункте Предустановленное ПО — OpenVPN . Рецепт проведет установку ПО, необходимого для работы OpenVPN и проведет первоначальную настройку. Подробнее про установку рецепта мы написали в этой статье.

Этот материал был полезен?

Да Нет Неактуально Недостоверно Непонятно

OpenVPN, о котором вы так мало знали

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

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

Большинство конфигураций для связи клиентов с сервером, а также между серверами, предполагает использование связки приватных или приватно/публичных ключей для обеспечения безопасности внутреннего трафика. Для корпоративных сетей в режиме MultiPoint-To-SinglePoint обычно используется свой центр сертификации PKI, который легко строится либо при помощи easy-rsa, либо на основе XCA. Для межсервенной коммуникации типа Point-to-point, в основном используется конфигурация с общим ключом. Вспомним основные, всем известные механизмы и возможности.

Основные механизмы и возможности

Сертификатная аутентификация

Приватные point-to-point ключи

Во всех случаях подключения для безопасности «рукопожатия» handshake между клиентом и сервером используется протокол Diffie-Hellmann.

Внешняя аутентификация пользователей

Для упрощения контроля за подключением пользователей, вместо схемы со своим PKI, можно использовать схему с внешней аутентификацией пользователей по логину/паролю. Данная схема удобна для аутентификации пользователей скажем по доменному логину/паролю. Для подключения к серверу в конфигурационный файл клиента добавляется сертификат сервера и ключ подписи передаваемых пакетов HARDENING OPENVPN SECURITY.
пример клиентского конфига

dev tun proto udp # Внешний IP сервера OpenVPN remote 172.16.111.166 # Port сервера port 1200 client resolv-retry infinite tls-client key-direction 1 auth SHA1 cipher BF-CBC #comp-lzo persist-key persist-tun # auth-user-pass c:/temp/pass.txt # # just create a file with name pass.txt # and put to it two lines # ------------- #username #password # ------------- #auth-user-pass verb 3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIJAOt3kFH7PxA0MA0GCSqGSIb3DQEBCwUAMIGjMQswCQYD . -----END CERTIFICATE----- -----BEGIN OpenVPN Static key V1----- 83ddd29fa82212f3059d85a41490134c . a4f2c7df3a22364a49093bca102dedeb -----END OpenVPN Static key V1----- 

Часть серверного конфига для аутентификации клиентов через файл
Using alternative authentication methods

verify-client-cert none #client-cert-not-required username-as-common-name tls-server tls-auth /usr/local/etc/openvpn/ssl/tlsauth.key key-direction 0 tls-timeout 120 auth SHA1 cipher BF-CBC auth-user-pass-verify /usr/local/etc/openvpn/auth/auth-static-file.pl via-file

PAM

Для повышения безопасности можно использовать подключаемые модули обеспечивающие проверку логина/пароля во внешних системах. Самым распространённым методом является системный PAM(Pluggable Authentication Modules).
В конфигурационный файл OpenVPN необходимо добавить строку

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

Маршрутизация

На этом «штатные» широкоиспользуемые возможности заканчиваются и начинается локальная кастомизация для каждого конкретного случая.

Дополнительные возможности OpenVPN

Рассмотрим дополнительные возможности OpenVPN, о которых может кто-то и слышал, но в реальности не видел или не использовал.

Безопасность сетей/Packet Filtering

Т.к. OpenVPN маршрутизирует трафик, у него есть два штатных взаимоисключающих друг друга режима работы. Первый режим это маршрутизация внутри OpenVPN сервера, второй режим это межинтерфейсная ядерная маршрутизация. В первом случае за коммутацию и фильтрацию пакетов между клиентами/сетями отвечает сам OpenVPN, во втором любой поддерживаемый на хосте системный пакетный фильтр(pf, iptables, etc).
Мало кто знает, что OpenVPN имеет встроенный пакетный фильтр, который позволяет разрешить или изолировать соединения между пользователями и сетями.
Да, да. Вы правильно прочитали. OpenVPN имеет свой собственный встроенный пакетный фильтр. Возможность фильтрации трафика была реализована еще в далёком 2010 году.
Пакетный фильтр OpenVPN управляется либо через management-interface, либо через подключаемые к OpenVPN плагины.
Управление правилами трафика происходит через файл. Формат файла прост.

[CLIENTS DROP|ACCEPT] <+|->common_name1 <+|->common_name2 . . . [SUBNETS DROP|ACCEPT] <+|->subnet1 <+|->subnet2 . . . [END]

Директивы блока (ACCEPT/DENY) задают действие по умолчанию для всех клиентов не указанных внутри блока.
Например файл для клиента user2

[CLIENTS DROP] +user1 [SUBNETS DROP] [END]

Или другой пример.
Отключить всё кроме доступа между пользователями и DNS сервером находящимся в локальной сети и тестовым контуром в сети 192.168.0.0/24

[CLIENTS DROP] +user1 +user2 [SUBNETS DROP] +10.150.0.1 +10.150.1.1 +192.168.0.0/24 [END]

Механизм фильтрации активируется через конфигурационный файл, либо при подключении плагина «выставившего» флаг «OPENVPN_PLUGIN_ENABLE_PF».
Данную возможность мы обсудим позже.
Вторым режимом фильтрации трафика является встроенный в систему пакетный фильтр. Для его активации в конфиге не должно быть директивы «client-to-client». С точки зрения автоматизации включения/выключения необходимых правил при подключении/отключении клиентов удобнее всего использовать отдельные вставки в список правил, реализуемые либо через CHAINS в Iptables(Linux), либо в Anchors в PF(FreeBSD). Активация/деактивация правил обычно осуществляется через директивы client-connect/client-disconnect в конфигурационном файле сервера, вызывающие соответствующие скрипты при подключении/отключении пользователя.

Расширенная PAM аутентификация

Под расширенной PAM аутентификацией подразумевается изменение логики работы проверки логина и пароля пользователя. Достигается это либо установкой соответствующих плагинов для OpenVPN, обеспечивающих чтение и проверку данных во внешних источниках, либо подключением в систему библиотек позволяющих скриптовать любую логику. Одной из такой библиотек является pam_python, которая помогает скриптовать любую логику проверки логина/пароля через Python скрипты.
В случае её использования строка проверки пользователя меняется следующим образом.

plugin openvpn-plugin-auth-pam.so pam_python login USERNAME password PASSWORD domain mydomain.com

«Отложенная» аутентификация

Плагины OpenVPN

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

#define OPENVPN_PLUGIN_FUNC_SUCCESS 0 #define OPENVPN_PLUGIN_FUNC_ERROR 1 #define OPENVPN_PLUGIN_FUNC_DEFERRED 2

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

OPENVPN_PLUGIN_UP < "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "daemon_log_redirect":"1", "daemon":"1", "route_net_gateway":"172.16.100.1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"0", "local_port_1":"1200", "route_network_1":"10.150.0.0" >
OPENVPN_PLUGIN_ROUTE_UP < "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "daemon_log_redirect":"1", "daemon":"1", "route_net_gateway":"172.16.100.1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"2", "local_port_1":"1200", "route_network_1":"10.150.0.0" >

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

OPENVPN_PLUGIN_ENABLE_PF < "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "daemon":"1", "daemon_log_redirect":"1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"11", "local_port_1":"1200", "route_network_1":"10.150.0.0" >

Как видно из дампа, появилась переменная pf_file. В данном файле должны находиться правила внутреннего пакетного фильтра для текущей обрабатываемой сессии.
Далее проверяется логин и пароль пользователя в функции OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY

OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY < "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "IV_NCP":"2", "IV_COMP_STUB":"1", "daemon_start_time":"1545994898", "IV_LZ4":"1", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"2", "IV_PLAT":"win", "daemon_pid":"626", "password":"12312312312312", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"5", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" >

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

#define OPENVPN_PLUGIN_FUNC_SUCCESS 0 #define OPENVPN_PLUGIN_FUNC_ERROR 1 #define OPENVPN_PLUGIN_FUNC_DEFERRED 2

Если сервер получает ответ OPENVPN_PLUGIN_FUNC_DEFERRED, то в работу вступает механизм «отложенной» аутентификации. Как мы видим, в переменном окружении появилась переменная «auth_control_file», содержимое данной переменной содержит имя файла, в котором будет ожидаться ответ от системы аутентификации. Ответом является помещённый в указанный файл символ 0(для разрешения доступа), 1(для запрета доступа). Параметр сервера «hand-window» определяет таймаут в секундах, в течении которого сервер будет ожидать ответ. Во время ожидания трафик от других клиентов не прерывается.

Так как мы работаем с парольной аутентификацией, то функции проверки сертификатов OPENVPN_PLUGIN_TLS_VERIFY не вызывается. Вместо этого сразу вызывается OPENVPN_PLUGIN_TLS_FINAL, подтверждающий установление сессии.

OPENVPN_PLUGIN_TLS_FINAL < "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "IV_NCP":"2", "IV_COMP_STUB":"1", "daemon_start_time":"1545994898", "IV_LZ4":"1", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"2", "IV_PLAT":"win", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"10", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" >

Далее срабатывает вызов OPENVPN_PLUGIN_IPCHANGE, вызываемый перед сменой ip адреса клиента.

OPENVPN_PLUGIN_IPCHANGE < "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "redirect_gateway":"0", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "ifconfig_remote":"10.150.0.2", "IV_NCP":"2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"3", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" >

Функция OPENVPN_PLUGIN_CLIENT_CONNECT_V2, вызывается при установке IP адреса внутренним DHCP сервером.

OPENVPN_PLUGIN_CLIENT_CONNECT_V2 < "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "dev":"tun150", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "time_ascii":"Sat Jan 12 18:54:48 2019", "ifconfig_remote":"10.150.0.2", "IV_NCP":"2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "time_unix":"1547319288", "redirect_gateway":"0", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "ifconfig_pool_local_ip":"10.150.0.5", "pluginid":"9", "ifconfig_pool_remote_ip":"10.150.0.6", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" >

В переменном окружении появляются переменные содержащие параметры туннеля «ifconfig_pool_local_ip» и «ifconfig_pool_remote_ip».

Функция OPENVPN_PLUGIN_LEARN_ADDRESS вызывается при обучении OpenVPN сервером, связки IP адресов и маршрутов к ним. После выхода из этой функции активируется процедура применения настроек пакетного фильтра из файла. Переменное окружение OPENVPN_PLUGIN_LEARN_ADDRESS при этом соответствует фазе OPENVPN_PLUGIN_CLIENT_CONNECT_V2.

fa56bf61-. /172.16.111.168:1200 ----- pf_check_reload : struct pf_context ----- fa56bf61-. /172.16.111.168:1200 enabled=1 fa56bf61-. /172.16.111.168:1200 filename='/tmp/openvpn_pf_343330698e4acdea34c8a8c7fb87d861.tmp' fa56bf61-. /172.16.111.168:1200 file_last_mod=1547319124 fa56bf61-. /172.16.111.168:1200 n_check_reload=1 fa56bf61-. /172.16.111.168:1200 reload=[1,15,1547319125] fa56bf61-. /172.16.111.168:1200 ----- struct pf_set ----- fa56bf61-. /172.16.111.168:1200 kill=0 fa56bf61-. /172.16.111.168:1200 ----- struct pf_subnet_set ----- fa56bf61-. /172.16.111.168:1200 default_allow=ACCEPT fa56bf61-. /172.16.111.168:1200 ----- struct pf_cn_set ----- fa56bf61-. /172.16.111.168:1200 default_allow=DROP fa56bf61-. /172.16.111.168:1200 12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-. /172.16.111.168:1200 fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-. /172.16.111.168:1200 ---------- fa56bf61-. /172.16.111.168:1200 fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-. /172.16.111.168:1200 12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-. /172.16.111.168:1200 --------------------

При отключении клиента вызывается функция OPENVPN_PLUGIN_CLIENT_DISCONNECT.

OPENVPN_PLUGIN_CLIENT_DISCONNECT < "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "dev":"tun150", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "time_ascii":"Sat Jan 12 18:54:48 2019", "bytes_received":"30893", "IV_NCP":"2", "untrusted_port":"1200", "ifconfig_remote":"10.150.0.2", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_4bdddbada2885cde42cd3cb1b85d77e5.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "time_unix":"1547319288", "redirect_gateway":"0", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "time_duration":"3781", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "bytes_sent":"22684", "remote_port_1":"1200", "ifconfig_pool_local_ip":"10.150.0.5", "pluginid":"7", "ifconfig_pool_remote_ip":"10.150.0.6", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" >

В переменном окружении добавляются длительность соединения и трафик пользователя.

Как вы успели заметить, в связи с обилием данных в разных вызовах, написание и отладка плагина на языке программирования C(C++) будет довольно трудоёмкой задачей.
Для расширения функционала было решено сделать «чудо» сначала для внутреннего проекта, а потом выложить его в свободный доступ 🙂
После долгого чтения исходных кодов OpenVPN и различных примеров узкоспециализированных плагинов, был написан проект, который в качестве языка программирования логики обработки сессии использует Python. Код представляет собой подключаемый к OpenVPN плагин на языке C, который все запросы поступающие в плагин, отправляет в Python модуль через c-api reference.

Почему Python модуль ?

Python c-api reference работая с python файлами напрямую, некорректно работает с загрузкой python библиотек.

Как это работает ?

При инициализации плагина в OpenVPN, плагин возвращает масочный список всех функций, которые может обслужить. При наступлении очередной фазы подключения или внутреннего события, OpenVPN вызывает соответствующие функции из плагина. Плагин преобразует переменное окружение и параметры переданные функции в структуру, инициализирует python и передаёт структуру в соответствующую процедуру python модуля. Процедура возвращает плагину один из трёх ответов (0 — Success, 1 — Error, 2 — Deferred). Ответ транформируется и возвращается OpenVPN.

Обратите внимание, что все вызовы модуля являются «stateless», это означает, что процедуры не помнят и не знают, что происходило ранее в других вызовах. Ориентироваться можно только на переменное окружение передаваемое плагину из OpenVPN.

Внутри python модуля вы можете реализовать любую логику, подключая нужные библиотеки и ресурсы. Если вы не уверены в скорости выполнения проверок, то используйте «отложенные» подтверждения.

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

Во время тестирования проекта был разработан механизм генерации паролей, аналогичный jwt токенам, но имеющим меньший размер.

Суть проста. Токен содержит в себе идентификатор клиента и срок окончания доступа. Для подписи токена используется HMAC_SHA1 с закрытым ключом. После подписи токена, текстовое содержимое ксорится подписью и конвертится в base64. Таким образом получается «запечатывание» токена. «Запечатанный» токен используется в качестве пароля пользователя. При несанкционированном изменении блока с данными, поломается xor, если поломается xor, значит поломается проверка подписи. Без закрытого ключа подпись изменить не получится.

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

Надеюсь информация в данной статье была вам полезна.
Спасибо за потраченное на её прочтение время.
Если есть вопросы, попробую ответить на что смогу.

Aborche

© Aborche 2019

Что такое OpenVPN? Как работает OpenVPN и как им пользоваться?

Даже если вы новичок в теме VPN, то наверняка уже слышали об OpenVPN. Большинство поставщиков VPN-услуг предлагают его потому, что он очень безопасный и надёжный. Если вдаваться в подробности, что же такое OpenVPN? Как на самом деле работает OpenVPN?

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

Что такое OpenVPN?

OpenVPN — это VPN-протокол и ПО, которое использует методы VPN для защиты соединений типа “точка-точка” и “сайт-сайт”. В настоящее время это один из самых популярных VPN-протоколов среди пользователей VPN.

Он был разработан Джеймсом Йонаном и выпущен в 2001 году. OpenVPN — один из VPN-протоколов с нативным приложением с открытым исходным кодом (собственное приложение есть и у SoftEther).

Как работает OpenVPN?

Протокол OpenVPN отвечает за поддержание коммуникации между клиентом и сервером. Как правило, он используется для создания защищённого “туннеля” между VPN-клиентом и VPN-сервером.

Для шифрования и аутентификации OpenVPN использует библиотеку OpenSSL. Кроме того, для передачи данных OpenVPN может использовать UDP (User Datagram Protocol) или TCP (Transmission Control Protocol).

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

OpenVPN лучше всего работает по UDP (согласно данным OpenVPN.net), поэтому сервер доступа OpenVPN сначала пытается установить UDP-соединения. Если это не удаётся, только тогда сервер пробует создать соединение по протоколу TCP. Большинство VPN-Сервисов по умолчанию предоставляют OpenVPN через UDP.

Благодаря своей структуре кода (это кастомный протокол безопасности), протокол OpenVPN может легко обходить HTTP и NAT.

В отличие от большинства VPN-протоколов, OpenVPN — это протокол с открытым исходным кодом. Это означает, что код никому не принадлежит, и третьи стороны всегда могут его проверить или модернизировать (улучшить).

Принцип работы OpenVPN — Общие технические характеристики

  • Как правило, OpenVPN использует 256-битное OpenSSL-шифрование. Ради более высокого уровня безопасности соединения OpenVPN может использовать шифры AES, Camellia, 3DES, CAST-128 или Blowfish.
  • Хотя OpenVPN не поддерживает L2TP, IPSec и PPTP, в нём используется собственный протокол на базе TLS и SSL.
  • OpenVPN позволяет усовершенствовать процедуру авторизации и аутентификации за счёт привлечения сторонних плагинов и скриптов.
  • Клиенты могут подключаться к серверам за пределами сервера OpenVPN, так как он поддерживает настройку частной подсети.
  • Чтобы защитить пользователей от переполнения буфера в реализациях TLS/SSL, DoS-атак, сканирования портов и наводнения портов, OpenVPN использует tls-auth для верификации подписи HMAC. Структура OpenVPN позволяет сбросить привилегии при необходимости, а также использовать “тюрьму” chroot для CRL.
  • OpenVPN работает в пространстве пользователя, а не ядра.

Безопасность OpenVPN. Безопасно ли им использоваться?

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

Протокол прошёл два аудита безопасности в 2017 году — при первом проявились только незначительные проблемы, которые не подвергали опасности пользовательские данные. Во время второго аудита обнаружили только две ошибки (которые вскоре были исправлены).

Платформа OpenVPN.net также предлагает подробный список того, что пользователи могут сделать для дальнейшей защиты своего подключения уже после настройки OpenVPN на устройстве. И поскольку это протокол с открытым исходным кодом, он гораздо более надёжный, так как вы можете проверить код самостоятельно (если владеете необходимым опытом). Так вы сможете убедиться, что с протоколом всё в порядке.

Скорость OpenVPN. Насколько быстро он работает?

На самом деле, скорость — далеко не сильная сторона OpenVPN, но если у вас скоростной интернет, то скорость будет приемлемой. Как правило, скорость интернета падает из-за сильного уровня шифрования в OpenVPN. При этом могут влиять и другие факторы.

Можете добиться более высокой скорости, если будете использовать OpenVPN через UDP вместо TCP.

Как пользоваться OpenVPN?

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

В этом разделе мы рассмотрим процесс настройки на Windows, так как эта ОС наиболее востребована. Процедура настройки на Android и в iOS очень похожа на ту, что мы приводим ниже. Установка и использование OpenVPN на Linux ещё сложнее, но вы можете ознакомиться с процедурой здесь (дополнительную информацию можно найти здесь).

Прежде чем мы продолжим, следует отметить, что для настройки OpenVPN-соединения вам понадобится подписка на VPN-Сервис. Хотя вы можете настроить собственный сервер OpenVPN, это невероятно сложно. К тому же, большинство доступных в интернете руководств посвящены настройке на Linux.

Итак, вот основные тезисы, которые вам следует учитывать при использовании протокола OpenVPN:

1. Во-первых, скачайте файлы конфигурации

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

Файлы конфигурации обычно заархивированы и их нужно распаковать. Наиболее важными файлами будут OVPN.

2. Установите клиент OpenVPN

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

По завершении установки перед вами может появиться текстовый файл с инструкциями или техническими сведениями. Вы можете ознакомиться с ним или просто закрыть. Это ни на что не влияет.

3. Импортируйте данные VPN

Для запуска OpenVPN необходимо запустить GUI-приложение OpenVPN. Он добавит службу в трей (небольшая панель задач в правом нижнем или верхнем углу). Теперь скопируйте все скачанные файлы OVPN в подпапку “Config” в папке установки OpenVPN.

Теперь, если нажать по OpenVPN в трее, вы сможете увидеть названия всех только что скопированных файлов. Если вам потребуется, то файлы можно переименовать.

4. Установка соединения

Чтобы подключиться к серверу, просто нажмите на OVPN-файлы в приложении OpenVPN. При возникновении необходимости укажите свои данные для входа. Если все пойдет хорошо, вы увидите экран журнала с некоторыми командами состояния. Они должны исчезнуть при установке соединения.

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

На этом этапе вы можете протестировать соединение, чтобы убедиться, что всё в порядке

Чтобы отключиться от сервера, просто нажмите на значок OpenVPN, укажите сервер, к которому вы подключены, и нажмите “Отключиться”.

5. Настройки (базовые и расширенные)

У приложения OpenVPN не так много настроек, но с некоторыми из них можно немного поиграть.

К примеру, в “Настройках” можно поставить галочку, чтобы OpenVPN автоматически запускалась вместе с операционной системой. Вы также можете включить опцию “Бесшумное подключение”, чтобы при подключении к серверу не отображался экран состояния. Однако будьте осторожны с пунктом “никогда”, так как он отключает уведомления на рабочем столе.

Если вам нужны более глубокие настройки соединения, то можно открыть сами файлы OVPN (мы рекомендуем делать это при помощи WordPad) и просмотреть, какие там заданы команды. Если у вас достаточно знаний в этой области, то можете отредактировать эти команды по своему усмотрению или добавить новые. Давайте посмотрим, какие команды могут быть вам интересны:

  • Команда “proto”используется для переключения между UDP или TCP. Просто добавьте имя протокола после команды, например: “proto udp.”
  • Команда “Remote”сообщает OpenVPN имя сервера, который вы хотите использовать. Обычно после имени VPN-сервера также указывается порт. Если знаете какие-нибудь ещё порты, которые использует ваш провайдер, то можете переключаться между ними при помощи этой строки.
  • Команда “tun-mtu” отвечает за максимальный размер полезного блока данных одного пакета (MTU). Обычно указывается значение около 1500, но вы можете попробовать изменить его для повышения производительности.

Кроме того, можете просмотреть подпапку “doc” в папке установки OpenVPN, если вам требуется более подробная документация. Там вы сможете узнать, как пользоваться другими функциями (например, настраивать сценарии отключения VPN или блокировать DNS-утечки). Дополнительную информацию можно найти в Справочном руководстве, доступном на сайте OpenVPN.net.

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

Преимущества
  • OpenVPN — очень безопасный протокол, который использует 256-битные ключи шифрования и шифры высокого уровня.
  • Протокол OpenVPN может с лёгкостью обойти любой фаервол на своём пути.
  • Поскольку OpenVPN работает как с TCP, так и с UDP, он предлагает намного больше контроля над соединениями.
  • При этом OpenVPN поддерживается большинством платформ. К примеру, Windows, macOS, iOS, Android, Linux, на маршрутизаторах, FreeBSD, OpenBSD, NetBSD и даже Solaris.
  • В OpenVPN есть поддержка свойства “Совершенно прямой секретности”.
Недостатки
  • Ручная настройка протокола OpenVPN может быть довольно сложной на некоторых платформах.
  • Иногда из-за сильного шифрования можно ощущать значительное снижение скорости интернета.
  • Для работы OpenVPN необходимо использовать сторонние приложения.

Ищете надёжный VPN-Сервис?

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

CactusVPN

И если вы захотите попробовать другие способы разблокировки веб-сайтов, мы также предлагаем услугу Smart DNS, которая открывает доступ к более 300 сайтов. Кроме всего прочего, все наши VPN-серверы дополняются прокси-серверами.

Специальное предложение! Получите CactusVPN за 3.5$ в месяц!

И как только вы станете клиентом CactusVPN, у вас будет 30-дневная гарантия возврата денег.

Насколько хорош OpenVPN в сравнении с другими VPN-протоколами?

На данный момент OpenVPN считается лучшим VPN-протоколом. Кажется, единственный, кто может составить конкуренцию OpenVPN, это протокол SoftEther. И вы сами скоро в этом убедитесь.

OpenVPN или SSTP

SSTP и OpenVPN довольно похожи, поскольку в обоих случаях используется SSL 3.0 и при этом оба протокола могут использовать порт 443. Они также обеспечивают идентичный уровень безопасности, так как оба протокола используют 256-битное шифрование и шифр высокого уровня AES.

Тем не менее, OpenVPN распространяется с открытым исходным кодом. Это означает, что он гораздо надежнее SSTP, который принадлежит Microsoft — корпорации, которая, как известно, сотрудничает с АНБ и ФБР.

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

С точки зрения скорости поговаривают, что SSTP быстрее OpenVPN, но обоснованных доказательств этому пока нет. Безусловно, OpenVPN может быть довольно ресурсоёмким, но обычно так происходит при использовании TCP-порта (который также использует SSTP). Но при этом OpenVPN также может использовать порт UDP, который обеспечивает гораздо более высокую скорость.

OpenVPN также имеет преимущество по части кросс-платформенной поддержки, поскольку он работает на значительно большем количестве платформ. В свою очередь SSTP доступен только на Windows, Linux, Android и на маршрутизаторах. Тем не менее, стоит отметить, что SSTP изначально интегрирован в Windows, поэтому его проще настроить, чем OpenVPN.

В целом, как OpenVPN, так и SSTP являются достойным выбором, просто OpenVPN эффективнее.

Если вы хотите узнать больше о SSTP, ознакомьтесь с этой статьей.

OpenVPN или Wireguard

OpenVPN использует библиотеку OpenSSL для реализации всевозможных криптографических алгоритмов (наиболее популярным из них является AES-256). WireGuard использует современные фиксированные алгоритмы (вы не можете их изменить), чтобы якобы избежать неправильной конфигурации, которая приводит к уязвимостям безопасности. В целом они оба обеспечивают отличную безопасность.

WireGuard, без сомнения, быстрее OpenVPN. Его кодовая база намного легче (примерно 4000 строк по сравнению с 70000-600000 строк), и он более эффективно использует ядра ЦП. В наших тестах WireGuard был быстрее, даже когда мы использовали OpenVPN с UDP.

OpenVPN или SoftEther

Можно с уверенностью говорить, что и OpenVPN, и SoftEther являются действительно безопасными протоколами. Они распространяются с открытым исходным кодом, используют шифры военного уровня (AES), используют 256-битное шифрование, а также SSL 3.0. Основное различие между ними — их возраст. SoftEther намного новее OpenVPN. Из-за этого некоторым кажется, что OpenVPN намного надежнее.

С точки зрения скорости OpenVPN немного уступает SoftEther. На самом деле, согласно исследованию университета Цукуба (люди, стоящие за SoftEther VPN, поэтому не субъективный источник 100%), протокол SoftEther должен быть в 13 раз быстрее, чем протокол OpenVPN.

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

Как и OpenVPN, SoftEther может запускать собственный сервер. Но при этом сервер SoftEther может работать как с протоколом OpenVPN, так и с другими протоколами, включая IPSec, L2TP/IPSec, SSTP и SoftEther. Сервер OpenVPN может работать только с собственным протоколом.

Вместо вердикта можно сказать, что SoftEther является хорошей альтернативой OpenVPN. Если по какой-либо причине вы не можете использовать OpenVPN, попробуйте SoftEther.

Если хотите узнать об этом больше, перейдите по этой ссылке.

OpenVPN или PPTP

Начать следует с того, что PPTP значительно слабее OpenVPN по части безопасности. В то время как OpenVPN может работать с 256-битными ключами шифрования и шифрами типа AES, PPTP может использовать только 128-битные ключи в связке с шифром MPPE. К сожалению, шифрование MPPE очень легко взломать. Ниже вы можете видеть лишь которые слабые места:

  • MPPE уязвима к атакам с подменой битов.
  • MPPE не может шифровать пакеты PPP и NCP.
  • Шифр обычно не проверяет, является ли сервер подлинным.
  • MPPE уязвима для атаки Сброс запроса (разновидность “Атаки посредника”)

Кроме того, для аутентификации PPTP использует MS-CHAP-v1 (который не считается безопасным) или MS-CHAP-v2 (опять же, совсем небезопасным). OpenVPN намного безопаснее, так как для аутентификации использует лучшее шифрование (например SHA-256, SHA-384 или SHA-512).

Кроме того, PPTP довольно легко заблокировать с помощью фаервола. OpenVPN не может быть заблокирован системный администратором, поскольку использует порт HTTPS. Также не стоит забывать, что скорее всего АНБ может взломать PPTP-трафик.

По сути, единственное, в чём PPTP может быть лучше OpenVPN, это скорости интернета. А также в том, что протокол по умолчанию доступен на многих платформах. PPTP работает так быстро из-за низкого уровня шифрования. И хотя OpenVPN также поддерживает множество платформ, охват у него не настолько широкий, как у PPTP.

Тем не менее, стоит отметить, что в дальнейшим на новых операционных системах и устройствах уже может не быть поддержки PPTP. Например, этого протокола уже нет на устройствах macOS и iOS, начиная с macOS Sierra и iOS 10.

Если вы хотите узнать больше о протоколе PPTP, то у нас есть подробная статья на эту тему.

OpenVPN или L2TP/IPSec

Как и PPTP, L2TP/IPSec изначально доступен на многих платформах. Соответственно, настроить его намного проще, чем OpenVPN. Хотя, если вы используете VPN-Сервис, то вряд ли ощутите разницу. С другой стороны, L2TP/IPSec использует меньше портов, чем OpenVPN, и при этом не использует порт 443. Таким образом, протокол больше подвержен блокировке посредством фаервола NAT.

Хотя L2TP/IPSec не полностью принадлежит Microsoft (поскольку был разработан компанией Cisco), ему всё же нельзя доверять настолько, как OpenVPN, который распространяется с открытым исходным кодом. Кроме того, ранее Эдвард Сноуден заявлял, что L2TP был намеренно ослаблен по указанию АНБ.

И если уж говорить о безопасности, то вы должны знать, что сам по себе протокол L2TP предлагает абсолютно нулевое шифрование. Вот почему он всегда идёт в связке с IPSec. Кроме того, несмотря на то, что OpenVPN на TCP иногда может требовать достаточно много ресурсов, связка L2TP/IPSec также получается достаточно “тяжёлой” (в зависимости от того, насколько мощное у вас устройство). Это потому что протокол инкапсулирует данные дважды

Если вы хотите узнать больше о L2TP/IPSec, то вам поможет эта ссылка.

OpenVPN или IPSec

IPSec часто идёт в связке с L2TP и IKEv2, но вы можете найти VPN-Сервисы, которые предлагают эти протоколы по отдельности.

Итак, насколько он конкурирует с OpenVPN? Оба они предлагают одинаково достойный уровень безопасности. Тем не менее, вы должны быть более осторожны при настройке IPSec, поскольку небольшая ошибка может нарушить защиту. Кроме того, поскольку IPSec занимает пространство ядра (пространство на устройстве, зарезервированное для ОС), его уровень безопасности может быть ограничена производителем устройства. Это также делает IPSec менее совместимым, чем OpenVPN. Последний использует дисковое пространство (системная память, выделенная на приложения).

Как правило, IPSec доступен на многих платформах. Даже на тех, где OpenVPN нужно настраивать вручную. Естественно, это не проблема, если вы пользуетесь проверенным VPN-Сервисом. Также стоит отметить, что трафик IPSec иногда может блокироваться некоторыми фаерволами, в то время как UDP- или TCP-пакеты при OpenVPN не подвержены таким проблемам.

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

Хотите узнать больше об IPSec? Читайте эту статью.

OpenVPN или IKEv2/IPSec

OpenVPN и IKEv2 являются безопасными протоколами, но стоит отметить, что OpenVPN для защиты данных на транспортном уровне использует TLS/SSL, в то время как IKEv2 защищает данные на уровне IP. В принципе, разница незначительная, но об этом не будет лишним знать. И хотя IKEv2 был разработан Cisco совместно с Microsoft, это не такая уж большая проблема, так как есть реализации IKEv2 с открытым исходным кодом.

OpenVPN даёт преимущество в плане кросс-платформенной совместимости, но IKEv2 обычно является фаворитом среди мобильных пользователей, потому что он изначально был интегрирован в устройства BlackBerry. Кроме того, IKEv2, как правило, обеспечивает лучшую стабильность, чем OpenVPN, поскольку может противостоять изменениям в сети. Что это значит? Если, например, вы случайно переключились с WiFi на мобильный интернет, IKEv2 продолжит работать не обрывая соединения.

Кроме того, вам следует знать, что IKEv2 работает быстрее OpenVPN, но при этом его проще блокировать. Почему? Поскольку IKEv2 использует 500-й UDP-порт, системный администраторам легче вычислить его, чем порт 443, который обычно используется в OpenVPN.

В целом, мы бы сказали, что IKEv2 будет лучше OpenVPN, если вы часто пользуетесь мобильным телефоном. Особенно в путешествия за рубеж. В остальных случаях лучше все же пользоваться OpenVPN.

Если хотите узнать больше об IKEv2, перейдите по этой ссылке.

Итак, зачем вообще использовать OpenVPN и когда стоит это делать?

Основная причина использования протокола OpenVPN заключается в том, что он очень безопасный, действительно стабильный и работает на многих платформах. Большинство экспертов по безопасности рекомендуют всегда использовать OpenVPN при подключении к интернету. Как минимум потому, что это “прозрачный” протокол, то есть распространяется с открытым исходным кодом).

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

Подытожим — Что же такое OpenVPN?

OpenVPN — это и VPN-протокол с открытым исходным кодом, и VPN-программа, которая позволяет пользователям безопасно подключаться к интернету. Большинство VPN-Провайдеров предоставляют этот протокол, потому что он очень безопасен (использует библиотеку OpenSSL и 256-битное шифрование). При этом он отлично работает на множестве платформ. OpenVPN считается лучшим среди VPN-протоколов, и только SoftEther способен конкурировать с ним.

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

OpenVPN. Инструкция по применению

Виртуальные частные сети (VPN) давно вошли в повседневную жизнь. Множество технологий и реализаций сервиса приватных сетей (как для частного применения, так и для использования внутри периметра организаций), обеспечивающих определённый уровень безопасности, доступны для использования широкому кругу ИТ-специалистов.

Не смотря на обилие технологий, предлагаю остановиться на старом добром OpenVPN (в связке с EASY-RSA). Решение от Джеймса Йонана отличается гибкостью, функциональностью, надёжностью и непрерывностью разработки на протяжении приличного временного периода. Так сказать, мастодонт от мира VPN-решений.

Спойлер — ссылка на довольно функциональное решение (ничего особенного, чистый бэкэнд), написанное на bash некоторое время назад, ждёт вас в конце публикации (в виде github-репозитория под именем «openvpn_helper»), а здесь же уделю внимание общей структуре и некоторым аспектам использования набора скриптов и OpenVPN.
***
Список необходимых компонентов (используемая ОС — AlmaLinux 8):
1) OpenVPN 2.4.12;
2) EASY-RSA 3.0.8.

2. Описание общей структуры репозитория

2.1. Директория «ovpn-server»

Директория содержит файлы и поддиректории двух типов: статичные (входящие в репозитория непосредственно) и генерируемые автоматически.

  • «main.sh» — файл, содержащий основную кодовую базу репозитория.
  • «vpn.env» — основной файл конфигурации.
  • «full_setup_vpn_server.sh» — скрипт полной установки VPN-сервера. После запуска исполняет следующие действия:
    1) инициация структуры файлов/директорий для управления ключами easyrsa («./easyrsa init-pki»);
    2) создание корневого сертификата («./easyrsa build-ca»);
    3) генерация ключа Диффи-Хелмана («./easyrsa gen-dh»);
    4) создание запроса на выпуск сертификата VPN-сервера («./easyrsa gen-req vpn-server»);
    5) импорт и подписание сертификата VPN-сервера («./easyrsa sign-req server vpn-server»);
    6) генерация списка отозванных сертификатов («./easyrsa gen-crl»);
    7) генерация секретного ключа ta.key («/usr/sbin/openvpn —genkey —secret «$PKI_DIR/ta.key»»), используемого как на стороне сервера, так и на стороне клиента. Необходим для обеспечения дополнительного уровня безопасности (защищает от сканирования прослушиваемых VPN-сервером портов, переполнения буфера SSL/TLS, DoS-атак и flood-атак, а также вводит дополнительный механизм аутентификации между сервером и клиентом);
    8) генерация файла конфигурации для VPN-сервера, вспомогательных скриптов и файлов со справочной информацией;
    9) копирование всех необходимых сертификатов и файлов конфигурации, необходимы для работы VPN-сервера, в директорию «/etc/openvpn/server».
  • «create_cli_cert_and_conf.sh» — скрипт генерации клиентского набора сертификатов и файла конфигурации.
  • «revoke_client_cert.sh» — скрипт отзыва клиентских сертификатов.
  • «gen_crl_and_restart_ovpn.sh» — скрипт генерации CRL-сертификата (Certificate Revocation List или список отозванных сертификатов), содержащего сведения о всех отозванных клиентских сертификатах (отозванных посредством «revoke_client_cert.sh»). Скрипт необходимо запускать каждый раз после отзыва клиентского сертификата.
  • «get_client_cert_expire_info.sh» — скрипт проверки клиентских сертификатов на предмет устаревания.
  • «get_server_cert_expire_info.sh» — скрипт проверки серверных сертификатов на предмет устаревания.

Файлы и директории, формируемые на этапе полной установки VPN-сервера (full_setup_vpn_server.sh):

  • директория «pki_root/pki» — содержит развёрнутую структуру файлов/директорий для управления ключами easyrsa. Краткое описание файлов/директорий структуры:
    1) certs_by_serial — директория хранения выпущенных сертификатов (в рамках данной структуры pki), ранжированных по серийным номерам;
    2) issued — директория хранения выпущенных сертификатов, ранжированных по имени (CN);
    3) private — директория хранения закрытых ключей (в т.ч. и закрытого ключа корневого сертификата) к соответствующим сертификатам;
    4) renewed — директория хранения обновлённых сертификатов. В рамках «openvpn_helper» не используется.
    5) reqs — директория хранения запросов на выпуск сертификатов.
    6) revoked — директория хранения отозванных запросов/сертификатов/закрытых ключей;
    7) ca.crt — корневой сертификат;
    8) crl.pem — список отозванных сертификатов;
    9) dh.pem — ключ Диффи-Хеллмана;
    10) index.txt — актуальная база данных всех сертификатов в рамках данной структуры управления ключами/сертификатами;
    11) index.txt.attr — содержит параметр «unique_subject = yes», запрещающий создание сертификатов с одинаковыми именами до процедуры отзыва;
    12) index.txt.attr.old — предыдущее значение параметра index.txt.attr;
    13) index.txt.old — предыдущее содержание базы данных сертификатов index.txt. Изменяется, например, после отзыва клиентского сертификата);
    14) openssl-easyrsa.cnf — стандартные для данной структуры параметры с указанием имён переменных, которые возможно переопределить через переменные окружения;
    15) safessl-easyrsa.cnf — содержание аналогично файлу openssl-easyrsa.cnf, но с указанием конкретных значений;
    16) serial — используется для промежуточного хранения серийного номера генерируемого сертификата до момента его подписания. После подписания серийный номер перемещается в файл “serial.old”;
    17) serial.old — содержит серийный номер последнего сгенерированного (и подписанного) сертификата;
    18) ta.key — секретный ключ для реализации tls-аутентификации.
  • «RESTART_OVPN-$VPN_SERVER_NAME_S.sh» (где VPN_SERVER_NAME_S — параметр из vpn.env) — скрипт перезапуска экземпляра OpenVPN, основанного на конфигах и сертификатах, сгенерированных посредством «full_setup_vpn_server.sh» (на основе файла конфигурации «vpn.env», расположенного в текущей директории).
  • «SET-STATIC-IP-FOR-CLIENTS.txt» — заполняется в формате «username,ip-address», если требуется, чтобы клиентам VPN-сервера выдавались статичных ip-адреса. После внесения изменений необходимо запустить скрипт «RESTART»
  • «STOP_OVPN-$VPN_SERVER_NAME_S.sh» (где VPN_SERVER_NAME_S — параметр из vpn.env) — полный останов VPN-сервера.
  • «README_MAIN.txt» — краткая инструкция об использовании VPN-сервера.
  • «README-user-management.txt» — памятка об управлении пользователями. Возможность коннекта к VPN (помимо сертификатов) ограничивается локальными УЗ, созданными на хосте и состоящими в определённой группе пользователей.
  • «readme-firewalld-rules.txt» — памятка о настройке файервола (firewalld).
  • «readme-selinux-rules.txt» — памятка о конфигурации selinux.
  • «SAVED_CERT_PASSWORDS.txt» — сохранённые пароли (от корневого сертификата и сертификата VPN-сервера).

Файлы и директории, формируемые на этапе генерации клиентских сертификатов (create_cli_cert_and_conf.sh):

  • директория «cli_certs» — содержит поддиректории вида «CLIENT_CERT_NAME-files», где расположен набор клиентских конфигов и сертификатов, а также архив для передачи пользователю.

2.2. Директория «run_if_dnsmasq_is_not_installed»

  • Скрипт «run.sh». Простой скрипт, осуществляющий установку сервиса dnsmasq.
  • Файл конфигурации «dnsmasq.conf». Содержит пример конфигурации сервиса без вышестоящих dns-серверов.

Для использования DNS-сервера, установленного на хосте с OpenVPN, необходимо подкорректировать правила firewalld. Рекомендации по настройке смотреть в файле «readme-firewalld-rules.txt» (после развёртывания VPN-сервера).

2.3. Директория «run_if_openvpn_is_not_installed»

Скрипт «run.sh» устанавливает необходимый для работы VPN набор софта: dnf-репозиторий «epel-release», openvpn, easy-rsa.

2.4. Директория «run_if_selinux_enabled»

Директория содержит 2 файла:

  • selinux-модуль «ovpn_mod0.te»;
  • скрипт «run.sh», устанавливающий пакет «selinux-policy» и применяющий selinux-модуль «ovpn_mod0».

2.5. Директория «run_if_zip_is_not_installed»

Скрипт «run.sh» устанавливает zip-архиватор, используемый при создании архивов для передачи конечному пользователю.

2.6. Файл-инструкция «if_need_another_vpnserver_on_this_host.txt»

Документ, кратко описывающий алгоритм развёртывания второго (и последующих) VPN-сервисов на одном и том же хосте.

Алгоритм таков (для примера):
1) создаём директорию, например, «ovpn-server0»;
2) переносим в неё содержание директории «ovpn-server» (исключения: cli_certs, pki_root);
3) редактируем в директории «ovpn-server0» файл «vpn.env», уделяя особое внимание параметрам: VPN_SERVER_NAME_S,
VPN_PORT_S,
VPN_NETWORK_S,
VPN_DHCP_IP_S,
VPN_INTERNAL_NETWORK_ROUTE_S,
VPN_NETWORK_MASQUERADE_SRC_S,
VPN_INTERNAL_NETWORK_MASQUERADE_DST_S,
VPN_INTERNAL_IP_DEV_NAME_S,
VPN_SERVER_INT_FIREWALLD_ZONE_S,
VPN_PORT_CL;
4) из директории «ovpn-server0» запускаем скрипт «full_setup_vpn_server.sh».

2.7. Скрипт «run_first.sh»

Разрешает форвардинг (перенаправление) трафика ipv4, что важно для осуществления доступа из VPN-сети в интранет.

3. Описание основного файла конфигурации vpn.env

Параметры, относящиеся только к генерации сертификатов и конфига (например, «/etc/openvpn/server/server.conf») VPN-сервера (full_setup_vpn_server.sh):

  • VPN_CONF_DIR_S — директория хранения файлов конфигурации OpenVPN. Дефолтное значение — «/etc/openvpn/server».
  • VPN_SERVER_NAME_S — имя VPN-сервера в контексте возможности запуска нескольких экземпляров VPN в зависимости от имени файла конфигурации. Желательно, чтобы этот параметр совпадал с частью (ovpn-XXX) имени директории, где расположен файл «vpn.env»).
  • IP_VPN_SERVER_S — ip-адрес интерфейса, смотрящего в Интернет.
  • VPN_PORT_S — порт интерфейса, смотрящего в Интернет. Должен быть уникален, если в рамках одного хоста настроено более одного VPN-сервера.
  • VPN_SERV_LOG_DIR_S — директория размещения логов VPN-сервера. Значение по умолчанию — /var/log/openvpn.
  • VPN_MAX_CLIENTS_S — максимальное количество клиентов VPN-сервера. В топологии «subnet» при использовании подсети для VPN с маской 24 (или 255.255.255.0) максимально возможное кол-во клиентов равно 83. Значение по умолчанию — 32.
  • VPN_NETWORK_S — описание VPN-сети в формате «SUBNET SUBNET-mask». Значение по умолчанию — «172.16.10.0 255.255.255.0». Должно быть уникальным в случае, если в рамках одного хоста настроено более одного VPN-сервера.
  • VPN_DHCP_IP_S — адрес встроенного DHCP. Значение по умолчанию — 172.16.10.1. Должен быть уникальным в случае, если в рамках одного хоста настроено более одного VPN-сервера.
  • VPN_INTERNAL_NETWORK_ROUTE_S — маршрут до интранета (параметр передаётся клиентам VPN-сервера при подключении), к которой необходим доступ из VPN-сети. Заполнять в соответствии с конкретными параметрами вашей сети.
  • VPN_SERVER_LOG_LEVEL_S — уровень логирования VPN-сервера. Значение по умолчанию — 0.
  • VPN_NETWORK_MASQUERADE_SRC_S — описание подсети VPN-сервера, необходимое при отправке директив фаерволу (firewalld). Должно быть уникальным в случае, если в рамках одного хоста настроено более одного VPN-сервера.
  • VPN_INTERNAL_NETWORK_MASQUERADE_DST_S — описание внутренней подсети, необходимое при отправке директив фаерволу (firewalld).
  • VPN_INTERNAL_IP_DEV_NAME_S — имя интерфейса, смотрящего во внутреннюю сеть.
  • VPN_TUN_DEV_NAME_S — имя интерфейса, используемого при старте VPN-сервера. Должен быть уникальным в случае, если в рамках одного хоста настроено более одного VPN-сервера.
  • VPN_SERVER_INT_FIREWALLD_ZONE_S — зона фаервола, к которой должны принадлежать интерфейсы:
    а) VPN_TUN_DEV_NAME_S;
    б) VPN_INTERNAL_IP_DEV_NAME_S;
    в) интерфейс, являющийся дефолтовым гейтвэем для VPN-сервера.
    Пункт (в) необходим только в том случае, если VPN-сервер предполагается использовать как шлюз по умолчанию для VPN-клиентов.

Параметры, относящиеся только к генерации клиентских сертификатов и конфига (create_cli_cert_and_conf.sh):

  • IP_VPN_SERVER_CL — белый (и статичный) ip-адрес (или доменное имя), к которому необходимо обратиться VPN-клиенту для доступа к интрасети.
  • VPN_PORT_CL — соответствующий порт для параметра IP_VPN_SERVER_CL.
  • VPN_CLI_LOG_DIR_LINUX_CL — директория хранения лог-файлов, если клиент VPN-сервера — это хост с ОС Linux.
  • VPN_CLI_LOG_LEVEL_CL — уровень логирования VPN-клиента.

Параметры EASY-RSA (используются как при генерации сертификатов как для VPN-сервера, так и для клиента):

  • EASY_RSA_DIR_C — место расположения исполняемого файла easyrsa. Дефолтовое значение — /usr/share/easy-rsa/3.
  • EASYRSA_CERT_EXPIRE_EV — время устаревания (в днях) выпущенных сертификатов (в т.ч. и корневого). Дефолтовое значение — 3654 дней (10 лет).
  • EASYRSA_CRL_DAYS_EV – время устаревания (в днях) списка отзыва сертификатов (CRL). Дефолтовое значение — 3654 дней (10 лет).
  • EASYRSA_KEY_SIZE_EV – размер ключа шифрования.
  • EASYRSA_REQ_COUNTRY_EV – страна.
  • EASYRSA_REQ_PROVINCE_EV – область.
  • EASYRSA_REQ_CITY_EV – город.
  • EASYRSA_REQ_ORG_EV – организация.
  • EASYRSA_REQ_OU_EV – подразделение организации.
  • EASYRSA_REQ_CN_EV – имя сервера.
  • EASYRSA_REQ_EMAIL_EV – email-адрес администратора.

4. Заключение

Не смотря на функциональность и гибкость (особенно при наличии оснастки, описанной, например, выше), у OpenVPN есть недостаток (присутствует и у аналогичных решений) — механизм списка отозванных сертификатов (который CRL).

Если удалить клиентский сертификат из директории «issued» (структура управления ключами easyrsa), то его отзыв (посредством команды revoke) при компрометации окажется недоступным, что создаёт вероятность использования такого сертификата злоумышленниками. И в этом случае единственным вариантом обезопасить интранет от посторонних глаз — перевыпуск корневого сертификата, что влечёт за собой необходимость перевыпуска остальных сертификатов.

Логично было бы генерировать не список отозванных сертификатов (CRL), а список актуальных сертификатов (например, Cert Actual List), но, видимо, разработчики OpenVPN (а также Easy-RSA), когда-то решили иначе, что создаёт необходимость очень тщательно следить за всеми выпущенными/отозванными сертификатами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar