Строим свой VPN. Часть первая

Пролог

Наверняка, многие из читателей этой статьи большую часть жизни VPN представляли себе как нечто, что позволяет пользоваться Facebook и Instagram (их деятельности запрещена на территории нашей страны — Российской Федерации — так как их разработчики признаны экстремистскими организациями) при наличии блокировки со стороны провайдера. Ну, или, на худой конец, для того, чтобы заходить в одноклассники и вконтактик на работе, где доступ к ним прикрыт, а мобильный интернет или не работает, или тупо жалко на него тратиться.

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

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

Мы поздравляем вас с этим! Здесь не будет множества неведомых схем, терминов и прочего. Просто — инструкция по применению.

Постановка задачи

Исходные данные такие.

  1. Есть организация: ООО «Ромашка».
  2. У организации есть домен в интернете: romashka.ru, и им, даже, кто-то управляет. Возможно, даже, на этом домене работает сайт (но к делу это не относится).
  3. Организация занимается оптово-розничной торговлей палочек для мороженого эскимо.
  4. У организации есть офис.
  5. У организации появился (но ещё не открылся) розничный магазин палочек для мороженого.
  6. У организации есть сервер, и на нём, даже, есть .
  7. И офис, и розничный магазин должны работать в одной базе .
  8. На данный момент в открывающемся магазине не подключен проводной интернет. Там есть только LTE-модем. Но стационарный интернет там когда-нибудь обязательно уже вот вот появится.
  9. В офисе установлен роутер TP-Link [на самом деле, сюда можно подставить, в том числе, различные подобные D-Link, Netgear, Xiaomi, Keenetic и т.п.], который очень ценен, потому что у него четыре или пять антенн для Wi-Fi.
  10. Адрес локальной сети офиса: 192.168.0.0/24 (ну, потому что такой был в роутере, чё теперь?).
  11. Адрес локальной сети магазина ещё не выбран. Да и, если честно... а чё, там нужен какой-то другой адрес?
  12. Роутер для магазина ещё уже не куплен. Тоже хороший.

Первым, что предстоит сделать, это выбрать того человека, который наберётся смелости объяснить руководству, что о деньгах, уже потраченных на хороший роутер или роутеры придётся не жалеть, и расстаться с ними. Потребуется приобрести другие роутеры. Какие? Ну, например, если нет желания прям потратиться, то подойдут MikroTik RB951G-2HnD. И, да, приобрести потребуется и в офис, и в магазин.

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

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

Информация об аппаратной поддержке алгоритмов шифрования опубликована на сайте производителя. К примеру, озвученная выше модель роутера вообще отсутствует в этой сравнительной таблице, что даёт основания полагать об аппаратной поддержке лишь устаревших md5 и sha1, а это повлечёт за собой очень высокую нагрузку на процессор. А вот, например, hEX S уже значительно лучше, но не идеален.

Далее, нужно будет собрать всю волю в кулак, чтобы сменить адрес сети. Очень плохо давать сетям широкораспространенные адреса, к которым относятся, прежде всего, 192.168.0.0/24 и 192.168.1.0/24. Впрочем, и многие последующие тоже очень популярны. Да, это повлечёт за собой много работы по перенастройке конечных устройств, но иного пути не будет. Конечно, вы можете сейчас просто обойтись тем, что в «новом магазине» просто сразу выберете другой адрес сети. Но а потом что? Что сделаете, когда к вашему VPN потребуется подключить кого-то, у кого локальная сеть тоже 192.168.0.0/24?

Спросите, кто бы это мог быть и в какой ситуации? Легко! Выбирайте: дом директора организации, любой сотрудник, решивший всерьез поработать на удалёнке, ваша домашняя сеть. Представьте, как будет «хорошо», если VPN-клиенту нужно подключаться к серверу , у которого IP 192.168.0.3, а в локальной сети VPN-клиента этот же IP присвоен... видеорегистратору. Куда в итоге подключится такой VPN-клиент?

Оборудование для построения VPN

Наш «лабораторный» VPN для статьи мы построим между двумя роутерами MikroTik: RB951G-2HnD и CHR — Cloud Hosted Router — виртуальной машиной с RouterOS от MikroTik. Да, если ты, читатель, не знал, вполне себе рабочий роутер можно вообще на виртуальной машине развернуть.

Роль роутера офиса у нас сыграет аппаратное устройство, а роль роутера в магазине отведена виртуальной машине.

Локальные сети

Адрес локальной сети для офиса мы выбрали такой: 10.1.1.0/24. У роутера в локальной сети будет IP 10.1.1.254. Для магазина мы выбрали адрес локальной сети такой: 10.1.2.0/24, где IP роутера будет 10.1.2.254.

Схема нашего VPN

Что за VPN у нас будет? Мы выбрали одну из рекомендованных MikroTik схем построения. И попробуем объяснить простыми словами, что же в такой схеме происходит.

  1. Между двумя конечными точками через публичные IP-адреса устанавливается шифрованное соединение по протоколу IPSec.
  2. Внутри этого соединения — IPSec-туннеля — оба роутера имеют собственные статические IP-адреса (вообще любые, но в пределах одного адресного пространства).
  3. Поверх установленного IPSec-туннеля мы создадим другой — GRE-туннель, трафик внутри которого шифровать уже не будем, так как он у нас и без этого зашифрован внутри IPSec
  4. Трафик от локальной сети офиса в локальную сеть магазина и обратно будем направлять именно в GRE-туннель.
  5. Способ аутентификации устройств для установки IPSec-соединения выбираем по сертификатам.

