OpenVPN сервер на Ubuntu

Как создать OpenVPN сервер у себя дома

OpenVPN сервер на Ubuntu

Центр сертификации

Установку узла 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

Создание директории 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

Здесь необходимо будет ввести парольную фразу, которую впоследствии нужно вводить для получения доступа к вашему ЦС при совершении операций с сертификатами.

Выполнение скрипта easyrsa

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

CN - настройка OpenVPN Server

Файл 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
Импорт запроса сертификата - как настроить OpenVPN 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:/tmp
$ scp 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-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 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:

server.conf при настройке OpenVPN на ОС Ubuntu 20.04

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

server.conf при настройке OpenVPN на Ubuntu 20.04

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

server.conf при настройке OpenVPN на ОС Ubuntu 20.04

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

server.conf при настройке OpenVPN на Ubuntu 20.04

Сохраните изменения в файле, закройте его.

Конфигурация сети на Сервере 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:

Открытый сетевой интерфейс - настройка OpenVPN Server

Теперь откройте /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/ufw/before.rules

Сохраните внесённые изменения и закройте файл.

Откройте файл /etc/default/ufw:

$ sudo nano /etc/default/ufw

В строке DEFAULT_FORWARD_POLICY поменяйте значение DROP на значение ACCEPT:

sudo nano /etc/default/ufw - настройка OpenVPN Server на ОС Ubuntu 20.04

Сохраните изменения в файле и закройте его.

Следующими командами откройте 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

Вывод команды должен выглядеть так:

Запуск службы OpenVPN

Конфигурация клиентов

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

Это будет полезно с точки зрения автоматизации ваших действий при организации доступа для каждого из клиентов.

Создайте структуру директорий, где будут сохраняться файлы:

$ 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.