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

1. Введение

Виртуальные частные сети (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»

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

Статичные:

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

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

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

Для использования 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 файла:

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):

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

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

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

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

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

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

Ссылка на репозиторий "openvpn_helper"

@Vladimir_Chursin
11.05.2022 01:23 UTC
Первоисточник

Комментарии

@pupsegadm
10.05.2022 20:46 UTC
+6

С тех пор , как я обленился и открыл для себя Pritunl - забил на ручное поднятие OpenVPN.

НО! хорошая статья. Понимать матчасть и разобраться с openvpn - полезно любому, особенно сейчас.

@saipr
11.05.2022 07:28 UTC
+2

А я в свое время написал GUI для OpenVPN.
А в остальном солидарен с вами.

@pushkarev
10.05.2022 21:08 UTC
+1

OpenVPN ждёт от вас файл с CRL, не важно каким софтом для CA вы пользуетесь (Easy RSA, Microsoft, Hashicorp Vault, EJBCA, etc). Также поступает и другой софт который работает с сертификатами.

@outlingo
10.05.2022 21:41 UTC
+1

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

Вообще некорректно. Есть прекрасная возможность client-config-dir, которая позволяет задекларировать клиент-специфичные опции. Но: если включить требование обязательного наличия конфигурации для клиента в CCD, то можно блокировать клиентов даже без отзыва сертификата. Просто удаляя CCD. Это же позволяет использовать в сочетании с OpenVPN любой CA.

Кроме того, базу сертификатов (как минимум используемую в openssl) можно спокойно исправить в любом текстовом редакторе. Посмотрите структуру файла index - если установить первое поле в значение R (revoked) и в третьем поле установить дату отзыва, то можно спокойно отозвать любой сертификат

@Vladimir_Chursin
10.05.2022 22:13 UTC
0

Т.е. если подредактировать файл index и запустить процедуру генерации CRL, то клиенты с отозванным таким способом сертификатом (после применения CRL к VPN-серверу) не смогут подключиться?

11.05.2022 07:23 UTC
+1

Совершенно верно.

12.05.2022 17:01 UTC
0

Как-нибудь внесу изменения, учитывающие этот факт, в скрипты репозитория.

@darkgerion
16.05.2022 06:50 UTC
+1

Из личного опыта:

1) можно создать в client-config-dir конфиг DEFAULT и пушить всем клиентам одинаковые настройки. Удобно в случае отдельного openvpn для десятков человек с однотипным доступом.

2) Ещё можно указать crl-verify как директорию, в нее класть пустой файл, с условием - имя файла совпадает с серийным номером нужного сертификата в десятичном формате. Наличие такого файла проверяется при каждом подключении клиента, в то время как crl.pem перечитывается раз в час, если память не подводит. Надо разлочить - просто удаляешь нужный файл.

@Vladimir_Chursin
16.05.2022 16:29 UTC
0

Спасибо! Учту!

@igorhak
02.08.2022 15:29 UTC
0

Полезная статья, нужно все-таки понимать как это работает.

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

https://www.cyberciti.biz/faq/ubuntu-20-04-lts-set-up-openvpn-server-in-5-minutes/