Что же нам даёт выбранная схема VPN?

  • статический IP-адрес требуется только на одном устройстве. В нашем случае это будет роутер офиса;
  • без соответствующего сертификата никто другой установить IPSec-соединение с нашим роутером не сможет;
  • GRE-туннель, через который мы будем передавать коммерчески важную информацию, будет работать только после установки IPSec-соединения между роутерами, то есть просто так данные никуда переданы не будут, а в случае перехвата придётся постараться, чтобы их расшифровать;
  • для того, чтобы перекрыть кому-то доступ к такому VPN, нам достаточно отозвать сертификат VPN-клиента;
  • никаких паролей, логинов, общих ключей доступа или иных данных для подтверждения подлиности подключаемого клиента не требуется;
  • к такому типу VPNIKEv2 — в будущем можно подключать любой тип устройств: рабочие станции Windows, смартфоны на iOS и Android, любой Linux

Кто-то может сказать, что аутентифкация клиентов и сервера по сертификатам это излишне сложный способ работы VPN. Тут комментировать — только портить. Такой читатель статью дальше может не читать. Для остальных же хотим пояснить подробнее. Для выпуска и отзыва сертификатов мы используем собственную двухуровневую PKI-инфраструктуру (не благодарите) на базе OpenSSL, управление которой осуществляется из командной строки самой обычной Ubuntu Server 22.04.

В упомнятой PKI-инфраструктуре мы имеем:

  • корневой центр сертификации, который выпускает и подписывает сертификат для самого себя;
  • промежуточный центр сертификации, сертификат которого выпускает и подписывает корневой центр сертификации;
  • клиентские сертификаты и сертификаты подчиненных промежуточному центров сертификации, которые выпускает и подписывает наш промежуточный центр сертификации.
Конечно же, роутеры MikroTik способны самостоятельно выполнять роль центра сертификации, выпускать и подписывать как сертификаты для самого себя, так и для клиентов. И если вам кажется, что управлять сертификатами VPN для сервера и клиентов через терминал Linux это слишком сложно, и управление такой инфраструктурой из MikroTik кажется вам чем-то более логичным или простым, мы не настаиваем. Просто помните одно: при восстановлении из резервной копии, при сбросе конфигурации роутера информация обо всех сертификатах будет утрачена. Поэтому, если уж вам хочется управлять всем этим через MikroTik, рекомендуем, всё же, воспользоваться собственной PKI-инфраструктурой, в которой необходимо выпустить сертификат для подчиненного центра сертификации — роутера MikroTik.

Сети и адреса сетей для работы VPN

Для работы нашего VPN мы в итоге будем использовать следующие сети.

  • сеть для IKEv2 IPSec-туннеля: 192.168.99.0/24 — каждый роутер, каждое устройство после успешной установки шифрованного соединения будет иметь уникальный IP-адрес из этой сети;
  • сеть для GRE-туннелей поверх установленного IPSec-туннеля: 172.16.0.xx/30 — подробности ниже;
  • локальная сеть офиса: 10.1.1.0/24;
  • локальная сеть магазина: 10.1.2.0/24.

Чтобы избежать ситуаций, в которых наш GRE-трафик будет «гулять» там, где ему не следует, чтобы изолировать одних VPN-клиентов от других, мы установим чёткие рамки для таких туннелей. К примеру, для VPN между магазином и офисом выделяем сеть 172.16.0.0/30, где роутер офиса получит IP-адрес 172.16.0.1, а магазин — 172.16.0.2. Если потребуется подключить в идентичный VPN ещё и какой-нибудь гипотетический склад, для него можно выделить сеть 172.16.0.4/30, где у офиса будет IP-адрес 172.16.0.5, а у склада — 172.16.0.6. Таким вот образом трафик одного VPN-клиента будет изолирован от трафика другого. А из-за специфики самого GRE-туннеля, с учетом того, что он у нас подымается не между публичными IP, а между адресами внутри IPSec-туннеля, для каждого из клиентов он будет работать только в случае успешного IPSec-соединения.

Можно переходить к первоначальной настройке роутеров.

Первоначальная настройка роутеров

Перед нами два девственно чистых роутера: RB951G-2HnD и CHR с одинаковыми версиями RouterOS — 7.19.3. Оба они работают внутри локальной сети 10.15.17.0/24, и каждый из них считает, что эта сеть уже и есть интернет.

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

Если использовать нашу PKI-инфраструктуру, процедура много времени не займет. Она достаточно проста, и разделить её можно на следующие основные этапы.

  1. Инициализация PKI-инфраструктуры.
  2. Выпуск сертификата корневого центра сертификации.
  3. Выпуск сертификата промежуточного центра сертификации.
  4. Выпуск сертификата VPN-сервера.
  5. Выпуск сертификата VPN-клиента.
  6. Импорт на роутер офиса сертификата VPN-сервера из файла-контейнера .p12 — это позволит сразу уже импортировать и закрытый ключ сертификата, и всю цепочку сертификатов.
  7. Импорт на роутер офиса сертификата VPN-клиента (магазина) — исключительно из файла открытого ключа (.crt)
  8. Импорт на роутер магазина сертификата VPN-клиента из файла-контейнера .p12 — это позволит сразу уже импортировать и закрытый ключ сертификата, и всю цепочку сертификатов.
  9. Импорт на роутер магазина сертификата VPN-сервера (офиса) — исключительно из файла открытого ключа (.crt).

Никогда без особой на то необходимости не передавайте, не перемещайте файлы закрытых ключей или сертификаты в формате PKCS#12 куда-либо ещё кроме источника, который предполагает использование сертификата. Даже если ваш контейнер или закрытый ключ сертификата защищены паролем, лучше этого не делать без особой необходимости. Скомпрометированный таким образом сертификат — угроза несанкционированной авторизации на вашем VPN-сервере.

Сертификат самого VPN-сервера, промежуточного и корневого центров сертификации передавать только в виде файлов открытых (публичных) ключей (.crt).

