Экспресс установка OpenVPN на Ubuntu 22.04

OpenVPN – это довольно популярное Ppen Source решение для организации удаленного доступа. Это решение я встречаю довольно часто в своей практике при настройке удаленного подключения к клиентам. Помимо этого, некоторые маршрутизаторы уже из коробки поддерживают возможность настройки OpenVPN для организации удаленного доступа. Я тоже иногда использую OpenVPN для организации временного доступа к облачным стендам (например, в Azure). Причем уже не один раз приходилось организовывать удаленной доступ через OpenVPN. А это уже повод для написания небольшой статьи-шпаргалки о том, как выполняется экспресс установка OpenVPN на Ubuntu 22.04.

Сразу скажу, что я подготовил эту статью, чтобы потом самому на основе её можно было быстро организовать удаленный доступ по OpenVPN. Что-то вроде еще одной краткой шпаргалки. Использовать эту конфигурацию в боевой инфраструктуре я бы вас воздержал. Потому что я использую эту конфигурацию только для предоставления временного удаленного доступа. Для использования в боевой среде нужно, как минимум, разделить сервер OpenVPN и сервер с PKI инфраструктурой для минимизации риска компрометации сертификатов. Вот тут есть исчерпывающее руководство для настройки OpenVPN сервера для использования в производственной среде. Можете использовать, например, его в качестве основы. Я, когда первый раз готовил краткий набор шагов для установки OpenVPN сервера, использовал именно это руководство.

Предварительные требования

Для установки необходимы:

1. Сервер с операционной системой Ubuntu Server 22.04.

2. Исключения в брандмауэре для порта 1194/UDP на сервере из п.1. Если вы изменяли порт, то, соответственно нужно убедиться, что выбранный вами номер порта и протокол доступен на всем пути сетевого оборудования. Например, в Azure я добавлял вот это правило:

3. Публичный IP-адрес, по которому сервер OpenVPN будет доступен в интернете. Детали реализации уже не столь важны. Это может быть отдельный выделенный адрес или же публикация через reverse-proxy.

Установка OpenVPN на Ubuntu 22.04

1. Установка необходимого ПО

Сначала установим необходимое ПО:

1. Обновляем репозитории и запускаем обновление всех пакетов в системе:

sudo apt update
sudo apt upgrade

2. Устанавливаем OpenVPN сервер:

sudo apt install openvpn

3. Устанавливаем easy-rsa:

sudo apt install easy-rsa

4. Создадим директорию для хранения создания более короткой ссылки на директорию easy-rsa:

mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/

5. Установим необходимые разрешения на директорию:

sudo chown $USER ~/easy-rsa
chmod 700 ~/easy-rsa

2. Подготовка необходимой PKI инфраструктуры.

После того, как мы установили нужные пакеты и создали директорию для easy-rsa можно переходить к подготовке PKI-инфраструктуры:

1. Задаем параметры криптографии:

cd ~/easy-rsa
nano vars

2. В файле vars нужно указать следующие строки:

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

3. Теперь инициализируем PKI инфраструктуру на базе esy-rsa:

./easyrsa init-pki

4. Сконфигурируем центр выдачи сертификатов:

./easyrsa build-ca

В процессе настройки нужно будет указать ключевую фразу для CA. Обязательно сохраните её – она вам понадобится.

3. Подготовка сертификата для сервера

После инициализации PKI инфраструктуры я подготовлю сертификаты для сервера OpenVPN. Какие нужно выполнить действия для этого:

1. Создадим запрос на выпуск сертификата:

cd ~/easy-rsa
./easyrsa gen-req $(uname -n) nopass

$(uname -n) – это имя сервера. В моем случае – это имя “SRV-VPN”. Вы можете указать любое имя. Только учитывайте, что это имя нужно будет указать в паре конфигурационных файлов.

2. Закрытый ключ уже готов. Скопируем его в директорию с конфигурацией OpenVPN сервера:

sudo cp ~/easy-rsa/pki/private/$(uname -n).key /etc/openvpn/server/

3. Затем утвердим наш запрос на выпуск нового сертификата:

./easyrsa sign-req server $(uname -n)

4. Теперь скопируем получившийся сертификат с открытым ключом и сертификат нашего центра сертификации в конфигурационную директорию сервера OpenVPN:

sudo cp ~/easy-rsa/pki/issued/$(uname -n).crt /etc/openvpn/server
sudo cp ~/easy-rsa/pki/ca.crt /etc/openvpn/server

5. Сгенерируем общий ключ и скопируем его в директорию с конфигурационными файлами OpenVPN сервера:

