Центр сертификации
Установку узла VPN следует начать с настройки Сервера ЦС, который будет использоваться исключительно для создания и подписания, а также, для отзыва и выгрузки запросов на сертификаты.
Для начала на Сервере ЦС запустите установку утилиты easy-rsa:
$ sudo apt update
$ sudo apt install easy-rsa
После чего, необходимо создать каталог ~/easy-rsa:
$ mkdir ~/easy-rsa
Создать ссылку:
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
И установить соответствующие права:
$ chmod 700 /home/Your-user/easy-rsa
После чего, запустите на исполнение скрипт easyrsa:
$ cd ~/easy-rsa
$ ./easyrsa init-pki

Таким образом, вы создали директорию “инфраструктуры открытых ключей” (Public Key Infrastructure или сокращённо PKI).
Теперь всё готово для создания Центра Сертификации, а значит, пора переходить к созданию секретного ключа и сертификата. Для этого создайте файл vars. Он должен располагаться в директории ~/easy-rsa. Если вы используете редактор nano, наберите:
$ sudo nano ~/easy-rsa/vars
Скопируйте в этот файл следующий текст:
set_var EASYRSA_REQ_COUNTRY "RUS" set_var EASYRSA_REQ_PROVINCE "Moscow" set_var EASYRSA_REQ_CITY "Moscow City" set_var EASYRSA_REQ_ORG "Our Company Name" set_var EASYRSA_REQ_EMAIL "sysadmin@company.ru" set_var EASYRSA_REQ_OU "LLC" set_var EASYRSA_ALGO "ec" set_var EASYRSA_DIGEST "sha512"
В этих строках необходимо отредактировать значения, которые относятся к вашей закрытой сети, при этом, не оставляйте пустых значений. Перед выходом из файла его нужно сохранить (для этого в nano нажмите Ctrl+X, затем Y и Enter).
Далее, запустите скрипт easyrsa в командной строке:
$ ./easyrsa build-ca
Здесь необходимо будет ввести парольную фразу, которую впоследствии нужно вводить для получения доступа к вашему ЦС при совершении операций с сертификатами.

Также система предложит вам ввести Common Name, которое представляет собой обозначение вашего ЦС. Вы можете ввести любую символьную строку или принять дефолтное имя нажав Enter.

Файл ca.crt – это открытый ключ ЦС. Он будет использоваться клиентами и серверами для проверки при авторизации.
Теперь ваш центр сертификации подготовлен к работе.
OpenVPN и Easy-RSA
На Сервере VPN необходимо запустить установку пакета OpenVPN и утилиты Easy-RSA:
$sudo apt update$sudo apt install openvpn easy-rsa
Далее, необходимо создать каталог ~/easy-rsa:
$ mkdir ~/easy-rsa
Создайте ссылку:
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
И установите соответствующего владельца на эту папку с соответствующими правами:
$sudo chown Your-user ~/easy-rsa$chmod 700 ~/easy-rsa
PKI для OpenVPN
На этом шаге нужно будет создать директорию на Сервере VPN, которая будет использоваться для управления запросами создаваемых сертификатов.
Сначала создайте файл vars в директории ~/easy-rsa, например, с помощью редактора nano:
$ sudo nano ~/easy-rsa/vars
Скопируйте в него следующее:
set_var EASYRSA_ALGO "ec"set_var EASYRSA_DIGEST "sha512"
Сохраните файл и закройте его (в nano для этого нажмите Ctrl+X, затем Y и Enter).
Теперь необходимо создать каталог PKI. Сделайте это при помощи скрипта easyrsa:
$ cd ~/easy-rsa
$ ./easyrsa init-pki
Сертификат и закрытый ключ OpenVPN
Теперь всё необходимое для генерации закрытых ключей и запросов на подписание сертификатов установлено на Сервере VPN.
На этом шаге вы создадите секретный ключ, а также, запрос подписи сертификата. Сначала вам необходимо перейти в директорию ~/easy-rsa. Это нужно сделать на Сервере VPN.
$ cd ~/easy-rsa
Далее запустите easyrsa, где server – CN вашего Сервера VPN (вместо server вы можете использовать любую последовательность символов):
$ ./easyrsa gen-req server nopass
Таким образом, вы создали файл запроса сертификата server.req и секретный ключ.

Этот файл нужно скопировать в /etc/openvpn/server:
$ sudo cp /home/Your-user/easy-rsa/pki/private/server.key /etc/openvpn/server/
Подписание запроса сертификата
На этом этапе необходимо выполнить подписание сертификата server. Сначала скопируйте файл server.req на сервер ЦС для подписания:
$ scp /home/Your-user/easy-rsa/pki/reqs/server.req Your-user@X.X.X.X:/tmp
Здесь, Your-user – имя вашей учётной записи, server – CN вашего Сервера VPN, X.X.X.X – IP-адрес Сервера ЦС.
Далее, подключитесь к вашему Серверу ЦС, переключитесь в папку ~/easy-rsa и запустите импорт запроса server.req при помощи easyrsa:
$cd ~/easy-rsa$./easyrsa import-req /tmp/server.req server