Выпуск необходимых сертификатов

# Сначала инициализируем новую PKI-инфраструктуру
/opt/openssl/scripts/init_pki.sh

Весь дальнейший интерактивный ввод и вывод в терминал скрыт под спойлером. Кому любопытно, смотрите.


    === Инициализация PKI инфраструктуры ===
Этот скрипт настроит параметры для вашей PKI инфраструктуры.
Все настройки будут сохранены в конфигурационных файлах.


1. Основные данные для создания инфраструктуры
Укажите путь на диске для основного рабочего каталога вашей PKI-инфраструктуры [/opt/openssl]:
Внимание: Обнаружены защищенные файлы системы контроля версий:
 - .git
 - .gitignore
 - README.md
Эти файлы не будут изменены.
Базовое доменное имя для выпуска сертификатов ЦС [example.ru]: romashka.ru
Наименование вашей компании: Romashka ltd
Страна [RU]:
Регион / область: Rostovskaya obl.
Город / населенный пункт: Taganrog
Наименование подразделения [IT Department]:
Адрес электронной почты (для сертификатов корневого и промежуточного ЦС): admin@romashka.ru
Срок действия сертификата корневого ЦС, лет [30]:
Срок действия сертификата промежуточного ЦС [15]:

2. Подключение типов клиентских сертификатов
Отметьте типы клиентских сертификатов, которые вы будете выпускать (y/yes/n/no):
1) Сертификаты подчиненных промежуточному ЦС центров сертификации? [n]: y
2) Сертификаты центра сертификации Active Directory? [n]: y
3) Сертификаты долгосрочных сервисов и служб (Trassir, Proxmox, TrueNAS и т.п.)? [n]: y
4) Сертификаты веб-сайтов? [n]: y
5) Сертификаты почтовых серверов и служб (Postfix, Dovecot, Zimbra и т.п.)? [n]: y
6) Сертификаты VPN-сервера для подключения и авторизации VPN-клиентов? [n]: y
Автоматически включена поддержка клиентских VPN-сертификатов.

3. Адреса и ссылки для работы инфраструктуры
Если у вас будут узлы распространения списков отзыва, укажите URL, или нажмите Enter для перехода к следующему вопросу: http://pki.romashka.ru/crl/
Добавить еще один URL для списков отзыва (или Enter чтобы продолжить):
Использовать этот(эти же) URL для указания адресов узлов точек распространения сертификатов? (y/yes/n/no) [y]: n
Укажите URL для узлов распространения сертификатов (или Enter чтобы пропустить): http://pki.romashka.ru/certs/
Добавить еще один URL для распространения сертификатов (или Enter чтобы продолжить):
Выгружать ли списки отзыва автоматически после их генерации по FTP? (y/yes/n/no) [n]: y
Адрес FTP-хоста: ftp.romashka.ru
Номер порта (по умолчанию 21): 
Удаленный путь для выгрузки: /www
Имя пользователя (будет сохранено в конфигурации): ftp_user
Пароль (будет сохранено в конфигурации):
Настройки FTP сохранены.
При отзыве сертификата формировать автоматически актуальный список отзыва? (y/yes/n/no) [y]: y
Хотите осуществить импорт уже существующих файлов аналогичной двухуровневой PKI-инфраструктуры? (y/n) [n]: n

PKI инфраструктура успешно инициализирована!
Конфигурация сохранена в /opt/openssl/pki_config.cfg

=== Дополнительные действия ===
Хотите сразу выпустить сертификаты корневого и промежуточного ЦС? (y/yes/n/no) [n]: y
Создание конфигурации для корневого ЦС...
Конфигурационный файл корневого ЦС успешно создан: /opt/openssl/root-ca-ssl/openssl.cnf
Создание конфигурации для промежуточного ЦС...
Конфигурационный файл промежуточного ЦС успешно создан: /opt/openssl/intermediate-ca-ssl/openssl.cnf
Запуск создания корневого ЦС...
Генерация приватного ключа корневого ЦС...
Введите пароль для закрытого ключа корневого ЦС:
Генерация сертификата корневого ЦС...
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name [Rostovskaya obl.]:
Locality Name [Taganrog]:
Organization Name [Romashka ltd]:
Organizational Unit Name [IT Department]:
Email Address [admin@romashka.ru]:
Common Name [Romashka ltd Root CA]:
Информация о созданном сертификате:
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            72:56:c3:2b:0b:bb:0a:40:ae:f3:cd:ef:9c:80:51:a3:54:66:b8:af
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, emailAddress=admin@romashka.ru, CN=Romashka ltd Root CA
        Validity
            Not Before: Jul 13 13:02:15 2025 GMT
            Not After : Jul  6 13:02:15 2055 GMT
        Subject: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, emailAddress=admin@romashka.ru, CN=Romashka ltd Root CA
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:a0:d7:0e:0c:c2:28:f9:46:e7:6e:53:86:58:4b:
                    ff:2b:ea:0c:58:08:13:54:f8:af:8d:9a:ee:d4:f3:
                    69:a3:f8:98:2a:57:81:5a:a9:0b:84:21:7e:7d:0e:
                    b2:51:0f:0b:d2:6b:e5:26:9b:24:24:8f:2a:3c:a9:
                    6d:e4:b1:e9:43:fd:8a:e1:22:53:36:c6:e9:d5:7e:
                    83:9f:8a:39:ef:d0:fc:0c:a5:2b:84:0b:d3:52:93:
                    02:46:9c:1f:e5:91:5b:58:5a:9c:59:35:80:ab:23:
                    01:38:f5:27:28:f2:5b:3d:85:16:e4:63:5c:db:62:
                    88:a2:69:6d:af:c2:1e:d7:f2:05:f0:91:3c:7c:17:
                    9e:70:a3:97:2f:d9:d3:1e:43:b1:7f:2e:10:53:1c:
                    53:05:e4:41:22:48:75:0b:fd:c3:20:1e:29:2c:70:
                    81:48:66:79:80:bf:d3:49:f7:19:7d:e9:44:a2:67:
                    67:6d:fc:29:a0:c5:1b:43:cc:10:89:e8:ee:95:19:
                    26:7d:9f:e1:8f:73:72:e3:a2:f5:3c:0d:d6:90:4c:
                    99:72:88:d9:bd:19:28:86:95:36:af:58:1f:7f:4f:
                    7b:74:c3:a2:e6:4f:08:1e:4b:ab:6b:72:e3:fb:9e:
                    3a:0a:dc:a8:a5:e6:f5:2c:a0:db:37:9c:2a:39:a8:
                    5c:c9:30:1c:6c:cc:fd:46:ad:1e:7e:03:59:c6:4c:
                    21:df:87:e8:be:51:1c:ae:12:35:a4:11:d4:07:20:
                    4c:90:f5:2f:b0:0e:c4:62:72:2e:66:f9:5e:33:e7:
                    b9:7c:5a:50:fb:9a:e7:dd:d5:a1:68:ad:d5:67:04:
                    c1:a1:da:61:cf:83:3f:43:7c:fc:7e:c7:7a:ae:ec:
                    4d:83:31:1f:a7:79:f5:2c:70:ee:53:2f:ab:11:73:
                    84:5a:05:cc:9b:64:69:ec:b5:e2:90:b9:d1:34:cc:
                    58:30:ad:99:3f:77:f0:53:3d:28:6d:b9:ca:b1:64:
                    12:c9:52:4d:87:69:ff:cc:f4:86:1d:69:27:6b:7e:
                    ec:af:0f:b8:c0:2b:ae:d4:d1:d7:6c:b7:a4:7b:c3:
                    af:6e:66:d8:ef:5f:e7:06:7e:2a:d6:f6:ec:6f:91:
                    cf:ba:83:b0:a3:50:05:8d:fc:3a:6a:2d:19:5d:09:
                    f9:3e:43:c4:dc:b3:39:a7:c8:a2:d3:51:36:e7:e6:
                    e5:cc:1c:eb:65:af:14:86:b4:12:04:89:a8:f8:c3:
                    be:f9:a4:e5:42:bb:bf:06:33:10:e0:12:c7:12:dd:
                    96:81:ed:16:91:72:45:9c:ab:48:41:29:37:e9:98:
                    f8:ab:31:07:58:19:c6:5c:1e:b6:dd:f8:fc:22:23:
                    81:ed:bf
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                C7:C2:6D:12:D3:03:38:E9:6F:3E:90:64:A1:B3:28:99:E7:27:87:61
            X509v3 Authority Key Identifier:
                C7:C2:6D:12:D3:03:38:E9:6F:3E:90:64:A1:B3:28:99:E7:27:87:61
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.romashka.ru/crl/root-ca.romashka.ru.crl
            Authority Information Access:
                CA Issuers - URI:http://pki.romashka.ru/certs/root-ca.romashka.ru.crt
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        86:82:a0:6a:ff:3b:4b:03:28:83:c7:4a:4d:94:46:64:f0:b6:
        d7:cf:69:02:eb:f1:5c:5a:58:9c:7d:6f:a2:8f:c6:a8:f9:00:
        91:3a:2f:a5:51:87:ba:0f:cf:11:ad:d2:de:86:96:b0:d7:e1:
        15:ce:b7:c0:93:c4:19:9a:e2:91:ab:53:00:8c:d4:68:58:3a:
        02:2c:fe:9d:9d:09:cd:87:ce:12:45:8c:f6:b7:42:00:f6:0f:
        b4:93:e1:89:03:39:a2:2f:6d:0d:db:64:58:f5:2a:b2:7b:1f:
        33:5a:58:82:f2:a9:f6:3c:b2:4a:cd:0c:d2:5c:80:35:04:dd:
        05:ca:e2:21:12:91:7e:b4:74:92:0a:52:a3:6d:aa:dc:cc:f8:
        3b:09:a4:dd:2e:7f:4c:53:fb:4f:22:45:b1:8d:b4:86:a2:18:
        91:4d:b5:f3:f1:10:d9:a1:e9:cd:f6:b7:1b:7b:bb:50:25:b8:
        9f:bb:cc:49:de:c2:3e:db:6b:56:f0:cd:68:f8:a1:d9:64:d0:
        20:f8:d5:ca:64:51:da:22:19:69:14:dc:61:6d:7f:48:17:40:
        7b:9e:40:04:cf:a5:da:ef:cc:d1:fd:f3:95:92:3a:b9:62:6b:
        7c:3e:b9:2d:b9:84:57:a0:81:3f:50:d1:df:ac:d8:17:68:32:
        21:8a:b9:3d:7d:f2:13:cf:d2:24:9f:1b:22:34:b2:d3:ac:26:
        43:cb:d8:8b:ea:4f:b5:1b:dc:f5:61:65:f9:c8:f1:ea:05:eb:
        17:7d:39:33:ab:d8:72:eb:9a:7a:8c:7f:28:f7:25:5e:1e:8a:
        e2:c3:46:b9:3b:3d:ed:d9:7a:46:18:88:30:49:7a:b9:20:98:
        2b:57:ce:1b:38:96:01:58:aa:e6:47:ea:39:ff:aa:ef:00:10:
        fc:8b:e0:7c:ee:9f:cd:38:a5:54:a1:ad:d6:1c:67:81:06:98:
        e2:d6:ac:20:f6:7b:5a:a7:ab:7f:16:06:f1:5b:94:c2:08:6c:
        af:aa:91:68:0b:7f:a4:09:1a:69:90:13:13:d8:d9:d7:a1:a3:
        94:0b:32:58:b3:70:4d:4b:14:19:01:9a:d7:a2:78:7c:c7:9a:
        c5:5a:71:c8:0f:f8:a9:c9:e1:8b:66:24:79:30:59:f2:08:dc:
        47:4b:44:b2:69:79:9f:e3:e3:c9:62:af:5d:8e:68:75:ab:49:
        14:34:10:f1:32:49:b4:58:0d:c4:9a:0a:41:bd:9d:21:67:46:
        5b:87:3e:b4:51:cd:80:3f:b1:c8:42:09:e2:58:3f:32:37:7b:
        71:f0:2f:ee:24:5b:10:86:52:6a:8e:26:01:4c:cb:95:c4:12:
        6d:d8:02:15:4d:66:08:62