cd ~/easy-rsa
openvpn --genkey secret ta.key
sudo cp ta.key /etc/openvpn/server

6. Итого в директории /etc/openvpn/server у вас должно быть четыре файла: файл открытого ключа, файл закрытого ключа, общий ключ и сертификат центра сертификации:

sudo ls /etc/openvpn/server
roman@SRV-VPN:~/easy-rsa$ sudo ls /etc/openvpn/server
SRV-VPN.crt  SRV-VPN.key  ca.crt ta.key
roman@SRV-VPN:~/easy-rsa$ 

4. Подготовка сертификатов и конфигурационных файлов для клиента

Сертификаты для сервера OpenVPN мы подготовили. Теперь подготовим сертификат для клиента:

1. Поскольку клиентских сертификатов может быть много, то будем складировать их в отдельной директории, чтобы их можно было относительно быстро инвентаризировать:

mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs

2. Создадим запрос на выпуск сертификата:

cd ~/easy-rsa
./easyrsa gen-req client001 nopass

3. Закрытый ключ для клиента готов. Его можно сразу скопировать в директорию из п. 1:

cp ~/easy-rsa/pki/private/client001.key ~/client-configs/keys/

4. Утвердим запрос на выпуск сертификата:

./easyrsa sign-req client client001

5. Теперь скопируем все недостающие сертификаты для клиентских подключений и открытый ключ для клиента client001:

cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
cp ~/easy-rsa/pki/issued/client001.crt ~/client-configs/keys/
sudo chown $USER.$USER ~/client-configs/keys/*

6. Теперь я создам директорию для хранения конфигурационных файлов клиентских подключений:

mkdir -p ~/client-configs/files

7. Создадим базовый конфигурационный файл для клиентских подключений:

nano ~/client-configs/base.conf

Текст типового конфигурационного файла для клиентов можно скопировать вот тут:

https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/client.conf

Или из этого файла.

8. В директиве remote я указываю имя сервера OpenVPN, по которому клиенты будут обращаться к нему:

remote hm-srv-vpn.northeurope.cloudapp.azure.com 1194

9. Раскомментируем строки, чтобы указать, что запуск необходимо выполнять в режиме пониженных привилегий:

user nobody
group nogroup

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

;ca ca.crt
;cert client.crt
;key client.key

11. Директиву tls-auth тоже нужно закомментировать:

;tls-auth ta.key 1

12. Затем скорректируем параметры криптографии:

cipher AES-256-GCM
auth SHA256
key-direction 1

13. Создадим скрипт для упрощения генерации конфигурационный файлов клиентов:

nano ~/client-configs/make_config.sh

14. Тело скрипта (скрипт не мой, взял вот отсюда):

#!/bin/bash
 
# First argument: Client identifier
 
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/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

15. Разрешим исполнение скрипта:

chmod 700 ~/client-configs/make_config.sh

Скрипту в качестве параметра нужно будет передававать имя клиента. Выше я указывал имя клиента, как client001.

16. Сгенерируем готовый файл для клиента client001:

cd ~/client-configs
./make_config.sh client001

Файл с параметрами для подключения клиента OpenVPN готов:

ls ~/client-configs/files/

5. Настройка сервера OpenVPN

В предыдущем разделе мы подготовили необходимые сертификаты. Теперь все готово для того, чтобы начать непосредственную настройку сервера OpenVPN.

Я буду использовать конфигурацию сервера OpenVPN с общим ключом (pre-shared key), чтобы отсечь нежелательный трафик от клиентов, которым этот ключ не известен.

Далее для выпуска клиентского сертификата я буду использовать имя client001.

Приступим к настройке сервера OpenVPN:

1. Создадим конфигурационный файл сервера OpenVPN:

sudo nano /etc/openvpn/server/server.conf

2. Типовой пример конфигурационного файла есть вот тут:

https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf

Или типовой конфигурационный файл можно скачать по ссылке ниже:

3. Копируем текст типового конфигурационного файла в файл /etc/openvpn/server/server.conf.

4. Закомментируйте параметр tls-auth и добавить параметр tls-crypt:

;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key

5. Скорректируем параметры криптографии:

;cipher AES-256-CBC
cipher AES-256-GCM
auth SHA256

6. Изменим параметры Diffie-Hellman:

;dh dh2048.pem
dh none

7. Также зададим параметр запуска OpenVPN сервера в режиме минимальных привилегий:

user nobody 
group nogroup

8. Поскольку имена файлов с открытым и закрытым ключом у меня отличаются от стандартных, то их тоже нужно скорректировать:

ca ca.crt
cert SRV-VPN.crt
key SRV-VPN.key  # This file should be kept secret

9. В моей тестовой среде в Microsoft Azure я использую подсеть 10.1.0.0/24. У вас подсеть(и) будет, скорее всего, другая. Соответственно, я добавлю её в объявленных маршрутах для VPN подключения:

push "route 10.1.0.0 255.255.255.0"

Этот параметр особенно вам пригодится, если вы не будите использовать VPN-подключение в качестве шлюза по умолчанию.

6. (по желанию) Настройка маршрута по умолчанию и параметров DNS

Если вы хотели бы использовать подключение на стороне клиентов таким образом, чтобы весь трафик перенаправлялся через OpenVPN сервера, то нужно внести небольшие правки в файл /etc/openvpn/server/server.conf А именно нужно раскомментировать параметр:

push "redirect-gateway def1 bypass-dhcp"

Также можете указать параметры DNS для клиентов OpenVPN:

push "dhcp-option DNS 10.1.0.4"

7. Изменение сетевых параметров

Чтобы сервер OpenVPN мог работать в качестве маршрутизатора нужно скорректировать некоторые сетевые параметры:

1. Разрешим трансляцию сетевых пакетов:

sudo nano /etc/sysctl.conf

2. Раскомментируем вот эту строчку:

net.ipv4.ip_forward=1

3. Также нам потребуется изменение правил цепочек iptables. Для этого я буду использовать ufw. Если он не установлен в вашем дистрибутиве, то установите его:

sudo apt install ufw

4. Узнаем имя интерфейса, который используется у нас по у нас в качестве шлюза во внешний мир:

ip route list default

5. Внесем для этого интерфейса правило натирования сетевого трафика:

sudo nano /etc/ufw/before.rules

6. Добавим вот этот блок конфигурации:

# 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/24 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

7. Также разрешим прием трафика в качестве действия по умолчанию:

sudo nano /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

8. Также я добавлю в исключения ufw порты для ssh и OpenVPN сервера:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

9. Последние изменения по части ufw – это его включение:

sudo ufw disable
sudo ufw enable

10. Перезагружаем сервер.

8. Запуск сервера OpenVPN

Все необходимые настройки на стороне сервера мы выполнили. Теперь можно пробовать запустить сервис:

1. Команда для включения автозапуска сервиса OpenVPN:

sudo systemctl -f enable openvpn-server@server.service

2. Команда для непосредственного запуска сервиса:

sudo systemctl start openvpn-server@server.service

3. Проверим статус сервиса:

sudo systemctl status openvpn-server@server.service
roman@SRV-VPN:~$ sudo systemctl status openvpn-server@server.service
● openvpn-server@server.service - OpenVPN service for server
     Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-03-28 16:32:32 UTC; 27s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 847 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 4699)
     Memory: 3.0M
        CPU: 25ms
     CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
             └─847 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf

Mar 28 16:32:32 SRV-VPN openvpn[847]: Could not determine IPv4/IPv6 protocol. Using AF_INET
Mar 28 16:32:32 SRV-VPN openvpn[847]: Socket Buffers: R=[212992->212992] S=[212992->212992]
Mar 28 16:32:32 SRV-VPN openvpn[847]: UDPv4 link local (bound): [AF_INET][undef]:1194
Mar 28 16:32:32 SRV-VPN openvpn[847]: UDPv4 link remote: [AF_UNSPEC]
Mar 28 16:32:32 SRV-VPN openvpn[847]: GID set to nogroup
Mar 28 16:32:32 SRV-VPN openvpn[847]: UID set to nobody
Mar 28 16:32:32 SRV-VPN openvpn[847]: MULTI: multi_init called, r=256 v=256
Mar 28 16:32:32 SRV-VPN openvpn[847]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Mar 28 16:32:32 SRV-VPN openvpn[847]: IFCONFIG POOL LIST
Mar 28 16:32:32 SRV-VPN openvpn[847]: Initialization Sequence Completed
roman@SRV-VPN:~$ 

Сервис запустился успешно.

Настройка клиентских подключений

Теперь я кратко покажу пример настроек подключения OpenVPN сервера для Linux и Windows систем. К сожалению, чего то с macOS и iOS у меня нет, но, можно найти любое другое руководство в сети.

Пример для Windows 10

Начнем с Windows. Довольно простая последовательность действий:

1. Загружаем дистрибутив OpenVPN клиента вот отсюда.

2. Выполняем установку OpenVPN клиента.

3. Копируем файл настроек клиентского подключения с сервера OpenVPN (~/client-configs/files/client001.ovpn) вот в эту директорию на клиенте:

C:\Program Files\OpenVPN\config

4. Запускаем OpenVPN клиент от имени администратора.

5. В системном трее в контекстном меню OpenVPN клиента выбираем пункт “Connect”. Альтернативный вариант – двойной клик по значку OpenVPN клиента.

6. Пример статуса клиента OpenVPN в случае успешного подключения.

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

Кажется, что долгий путь проведан верно – к серверу OpenVPN подключение установлено успешно. Ресурсы из сети с сервером OpenVPN доступны.

Пример для Linux Mint

Теперь попробуем выполнить настройку подключения через OpenVPN клиента на Linux. Я буду использовать дистрибутив Linux Mint 21. Мне почему то этот дистрибутив понравился больше всех из тех, с чем я пробовал работать.

Я буду выполнять настройку через Network Manager. Приступим:

1. Копируем файл настроек клиентского подключения с сервера OpenVPN (~/client-configs/files/client001.ovpn) в любую директорию на целевой рабочей станции с Linux.

2. В окне настроек сетевых подключений нажимаем на кнопку добавления нового подключения и выбираем пункт “Import from file…”.

3. Выбираем файл с настройками подключения клиента и нажимаем кнопку “Open”.

4. В появившемся диалоговом окне в поле “Name” можете указать любое имя, под которым должно отображаться подключение. По завершению настроек нажмите кнопку “Add”.

5. Попробуем выполнить подключение:

Кажется, что мы все сделали верно и подключение успешно установлено.

6. Теперь проверим – используется ли VPN подключение в качестве шлюза по умолчанию и доступен ли контроллер домена AD в Azure.

Теперь на оба вопроса я могу дать утвердительный ответ. Установка и настройка OpenVPN сервера и клиентского подключения на Linux завершена.

Настройка дополнительных клиентских подключений

В разделе настройки клиента OpenVPN мы сгенерировали только одно подключение – client001. Генерация дополнительных клиентских файлов с настройками подключения выполняется аналогичным образом. Для удобства я вынес этот процесс в кратком виде в отдельный разедл.

В качестве дополнительного подключения клиента я буду использовать имя client002. Для генерации дополнительного файла с клиентскими подключениями нужно выполнить следующие действия:

1. Создадим запрос на выпуск сертификата:

cd ~/easy-rsa
./easyrsa gen-req client002 nopass

2. Закрытый ключ для клиента готов. Его можно сразу скопировать в директорию клиентских файлов:

cp ~/easy-rsa/pki/private/client002.key ~/client-configs/keys/

3. Утвердим запрос на выпуск сертификата:

./easyrsa sign-req client client002

4. Теперь скопируем клиентский сертификат для client002 в директорию со всеми файлами:

cp ~/easy-rsa/pki/issued/client002.crt ~/client-configs/keys/

5. Сгенерируем готовый файл для клиента client001:

cd ~/client-configs
./make_config.sh client002

Файл с параметрами для подключения клиента OpenVPN готов:

ls ~/client-configs/files/

Экспресс установка OpenVPN на Ubuntu 22.04: 8 комментариев

  1. Здравствуйте!
    Всё делал по вашей инструкции, но на пункте 8 openvpn сервер не запустился, поискал в сети, вроде ошибка должна быть в server.conf, но какая – я так и не понял.

  2. Очередная статья “как накостылить с сертификатами”
    Юзайте автоустановщик с официального сайта и не *бите себе мозг

    1. Почти всегда есть более одного способа решения задачи. Все зависит от входных данных и личных предпочтений. Тогда приведите ссылку на руководство от вендора, чтобы другие коллеги были в курсе альтернативных вариантов.

  3. 24.09.2024 – Гайд работает. Самое главное не просто повторять действия за автором а соображать что они делают. Спасибо!

    1. Добрый день! Сегодня как раз сделал стенд по своему же мануала – работает. Как вы верно отметили – есть много настроек, которые специфичны для конкретного окружения. И это нужно учитывать.

  4. Экспресс установкой тут и не пахнет. Есть скрипт в одну строчку который все делает

    1. Приветствую! Всегда есть более одного пути решения. Кто-то использует готовые скрипты (которые экономят время, сам иногда пользую), а кто-то предпочитает немного больше контроля за процессом настройки (или хочет внукнуть в суть). Эта статья минимально достаточный стартовый полигон для второго пути + есть пример настройки клиентских подключений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *