Когда, защищая свою сеть от несанкционированного доступа, вы подключаете сетевой экран, очень часто приходится решать задачи по обеспечению доступа в вашу защищённую сеть извне, например, с вашего домашнего компьютера или с рабочих станций, находящихся в удалённых сетях. Для реализации такого доступа без необходимости изменения конфигурации брандмауэра и без потерь в обеспечении защищённости ваших ресурсов существует технология Virtual Private Network (VPN). При этом бесплатной реализацией VPN является сервис с открытым кодом OpenVPN. Далее о том, как настроить OpenVPN Server на Ubuntu 20.04.
Чтобы это сделать, вы должны иметь два сервера установленной ОС Ubuntu 20.04. Помимо сервера с установленным и настроенным ПО OpenVPN (Сервер VPN), вам понадобится ещё один сервер, на котором будет развёрнут Центр Сертификации (в данном руководстве это будет Сервер ЦС).
Несмотря на то, что и ПО OpenVPN, и ЦС можно установить на один сервер, или даже вынести ЦС на клиентский компьютер, с которого предполагается осуществлять подключение к вашей закрытой сети, официальная документация рекомендует разместить ЦА на отдельном ресурсе из-за угрозы предоставления злоумышленнику доступа к секретному ключу вашего ЦС. Если это произойдёт, он сможет подписывать добытым ключом новые сертификаты, и, таким образом, получит доступ к вашему Серверу VPN. Также, для упрощения настройки VPN, рекомендуется включить аутентификацию пользователей с использованием пароля на каждом из серверов, в случае, если она у вас отключена. Всё дело в том, что при настройке ваших VPS, вы можете столкнуться со сложностями при транспортировке файлов с одного сервера на другой.
Центр сертификации
Установку узла 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.crt
Your-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-rs
a $./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 chown
Your-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 MASQUERADE
COMMIT
# 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.
Как сделать так, чтобы клиентский софт ссылался на домен, не на IP. В случае, если я захочу поменять VPS, я мог бы сделать это не меняя клиентского ключа.
2021-02-16 at 00:05В A записи домена прописываете ваш IP адрес. После этого вы сможете использовать домен в качестве адреса. Для смены IP адреса просто редактируете A запись. Обратите внимание, что после смены A записи обновление DNS кэшей может занимать некоторое время, иногда до суток.
2021-02-16 at 12:31В А-записи у меня прописан адрес сервера. Однако, клиентские ключи все равно содержат ip вместо домена. Как сделать так чтобы вместо ip сертификационный центр автоматически выдавал ключи с доменом и клиентское устройство ссылалось бы на домен, не на ip?
2021-02-16 at 14:31Нужно передавать сертификат с одного сервера на другой с использованием доменного имени. Мы упомянули об этом в аналогичной статье для CentOS Stream: https://ruvds.com/ru/helpcenter/ustanovit-nastroit-openvpn-centos-stream/
2021-03-17 at 16:12$ sudo systemctl -f enable openvpn-server@server.service
$ sudo systemctl start openvpn-server@server.service
Не запускается. Ошибка выдается после второй команды. Подозревая, что в server.conf необходимо указывать полный путь до файлов сертификатов и ключей ca.cer, server.cer, server.key и ta.rey. В статье об этом не сказано. Поправьте, если я ошибаюсь
2021-07-12 at 17:54Вы точно не забыли скопировать файлы server.key, server.crt, ca.crt, ta.key в директорию /etc/openvpn/server? Эти действия указаны в конце каждого из разделов по созданию этих ключей. В этом случае относительные пути должны работать.
2021-07-12 at 18:10Еще бы написали, как развернуть под этим всем адресацию к конкретным IP.
2021-08-16 at 12:22Чтобы, скажем, через VPN шли только определённые IP адреса, остальные через основной трафик.
Цены вам бы не было 🙂
Благодарим вас за отзыв! Подумаем над подобной статьей.
Если вкратце, то вам требуется настроить маршруты на локальной машине, с которой вы подключаетесь к VPN серверу.
После подключения к VPN у вас в системе появляется 2 подключения:
– ваше подключение к интернету
– подключение по VPN
Вам нужно установить маршрут по умолчанию через подключение к интернету, а для определенных адресов установить маршрут через VPN.
Подробная настройка маршрутов – это тема для отдельной статьи. Подскажем лишь, что под Window список маршрутов просматривается командой route print, а под Linux командой ip route.
2021-08-16 at 13:01У меня есть вопрос! Как поставить клиента на паузу/заморозить его чтобы он не мог подключиться, не удаляя его. А потом разморозить чтобы клиент мог дальше пользоваться?
2021-08-24 at 11:47К сожалению, мы не знаем простого ответа на этот вопрос.
Сертификаты поддерживают две операции:
– выпустить
– отозвать
Операция “приостановить” не предусмотрена.
Судя по всему, OpenVPN сервер разрабатывался исходя из этих 2х операций и с прицелом на безопасность. Возможно, приостановка действия сертификата показалась разработчикам небезопасной. Вы можете найти в интернете “обходные” пути, но мы их не проверяли.
2021-08-24 at 12:33Все по инструкции сделал, почти копи-пасте. Но выходит ошибка:
2022-03-30 16:31:19 NOTE: –user option is not implemented on Windows
2022-03-30 16:31:19 NOTE: –group option is not implemented on Windows
Options error: –tls-auth and –tls-crypt are mutually exclusive
Use –help for more information.
Куда копать, где искать?
2022-03-30 at 16:40Если подключение к openVPN серверу успешно, но “внешний” ip на клиенте не меняется, может помочь это в настройках сервера:
push “redirect-gateway local def1”
2022-09-26 at 02:30Спасибо за статью. Такой вопрос. Какой сервер посоветуете купить для узла центра сертификации? Наш парк компьютеров состоит из 15 компьютеров и не так много денег на покупку отдельного компьютера для впн. Сервер-то уже есть. Когда хотели купить просто роутер (микротик), продавец посоветовал купить компьютер и поставить туда Ubuntu. Типа, больше свободы. Но сейчас начальство уже с не сильной охотой будет выделять деньги еще на один комп.
2022-12-01 at 11:13Я понимаю, что это высокая степень безопасности – отдельный сервер сертификации для openvpn. Но пойдет ли обычный компьютер для такого дела?