Корневой ЦС успешно создан!
Файлы:
Приватный ключ: /opt/openssl/root-ca-ssl/private/root-ca.romashka.ru.key
Сертификат: /opt/openssl/root-ca-ssl/certs/root-ca.romashka.ru.crt
Файл с паролем: /opt/openssl/root-ca-ssl/private/root-ca.romashka.ru.passphrase.txt

Запуск создания промежуточного ЦС...
Создание структуры каталогов промежуточного ЦС...
Генерация приватного ключа промежуточного ЦС...
Введите пароль для закрытого ключа промежуточного ЦС:
Создание CSR для промежуточного ЦС...
Регион/Область [Rostovskaya obl.]:
Город/Населенный пункт [Taganrog]:
Название компании [Romashka ltd]:
Подразделение [IT Department]:
Email [admin@romashka.ru]:
Common Name (например, Romashka ltd Intermediate CA):
Подписание сертификата промежуточного ЦС...
Using configuration from /opt/openssl/root-ca-ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            22:ae:a3:53:2f:be:d9:0a:2f:d8:e3:34:75:25:e0:26:ea:07:36:c8
        Validity
            Not Before: Jul 13 13:03:34 2025 GMT
            Not After : Jul  9 13:03:34 2040 GMT
        Subject:
            countryName               = RU
            stateOrProvinceName       = Rostovskaya obl.
            localityName              = Taganrog
            organizationName          = Romashka ltd
            organizationalUnitName    = IT Department
            commonName                = Romashka ltd Intermediate CA
            emailAddress              = admin@romashka.ru
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                8D:53:1F:B2:FE:76:E2:45:4F:4D:E9:35:44:76:D6:D0:5D:20:0A:23
            X509v3 Authority Key Identifier:
                C7:C2:6D:12:D3:03:38:E9:6F:3E:90:64:A1:B3:28:99:E7:27:87:61
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.romashka.ru/crl/intermediate-ca.romashka.ru.crl
            Authority Information Access:
                CA Issuers - URI:http://pki.romashka.ru/certs/intermediate-ca.romashka.ru.crt
Certificate is to be certified until Jul  9 13:03:34 2040 GMT (5475 days)

Write out database with 1 new entries
Database updated
Проверка сертификата:
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            22:ae:a3:53:2f:be:d9:0a:2f:d8:e3:34:75:25:e0:26:ea:07:36:c8
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, emailAddress=admin@romashka.ru, CN=Romashka ltd Root CA
        Validity
            Not Before: Jul 13 13:03:34 2025 GMT
            Not After : Jul  9 13:03:34 2040 GMT
        Subject: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, CN=Romashka ltd Intermediate CA, emailAddress=admin@romashka.ru
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:a0:a5:4a:5b:c8:08:a8:ed:f8:f7:55:f9:13:bd:
                    4f:fd:5a:39:9e:97:76:f9:5a:04:3c:5c:0e:69:11:
                    f2:9f:b0:ee:b6:fa:43:18:35:99:85:e9:f7:b9:ee:
                    94:42:43:b5:6d:90:b8:69:0b:67:88:42:be:a3:e3:
                    f5:9c:70:75:b1:e4:e5:90:0e:19:a8:bc:a3:20:fd:
                    7d:83:d7:59:54:97:bd:62:26:6f:21:99:a4:d1:0f:
                    5a:af:c5:87:2e:57:31:29:5b:c7:26:99:c3:1e:95:
                    de:30:5d:1d:42:54:27:1f:0a:9c:b7:65:10:69:b6:
                    22:9e:6b:5d:4e:e5:b3:4a:3d:4e:4e:bc:44:fe:0e:
                    72:94:5a:ea:7a:cf:d5:53:7f:0c:a7:ba:ec:0c:d0:
                    24:71:63:c8:ff:29:48:12:bd:4f:17:49:60:59:28:
                    cd:8f:92:03:38:57:39:c2:fa:17:87:c8:cc:e9:f8:
                    db:18:5f:39:d0:6c:be:64:20:3d:9e:ad:99:33:9e:
                    05:84:13:82:18:e0:c2:74:88:46:b6:2b:d7:9d:3d:
                    81:7c:80:25:ff:94:ab:80:57:54:11:80:d3:30:c5:
                    63:62:a2:06:f7:19:36:5f:25:d7:f4:6f:f9:fd:b2:
                    28:9f:0d:7c:90:d1:31:b0:5c:9e:21:f4:5d:4b:56:
                    f0:79:75:e8:fe:7a:c4:7a:7a:f2:1c:45:46:26:1a:
                    30:bb:01:a1:ba:a1:a1:f1:07:3a:fe:96:61:d9:5d:
                    60:94:b4:7e:00:ef:8d:45:4f:83:37:f7:5b:21:ce:
                    08:e0:7f:a6:14:30:c3:3b:13:27:b9:5e:2c:c7:cc:
                    db:c7:c8:e0:94:19:2d:7e:a1:88:c4:33:7c:35:a1:
                    bd:17:f1:2b:2a:3e:63:c5:04:7b:f9:76:07:cb:fa:
                    94:03:4f:47:db:28:85:41:9c:96:39:9b:18:bd:e1:
                    d4:6c:69:59:fb:d4:47:ee:dc:42:5b:43:f5:d4:37:
                    42:7f:1e:ee:a7:33:5f:e7:11:31:63:15:3a:90:8f:
                    49:c7:1d:e6:e7:f7:a0:25:89:0a:56:b0:85:c5:4e:
                    7d:df:ef:c2:a8:bd:9a:70:91:18:95:40:b7:1b:c6:
                    ec:25:71:8c:4f:c4:14:a2:48:97:ab:26:2e:36:ef:
                    26:ba:9b:b0:46:83:0f:74:13:81:6b:c0:99:c6:07:
                    72:d2:d6:d4:4d:43:a8:fb:6a:69:f7:71:43:94:20:
                    57:1e:e1:78:34:33:58:a8:b5:82:3f:fd:a1:22:0d:
                    6b:dc:3e:7d:7b:a3:54:ab:58:56:ee:a0:04:c4:c2:
                    93:a8:9d:09:5d:af:87:d6:89:f8:32:cf:bc:d9:72:
                    33:23:87
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                8D:53:1F:B2:FE:76:E2:45:4F:4D:E9:35:44:76:D6:D0:5D:20:0A:23
            X509v3 Authority Key Identifier:
                C7:C2:6D:12:D3:03:38:E9:6F:3E:90:64:A1:B3:28:99:E7:27:87:61
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://pki.romashka.ru/crl/intermediate-ca.romashka.ru.crl
            Authority Information Access:
                CA Issuers - URI:http://pki.romashka.ru/certs/intermediate-ca.romashka.ru.crt
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        53:a7:34:2b:95:b7:11:86:7f:cc:ac:b7:5a:e7:a3:52:d1:96:
        2f:39:bb:91:d1:bf:44:bd:f7:a1:e8:87:46:5e:4d:68:5f:11:
        05:bc:3a:fa:77:1d:24:cd:57:20:51:6f:4e:31:b3:b4:22:a6:
        f1:0c:4f:68:5e:8e:e7:69:ec:f4:47:7e:03:ae:a2:8d:04:a8:
        d1:68:18:db:3c:7b:64:d3:77:d0:7f:a6:7c:a6:b5:4c:ed:cd:
        c8:27:f2:d5:07:91:de:e2:e7:b4:6c:02:ae:6e:e0:d5:89:d0:
        ee:30:8f:6b:62:3d:77:8c:8e:5b:3a:af:85:36:ab:a0:82:f9:
        72:e5:5e:46:98:7a:f1:78:08:fd:3b:19:28:20:09:69:31:1b:
        ba:83:9b:35:0b:c6:1d:c1:98:c3:0b:ac:14:bf:39:2d:0c:3d:
        d3:c7:a5:88:fb:f2:a0:b2:41:a3:9b:ec:00:88:bb:1a:fa:13:
        5b:b2:ed:2d:8f:56:be:23:4c:9b:84:fa:86:1a:96:c8:4d:8d:
        bc:48:e7:12:b5:41:01:02:31:02:86:ff:3d:0b:cc:a6:00:2c:
        0d:61:7a:78:84:33:99:b8:fb:ac:d1:6e:70:b5:be:b4:f7:d4:
        e0:c7:30:64:a6:89:21:91:84:8d:78:a5:11:a1:ba:7c:84:6d:
        be:d3:c2:62:a9:39:be:43:5a:aa:f5:61:5f:82:19:e2:7e:0c:
        0c:f4:0a:3c:66:cc:8f:a9:fd:14:39:ff:f6:d1:42:01:40:a0:
        3e:68:45:93:e6:1f:b5:c9:86:a5:be:08:ae:00:aa:52:65:c9:
        57:15:45:0e:13:40:a6:7e:7f:0d:3d:34:5d:1e:09:42:d6:4c:
        d8:e0:ac:e4:d8:db:18:3e:8c:24:5f:ce:a1:7b:91:60:38:62:
        42:40:d1:8e:2c:ee:6f:eb:f9:64:0e:b6:0d:8e:f9:d9:90:fb:
        d3:75:0e:18:56:1b:4c:5c:e3:c1:a1:4e:0f:85:19:fe:7c:e2:
        6a:9b:c9:5d:19:80:1c:2f:89:ff:0e:d0:42:0f:2f:54:f2:5d:
        6e:92:9c:2a:5e:2d:18:ef:b8:26:e7:ed:6d:06:1a:9a:8e:c8:
        d1:96:aa:ef:80:ba:d8:a6:18:67:80:3f:45:7e:f5:c7:27:28:
        59:ff:d8:cc:4d:77:2d:10:83:16:18:3f:4e:86:9e:2d:ed:fb:
        28:a7:a8:3b:59:d1:a3:e1:a1:7d:a2:87:c6:99:f6:c0:1a:14:
        9c:20:d9:bb:06:bc:46:1e:b9:03:b5:cd:ac:27:d6:ec:20:2f:
        e4:bb:d4:0c:c5:6e:02:94:0b:85:a5:67:62:b9:59:0f:96:4e:
        d7:39:90:54:ea:4e:02:8f

