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 комментариев
Здравствуйте!
Всё делал по вашей инструкции, но на пункте 8 openvpn сервер не запустился, поискал в сети, вроде ошибка должна быть в server.conf, но какая – я так и не понял.
Добрый день! Можете привести текст ошибки, которая генерируется при запуске?
Очередная статья “как накостылить с сертификатами”
Юзайте автоустановщик с официального сайта и не *бите себе мозг
Почти всегда есть более одного способа решения задачи. Все зависит от входных данных и личных предпочтений. Тогда приведите ссылку на руководство от вендора, чтобы другие коллеги были в курсе альтернативных вариантов.
24.09.2024 – Гайд работает. Самое главное не просто повторять действия за автором а соображать что они делают. Спасибо!
Добрый день! Сегодня как раз сделал стенд по своему же мануала – работает. Как вы верно отметили – есть много настроек, которые специфичны для конкретного окружения. И это нужно учитывать.
Экспресс установкой тут и не пахнет. Есть скрипт в одну строчку который все делает
Приветствую! Всегда есть более одного пути решения. Кто-то использует готовые скрипты (которые экономят время, сам иногда пользую), а кто-то предпочитает немного больше контроля за процессом настройки (или хочет внукнуть в суть). Эта статья минимально достаточный стартовый полигон для второго пути + есть пример настройки клиентских подключений.