*К сожалению, ввиду простоты, протоколы WireGuard и OpenVPN могут быть заблокированы с помощью ТСПУ. В результате блокировок, на некоторых провайдерах данные протоколы могут не работать. При блокировке наблюдается следующая ситуация: UDP-соединения устанавливаются, но никакой трафик не передается. TCP-соединения соединяются и разъединяются через несколько секунд. Можем предложить рассмотреть вариант использования протоколов L2TP или IKEv2/IPSec. Для вашего удобства, у нас уже есть готовые шаблоны на маркетплейсе, имеющие все необходимые для работы настройки.
Когда, защищая свою сеть от несанкционированного доступа, вы подключаете сетевой экран, очень часто приходится решать задачи по обеспечению доступа в вашу защищённую сеть извне, например, с вашего домашнего компьютера или с рабочих станций, находящихся в удалённых сетях. Для реализации такого доступа без необходимости изменения конфигурации брандмауэра и без потерь в обеспечении защищённости ваших ресурсов существует технология 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. Но пойдет ли обычный компьютер для такого дела?