Промежуточный ЦС успешно создан!
Файлы:
Приватный ключ: /opt/openssl/intermediate-ca-ssl/private/intermediate-ca.romashka.ru.key
Сертификат: /opt/openssl/intermediate-ca-ssl/certs/intermediate-ca.romashka.ru.crt
Цепочка сертификатов: /opt/openssl/intermediate-ca-ssl/certs/intermediate-ca.romashka.ru-chain.crt
Файл с паролем: /opt/openssl/intermediate-ca-ssl/private/intermediate-ca.romashka.ru.passphrase.txt
Хотите инициализировать конфигурации для клиентских сертификатов? (y/yes/n/no) [y]: y
Инициализация конфигураций для клиентских сертификатов...
Создание конфигурации для подчиненных промежуточных ЦС...
Создание конфигурации для веб-сайтов...
Создание конфигурации для почтовых серверов...
Создание конфигурации для VPN...
Создание конфигурации для Active Directory...
Создание конфигурации для сервисных сертификатов...
Конфигурационные файлы для клиентских сертификатов успешно созданы в /opt/openssl/intermediate-ca-ssl/client_configs

=== Инструкции для дальнейших действий ===
1. Сертификаты ЦС успешно созданы:
   - Корневой ЦС: /opt/openssl/root-ca-ssl/certs/root-ca.romashka.ru.crt
   - Промежуточный ЦС: /opt/openssl/intermediate-ca-ssl/certs/intermediate-ca.romashka.ru.crt

2. Для выпуска подчиненных ЦС используйте:
   /opt/openssl/scripts/issue_client_cert.sh с конфигурацией sub_ca.cnf

3. Для выпуска сертификатов Active Directory:
   /opt/openssl/scripts/issue_client_cert.sh с конфигурацией ad_cert.cnf

4. Для управления сертификатами используйте:
   - Отзыв сертификатов: /opt/openssl/scripts/revoke_root_ca_cert.sh
   - Генерация CRL: /opt/openssl/scripts/generate_root_ca_crl.sh

Инициализация PKI завершена успешно!

Скрипт инициализации PKI-инфраструктуры сразу же создал сертификаты корневого и промежуточного центров сертификации. Нам остаётся лищь выпустить сертификаты VPN-сервера и VPN-клиента. Приступим.

# Выпускаем сертификат для VPN-сервера
/opt/openssl/scripts/issue_vpn_cert.sh

=== Выпуск VPN сертификата ===
1) Серверный
2) Клиентский
3) Отмена
Выберите тип сертификата: 1
1) Введите основное DNS-имя сервера (без пробелов): vpn.romashka.ru
##### Создаем поле Common Name сертификата #####

2) Укажите дополнительные SAN (оставьте пустым, чтобы пропустить)

DNS-имена для SAN (через пробел): gw.romashka.ru
IP-адреса для SAN (через пробел): 10.15.17.100
Email-адреса для SAN (через пробел): admin@romashka.ru
3) Наименование организации [Romashka ltd]:
4) Подразделение [IT Department]:
5) Укажите срок действия (в днях или годах, например: 365, 2y, 1y): 3y
6) Пароль закрытого ключа (оставьте пустым, если не нужен):

Генерация закрытого ключа...
1) RSA (2048)
2) ECC (secp384r1)
Выберите тип ключа: 1
Генерация RSA-ключа 2048 бит...
Создание запроса на подпись (CSR)...
Подписание сертификата...

Проверка Subject Alternative Names:
            X509v3 Subject Alternative Name:
                DNS:vpn.romashka.ru, DNS:gw.romashka.ru, IP Address:10.15.17.100, email:admin@romashka.ru
SAN успешно добавлены в сертификат
Создание цепочки сертификатов...
Создание PKCS12 архива...
Введите пароль для PKCS12-архива (минимум 8 символов):
Повторите пароль:
Введите пароль для PKCS12-контейнера:

Создаем Android-совместимый контейнер PKCS#12...
Введите пароль для PKCS12-архива (минимум 8 символов):
Повторите пароль:
Введите пароль для совместимого PKCS12-контейнера:

Сохранение сертификата...

Архив успешно создан:
  /opt/openssl/intermediate-ca-ssl/certs/vpn_server_certs/vpn.romashka.ru-20250713/vpn.romashka.ru.tar.gz
-rw-r--r--. 1 root root 25K Jul 13 16:16 /opt/openssl/intermediate-ca-ssl/certs/vpn_server_certs/vpn.romashka.ru-20250713/vpn.romashka.ru.tar.gz

=== Сертификат успешно создан ===
Файлы в каталоге: /opt/openssl/intermediate-ca-ssl/certs/vpn_server_certs/vpn.romashka.ru-20250713
total 72K
-rw-r--r--. 1 root root 8.8K Jul 13 16:16 vpn.romashka.ru-android.p12
-rw-r--r--. 1 root root 7.3K Jul 13 16:16 vpn.romashka.ru-chain.crt
-rw-r--r--. 1 root root 2.5K Jul 13 16:16 vpn.romashka.ru.crt
-rw-r--r--. 1 root root 1.1K Jul 13 16:16 vpn.romashka.ru.csr
-rw-r--r--. 1 root root 1.7K Jul 13 16:16 vpn.romashka.ru.key
-rw-r--r--. 1 root root 8.9K Jul 13 16:16 vpn.romashka.ru.p12
-rw-r--r--. 1 root root  25K Jul 13 16:16 vpn.romashka.ru.tar.gz

Архив:
  /opt/openssl/intermediate-ca-ssl/certs/vpn_server_certs/vpn.romashka.ru-20250713/vpn.romashka.ru.tar.gz
  Размер: 28K

Детали сертификата:
        Issuer: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, CN=Romashka ltd Intermediate CA, emailAddress=admin@romashka.ru
            Not Before: Jul 13 13:15:47 2025 GMT
            Not After : Jul 12 13:15:47 2028 GMT
        Subject: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, CN=vpn.romashka.ru
                DNS:vpn.romashka.ru, DNS:gw.romashka.ru, IP Address:10.15.17.100, email:admin@romashka.ru