Теперь необходимо запустить подписание запроса при помощи скрипта easyrsa используя опцию sign-req и такой тип запроса как server:
$ ./easyrsa sign-req server server
Для подтверждения надёжности источника запроса наберите Yes, после чего нажмите Enter.
И наконец, файл server.crt, в котором находится открытый ключ шифрования, и файл ca.crt, содержащий собственный доверенный сертификат, скопируйте на Сервер VPN:
$scp pki/issued/server.crt$Your-user@X.X.X.X:/tmpscp pki/ca.crtYour-user@X.X.X.X:/tmp
В данном случае, Your-user – имя вашей учётной записи, server – CN вашего Сервера VPN, X.X.X.X – IP-адрес Сервера VPN.
После чего на Сервере VPN эти файлы скопируйте из /tmp в /etc/openvpn/server:
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Криптография OpenVPN
Чтобы повысить уровень безопасности следует добавить дополнительный секретный ключ для использования сервером и клиентами при помощи OpenVPN tls-crypt. Для создания публичного tls-crypt ключа запустите:
$cd ~/easy-rsa$openvpn --genkey --secret ta.key
Файл ta.key нужно будет скопировать в директорию /etc/openvpn/server/:
$ sudo cp ta.key /etc/openvpn/server
Теперь вы готовы создавать сертификаты клиентов вашего VPN и ключи для подключения к OpenVPN.
Генерация сертификатов и ключей
Здесь вам нужно создать директории для хранения сертификатов клиентов и файлов ключей, а также, назначить им соответствующие права, например:
$mkdir -p ~/clients/keys$chmod -R 700 ~/clients
После чего запустите скрипт easyrsa используя опции gen-req и nopass, а также, с использованием CN клиента:
$cd ~/easy-rsa$./easyrsa gen-req client-1 nopass
И скопируйте client-1.key в ~/clients/keys/:
$ cp pki/private/client-1.key ~/clients/keys/
После чего файл client-1.req скопируйте на Сервер ЦС:
$ scp pki/reqs/client-1.req Your-user@X.X.X.X:/tmp
А на сервере ЦС запустите импорт запроса client-1.req:
$cd ~/easy-rsa $./easyrsa import-req /tmp/client-1.req client-1
Теперь этот запрос необходимо подписать, используя тип запроса client:
$ ./easyrsa sign-req client client-1
Таким образом, вы сгенерировали сертификат клиента client-1.crt. Его необходимо передать на Сервер VPN:
$ scp pki/issued/client-1.crt Your-user@XXX.XXX.XXX.XXX:/tmp
И на Сервере VPN нужно скопировать его в папку ~/clients/keys/:
$ cp /tmp/client-1.crt ~/clients/keys/
Далее, ca.crt и ta.key скопируйте в каталог ~/clients/keys/ с соответствующими правами:
$cp ~/easy-rsa/ta.key ~/clients/keys/$sudo cp /etc/openvpn/server/ca.crt ~/clients/keys/$sudo chownYour-user.Your-user~/clients/keys/*
Настройка OpenVPN
На данном шаге произведите некоторые настройки конфигурации Сервера VPN:
Скопируйте server.conf в директорию OpenVPN:
$sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/$sudo gunzip /etc/openvpn/server/server.conf.gz
Откройте этот файл для редактирования, например, с помощью nano:
$ sudo nano /etc/openvpn/server/server.conf
В разделе HMAC закомментируйте строку tls-auth и после неё вставьте строку tls-crypt ta.key:

Найдите в том же файле строку cipher AES-256-CBC, закомментируйте её и добавьте строки cipher AES-256-GCM и auth SHA256:

Теперь найдите текст либо dh dh2048.pem, либо dh dh.pem и закомментируйте его, так как в вашем случае нет необходимости использовать файл Диффи-Хеллмана. После закомментированной строки вставьте строку dh none:

И для того, чтобы OpenVPN запускался без привилегий, снимите комментарий перед user nobody и group nogroup:

Сохраните изменения в файле, закройте его.
Конфигурация сети на Сервере VPN
Теперь необходимо внести изменения в конфигурацию сети на Сервере VPN для обеспечения правильной маршрутизации трафика. А именно, откройте конфигурационный файл /etc/sysctl.conf:
$ sudo nano /etc/sysctl.conf
После чего добавьте строку:
net.ipv4.ip_forward = 1
Перед закрытием файла сохраните внесённые изменения.
Для применения новой настройки наберите:
$ sudo sysctl -p
Изменение конфигурации сетевого экрана
Далее, вам следует произвести настройки, касающиеся ранее установленного и сконфигурированного интерфейса брандмауэра UFW на Сервере VPN. А именно, нужно разрешить работу OpenVPN через брандмауэр путём включения типа трансляции адресов, который называется маскарадинг. Такая технология позволяет транслировать пакеты клиентов, подставляя адреса отправителей в динамике.
Чтобы определить открытый сетевой интерфейс, используйте команду:
$ ip route list default
Его можно увидеть после параметра dev:
Теперь откройте /etc/ufw/before.rules:
$ sudo nano /etc/ufw/before.rules
В начало файла скопируйте строки:
# START OPENVPN RULES# NAT table rules*nat:POSTROUTING ACCEPT [0:0]# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADECOMMIT# END OPENVPN RULES

Сохраните внесённые изменения и закройте файл.
Откройте файл /etc/default/ufw:
$ sudo nano /etc/default/ufw
В строке DEFAULT_FORWARD_POLICY поменяйте значение DROP на значение ACCEPT:
Сохраните изменения в файле и закройте его.
Следующими командами откройте UDP-трафик на порту 1194 и добавьте в UFW протокол OpenSSH, если вы не сделали этого ранее:
$sudo ufw allow 1194/udp$sudo ufw allow OpenSSH
Перезапустите UFW:
$sudo ufw disable$sudo ufw enable
Запуск OpenVPN
При помощи systemctl произведите запуск службы OpenVPN c включением его в автозагрузку:
$sudo systemctl -f enable openvpn-server@server.service$sudo systemctl start openvpn-server@server.service
Проверьте корректность запуска службы:
$ sudo systemctl status openvpn-server@server.service
Вывод команды должен выглядеть так:

Конфигурация клиентов
На этом шаге вам необходимо создать скрипт, с помощью которого можно будет создавать уникальные файлы клиентов, ключи и сертификаты используя базовую инфраструктуру конфигурации.
Это будет полезно с точки зрения автоматизации ваших действий при организации доступа для каждого из клиентов.
Создайте структуру директорий, где будут сохраняться файлы:
$ mkdir -p ~/clients/files
Скопируйте шаблон клиентской конфигурации в папку clients:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/clients/base.conf
Откройте base.conf:
$ sudo nano ~/clients/base.conf
В строке remote замените порт 1194 на нужный вам, если меняли номер порта, который прослушивает Сервер VPN:
remote X.X.X.X 1194
Должен быть правильно указан протокол:
proto udp
Снимите комментарий со строк:
user nobody
group nogroup
Закомментируйте следующие строки:
;ca ca.crt
;cert client.crt
;key client.key
А строку относящуюся к tls-auth, наоборот, нужно раскомментировать:
tls-auth ta.key 1
Следующие строки должны совпадать с соответствующими строками, прописанными в файле /etc/openvpn/server.conf:
cipher AES-256-GCM
auth SHA256
Добавьте строку:
key-direction 1
Также добавьте строки, которые нужно будет раскомментировать только для Linux-клиентов:
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Плюс ко всему, добавьте строки настроек для клиентов, которые планируют использовать systemd-resolved:
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE
Сохраните изменения в файле, закройте его.
Теперь необходимо создать скрипт make_config.sh. Он создаст базовую клиентскую конфигурацию, которая будет сохранена в директории ~/clients/files:
$ sudo nano ~/clients/make_config.sh
Скрипт должен содержать:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/clients/keys
OUTPUT_DIR=~/clients/files
BASE_CONFIG=~/clients/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn
Сохраните скрипт, закройте его и назначьте ему соответствующие права:
$ chmod 700 ~/clients/make_config.sh
Создание клиента
Итак, вы создали сертификат клиента client-1.crt и файл ключа client-1.key. Теперь можно создать клиентский файл конфигурации. Для это нужно запустить на исполнение скрипт ~/clients/make_config.sh:
$cd ~/clients$./make_config.sh client-1
В результате скрипт создаст файл ~/clients/files/client-1.ovpn.
Такой файл необходимо передать клиенту для установки на устройство, которое он будет использовать для подключения к закрытой сети через Сервер VPN. При этом, на стороне клиента должно быть развёрнуто программное обеспечение OpenVPN, к которому нужно подключить полученнный из ЦС файл с расширением ovpn. Например, если рабочая станция клиента работает под управлением ОС Windows, достаточно с сайта OpenVPN скачать дистрибутив Windows-приложения, установить его и скопировать файл сертификата .ovpn в одну из папок, указанных приложением при первом запуске. Это позволит клиенту осуществлять извне работу с ресурсами, расположенными внутри вашей сети, без изменений в конфигурации сетевого экрана и не понижая при этом уровень защищённости сети.
Следует отметить, что в данном руководстве в качестве сервера ЦС использовалась виртуальная машина, на которой также, как и на сервере OpenVPN, развёрнута ОС Ubuntu 20.04. На самом деле, в качестве сервера ЦС вы можете использовать как и ваш VPS, на котором вы настроили серверный сегмент VPN (что не является хорошим вариантом с точки зрения соблюдения мер информационной безопасности), но и любой компьютер или сервер, находящийся за пределами вашей закрытой сети. Во втором варианте, вам нужно продумать организацию безопасного трансфера файлов ключей и сертификатов между рабочей станцией с настроенным ЦС и сервером VPN.