Остаётся выпустить сертификат VPN-клиента — роутера для готовящегося к открытию магазина. Это делает тот же самый скрипт.

# Выпускаем сертификат VPN-клиента
/opt/openssl/scripts/issue_vpn_cert.sh


=== Выпуск VPN сертификата ===
1) Серверный
2) Клиентский
3) Отмена
Выберите тип сертификата: 2
1) Введите основное имя сертификата (без пробелов): store.vpn.romashka.ru
Описание клиента (Поле Common Name): Romashka ltd Taganrog Store VPN Client Certificate
2) Укажите дополнительные SAN (оставьте пустым, чтобы пропустить)

DNS-имена для SAN (через пробел): store.vpn.romashka.ru
IP-адреса для SAN (через пробел):
Email-адреса для SAN (через пробел): store@romashka.ru
3) Наименование организации [Romashka ltd]:
4) Подразделение [IT Department]:
5) Укажите срок действия (в днях или годах, например: 365, 2y, 1y): 1y
6) Пароль закрытого ключа (оставьте пустым, если не нужен):

Генерация закрытого ключа...
1) RSA (2048)
2) ECC (secp384r1)
Выберите тип ключа: 1
Генерация RSA-ключа 2048 бит...
Создание запроса на подпись (CSR)...
Подписание сертификата...

Проверка Subject Alternative Names:
            X509v3 Subject Alternative Name:
                DNS:store.vpn.romashka.ru, email:store@romashka.ru
SAN успешно добавлены в сертификат
Создание цепочки сертификатов...
Создание PKCS12 архива...
Введите пароль для PKCS12-архива (минимум 8 символов):
Повторите пароль:
Введите пароль для PKCS12-контейнера:

Создаем Android-совместимый контейнер PKCS#12...
Введите пароль для PKCS12-архива (минимум 8 символов):
Повторите пароль:
Введите пароль для совместимого PKCS12-контейнера:

Сохранение сертификата...

Архив успешно создан:
  /opt/openssl/intermediate-ca-ssl/certs/vpn_client_certs/store.vpn.romashka.ru-20250713/store.vpn.romashka.ru.tar.gz
-rw-r--r--. 1 root root 26K Jul 13 16:18 /opt/openssl/intermediate-ca-ssl/certs/vpn_client_certs/store.vpn.romashka.ru-20250713/store.vpn.romashka.ru.tar.gz

=== Сертификат успешно создан ===
Файлы в каталоге: /opt/openssl/intermediate-ca-ssl/certs/vpn_client_certs/store.vpn.romashka.ru-20250713
total 72K
-rw-r--r--. 1 root root 8.8K Jul 13 16:18 store.vpn.romashka.ru-android.p12
-rw-r--r--. 1 root root 7.3K Jul 13 16:18 store.vpn.romashka.ru-chain.crt
-rw-r--r--. 1 root root 2.5K Jul 13 16:18 store.vpn.romashka.ru.crt
-rw-r--r--. 1 root root 1.1K Jul 13 16:18 store.vpn.romashka.ru.csr
-rw-r--r--. 1 root root 1.7K Jul 13 16:18 store.vpn.romashka.ru.key
-rw-r--r--. 1 root root 8.9K Jul 13 16:18 store.vpn.romashka.ru.p12
-rw-r--r--. 1 root root  26K Jul 13 16:18 store.vpn.romashka.ru.tar.gz

Архив:
  /opt/openssl/intermediate-ca-ssl/certs/vpn_client_certs/store.vpn.romashka.ru-20250713/store.vpn.romashka.ru.tar.gz
  Размер: 28K

Детали сертификата:
        Issuer: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, CN=Romashka ltd Intermediate CA, emailAddress=admin@romashka.ru
            Not Before: Jul 13 13:18:11 2025 GMT
            Not After : Jul 13 13:18:11 2026 GMT
        Subject: C=RU, ST=Rostovskaya obl., L=Taganrog, O=Romashka ltd, OU=IT Department, CN=Romashka ltd Taganrog Store VPN Client Certificate
                DNS:store.vpn.romashka.ru, email:store@romashka.ru

Данная статья не охватывает теоретический материал об инфраструктурах открытых ключей (PKI), необходимость изучения работы и принципов применения такой инфраструктруы выходит за рамки обсуждаемой задачи, и целиком и полностью ложится в зону ответственности читателя.

Импорт сертификатов в роутеры

Итак, у нас теперь есть сертификаты, открытые ключи которых должны быть на каждом устройстве, которое подключается к VPN-серверу:

  • корневого центра сертификации;
  • промежуточного центра сертификации;
  • VPN-сервера.

Сертификат VPN-сервера на роутер офиса необходимо будет импортировать вместе с закрытым ключом. Для этого у нас имеется контейнер .p12. На этот роутер сертифифат для магазина должен быть импортирован только из открытого ключа (файла .crt).

На роутер магазина мы должны кроме перечисленного выше импортировать сертификат VPN-клиента из файла .p12.

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

Сначала подключаемся к роутеру офиса, там открываем меню Files, и просто мышкой перетягиваем в корневой каталог следующие файлы:

  • vpn.romashka.ru.p12;
  • store.vpn.romashka.ru.crt.

Закрываем окно Files, открываем меню SystemCertificates. И далее делаем так, как отображено на скриншотах.

На роутере магазина проводим аналогичные действия, с той лишь разницей, что из файла .p12 мы импортируем сертификат VPN-клиента, а сертификат VPN-сервера импортируем из файла .crt. В итоге мы должны получить примерно следующее.

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

Сертификаты мы подготовили, в роутеры их импортировали. Нам остаётся лишь реализовать задуманное, и убедиться в том, что оно работает.

Сайт принадлежит ООО Группа Ралтэк. 2014 — 2025 гг