OpenVPN на Debian 11

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

Первичная настройка Сервера

Добавление нового пользователя

Для начала зайдем на сервер от имени root

su -

Установим утилиту sudo

apt -y install sudo

Добавим пользователя и возможность пользователю работать от имени root, в данном примере имя пользователя будет user

useradd user # Создаем нового ползователя
passwd user # Вводим пароль и подтверждаем его
usermod -aG sudo user # Назначаем его в группу SUDO

Выходим из учетки root и логинимся как someone

Установка базового Firewall

В место стандартного iptables установим UFW firewall

sudo apt update
sudo apt -y upgrade
sudo apt -y install ufw

Фаервол UWF позволяет создавать наборы правил по имени приложений. Посмотреть стандартные имена приложений можно командой:

sudo ufw app list

Если подключены через SSH, рекомендуется разрешить подключение командой:

sudo ufw allow OpenSSH

И только после этого запускать UFW

sudo ufw enable

Согласиться, введя y и убедиться, что подключение доступно

sudo ufw status

В ответ должны получить следующее:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

Установка OpenVPN

Итак, пришло время установки OpenVPN сервиса

sudo apt -y install openvpn

OpenVPN — это VPN с TLS/SSL. Это означает, что она использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов необходимо создать собственный простой центр сертификации (CA). Для этого нужно загрузить последнюю версию EasyRSA, которую мы используем для создания инфраструктуры открытых ключей CA (PKI), актуальную версию можно загрузить из репозитория проекта на GitHub.

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
cd ~
tar xvf EasyRSA-3.0.8.tgz

Настройка переменных EasyRSA и построение CA

Перйдём в каталог EasyRSA:

cd ~/EasyRSA-3.0.8/

В этом каталоге есть файл с именем vars.example. Создадим копию этого файла с именем vars без расширения:

cp vars.example vars

Отредактируем его:

nano vars

Найдём настройки параметров по умолчанию для новых сертификатов. Они будет выглядеть примерно так:

#set_var EASYRSA_REQ_COUNTRY    "US"
#set_var EASYRSA_REQ_PROVINCE   "California"
#set_var EASYRSA_REQ_CITY       "San Francisco"
#set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL      "me@example.net"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

Снимем коментарии и заменим нужными данными:

set_var EASYRSA_REQ_COUNTRY    "RU"
set_var EASYRSA_REQ_PROVINCE   "Moscow"
set_var EASYRSA_REQ_CITY       "Moscow"
set_var EASYRSA_REQ_ORG        "My Company Name"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "IT Departament"

После завершения редактирования сохраним и закроем файл.

В каталоге EasyRSA имеется скрипт easyrsa, который вызывается для выполнения разнообразных задач, связанных с построением и управлением CA. Запустим этот скрипт с опцией init-pki, чтобы запустить инфраструктуру открытых ключей на сервере CA:

./easyrsa init-pki

В ответе увидим:

Note: using Easy-RSA configuration from: /home/someone/EasyRSA-3.0.8/vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/someone/EasyRSA-3.0.8/pki

Затем снова запустиv скрипт easyrsa с опцией build-ca. В результате будет создан центр сертификации и два важных файла, ca.crt и ca.key, представляющие открытую и закрытую части сертификата SSL.

  • ca.crt — файл открытой части сертификата CA, который используется сервером и клиентом OpenVPN, чтобы информировать друг друга о том, что они входят в единую сеть доверия и что между ними отсутствует потенциальный злоумышленник в качестве посредника. В связи с этим, копия файла ca.crt потребуется для вашего сервера и для всех ваших клиентов.
  • ca.key — закрытый ключ CA, используемый для подписания ключей и сертификатов серверов и клиентов. Если злоумышленник получит доступ к CA и файлу ca.key, он сможет подписывать запросы сертификатов и получать доступ к вашей VPN, что нарушит ее безопасность. Поэтому файл ca.key должен храниться только на компьютере CA, и для дополнительной безопасности компьютер CA следует выключать, когда он не используется для подписывания запросов сертификатов.
    Для того, что бы не вводить пароль при каждом взаимодействии с CA, запустим команду build-ca с опцией nopass:
./easyrsa build-ca nopass

После выполнения команды вам будет предложено подтвердить обычное имя CA:

-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
  • Вы можете выбрать любое имя CA, но проще всего нажать ENTER, чтобы принять имя по умолчанию
    Теперь центр сертификации установлен и готов к подписнию запросов сертификатов.

Создание сертификата сервера, ключа и файлов шифрования

Вызовем скрипт easyrsa еще раз и используем опцию gen-req с именем этого компьютера. В нашем случае будем использовать server. Обязательно добавим опцию nopass. Без этого файл запроса будет защищен паролем, что впоследствии может привести к проблемам с разрешениями:

./easyrsa gen-req server nopass

Увидим уже знакомую ситуацию, но имя по умолчанию уже будет server:

-----
Common Name (eg: your user, host, or server name) [server]:

Жмём Enter. В результате будет создан закрытый ключ для сервера и файл запроса сертификата с именем server.req. Скопируем ключ сервера в каталог /etc/openvpn/:

sudo cp ~/EasyRSA-3.0.8/pki/private/server.key /etc/openvpn/

Затем подпишем запрос, запустив скрипт easyrsa с опцией sign-req и указанием типа запроса и обычного имени. Запрос может относиться к типу клиента или сервера, и для запроса сертификата сервера OpenVPN следует использовать запрос типа сервера:

./easyrsa sign-req server server

Нам вам будет предложено убедиться, что запрос поступил из надежного источника. Для подтверждения введите yes и нажмите ENTER:

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = server

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Преместим подписанный сертификат сервера и СА в каталог /etc/openvpn/:

sudo cp pki/issued/server.crt /etc/openvpn/
sudo cp pki/ca.crt /etc/openvpn/

Создадим надежный ключ Диффи-Хеллмана, который будет использоваться при обмене ключами:

./easyrsa gen-dh

Может занять некоторое время. После завершения сгенерируеv подпись HMAC для укрепления возможностей сервера по проверке целостности TLS:

sudo openvpn --genkey --secret ta.key

Скопируем два новых файла в каталог /etc/openvpn/:

sudo cp ~/EasyRSA-3.0.8/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.8/pki/dh.pem /etc/openvpn/

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

Создание сертификата клиента и пары ключей

Для начала создадим в домашнем каталоге структуру каталогов, где будут храниться файлы сертификатов и ключей клиентской системы:

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

Запустим скрипт easyrsa с опциями en-req и nopass, указав имя клиента, в нашем случае, это будет client01:

cd ~/EasyRSA-3.0.8/
./easyrsa gen-req client01 nopass

Нажмите ENTER, чтобы подтвердить имя. Скопируйте файл client01.key в ранее созданный каталог /client-configs/keys/:

cp pki/private/client01.key ~/client-configs/keys/

Затем подпишем запрос, как сделали это для сервера ранее. Однако в этот раз обязательно укажите тип запроса client:

./easyrsa sign-req client client01

В диалоге введите yes, чтобы подтвердить, что вы планируете подписать запрос сертификата, и что он поступил из доверенного источника. В результате будет создан файл клиентского сертификата с именем client01.crt. Переместите этот файл в каталог ~/client-configs/keys/.

sudo cp pki/issued/client01.crt ~/client-configs/keys/

Затем скопируйте файлы ca.crt и ta.key в каталог ~/client-configs/keys/:

sudo cp ~/EasyRSA-3.0.8/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

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

Настройка службы OpenVPN

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

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
sudo nano /etc/openvpn/server.conf

Найдём раздел HMAC, выполнив поиск директивы tls-auth. Комментарии из этой строки должны быть уже удалены, но если строка еще закомментирована, уберите символ «;» в начале строки:

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

Затем найдем раздел криптографических шифров, выполнив поиск строк комментариев с текстом cipher. Шифр AES-256-CBC обеспечивает хороший уровень шифрования и хорошо поддерживается. Комментарии из этой строки должны быть уже удалены, но если строка еще закомментирована, уберите символ «;» в начале строки и добавьте под этой строкой директиву auth, чтобы выбрать алгоритм обработки сообщений HMAC. Для этого хорошо подойдет SHA256:

cipher AES-256-CBC
auth SHA256

Затем найдем строку с директивой dh, которая определяет параметры алгоритма Диффи-Хеллмана. В связи с недавними изменениями EasyRSA имя файла ключа Диффи-Хеллмана может отличаться от указанного в файле образца конфигурации сервера. Изменим указанное здесь имя файла, удалив цифры 2048 для соответствия ключу, сгенерированному на предыдущем шаге:

# dh dh2048.pem
dh dh.pem

Наконец, найдем настройки user и group и удалим «;» из начала каждой строки:

user nobody
group nogroup

Внесенные в файл образца server.conf изменения необходимы для работы OpenVPN.

Настройка конфигурации сети сервера

Чтобы OpenVPN мог правильно перенаправлять трафик через сеть VPN, необходимо изменить некоторые параметры конфигурации сети сервера. Прежде всего нужно изменить параметр IP forwarding, который определяет необходимость перенаправления IP-трафика. Это необходимо для реализации функций VPN, обеспечиваемых сервером.

Для изменения настройки переадресации IP по умолчанию на вашем сервере следует отредактировать файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Найдите в файле строку комментария с параметром net.ipv4.ip_forward. Удалите символ «#» из начала строки, чтобы убрать режим комментария для этой настройки:

net.ipv4.ip_forward=1

Сохранм и закроем файл.
Чтобы прочитать файл и изменить значения для текущей сессии, введем:

sudo sysctl -p

В ответе получим:

net.ipv4.ip_forward = 1

Теперь пришло время настроит UFW брандмауэр, но прежде чем открыть файл конфигурации брандмауэра для добавления правил маскарадинга, нужно предварительно найти публичный сетевой интерфейс компьютера. Для этого введите:

ip route | grep default

Публичный интерфейс компьютера показан в результатах выполнения этой команды после слова «dev». Например, в этом результате показан интерфейс с именем eth0, который выделен ниже:

default via 192.168.0.254 dev eth0

Откроем файл /etc/ufw/before.rules, чтобы добавить соответствующую конфигурацию:

sudo nano /etc/ufw/before.rules

Добавим в начале файла, после строки # ufw-before-forward:

# 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

Затем вам нужно будет указать UFW разрешать перенаправление пакетов по умолчанию. Для этого откройте файл /etc/default/ufw:

sudo nano /etc/default/ufw

Найдите в файле директиву DEFAULT_FORWARD_POLICY и измените значение с DROP на ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Затем измените настройки брандмауэра, чтобы разрешить трафик OpenVPN. Если вы не изменили порт и протокол в файле /etc/openvpn/server.conf, вам нужно будет открыть трафик UDP на порту 1194.

sudo ufw allow 1194/udp

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

sudo ufw disable
sudo ufw enable

Запуск и активация службы OpenVPN

Теперь вы готовы запустить службу OpenVPN на своем сервере. Для этого нужно использовать утилиту systemd systemctl.

Запустите сервер OpenVPN, указав имя файла конфигурации в качестве переменной экземпляра после имени файла systemd. Файл конфигурации вашего сервера имеет имя /etc/openvpn/server.conf, поэтому при его вызове в конец файла нужно добавить @server:

sudo systemctl start openvpn@server

Еще раз убедитесь, что служба успешно запущена, введя следующую команду:

sudo systemctl status openvpn@server

Также вы можете проверить доступность интерфейса OpenVPN tun0 с помощью следующей команды:

ip addr show tun0

В ответе должно быть так:

 tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::c64a:d0f1:9a56:e089/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

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

sudo systemctl enable openvpn@server

Создание инфраструктуры конфигурации клиентских систем

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

Для начала создайте новый каталог для хранения файлов конфигурации клиентов в ранее созданном каталоге client-configs:

mkdir -p ~/client-configs/files

Затем скопируйте файл с образцом конфигурации клиента в каталог client-configs, чтобы использовать его как базовую конфигурацию:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Откройте новый файл в текстовом редакторе:

nano ~/client-configs/base.conf

Найдите в файле директиву remote. Она указывает клиенту адрес сервера OpenVPN, т. е. публичный IP-адрес вашего сервера OpenVPN:

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194

Протокол должен соответствовать значениям, используемым в конфигурации сервера:

proto udp

Уберите режим комментариев для директив user и group, удалив символ «;» из начала каждой строки:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

Найдите директивы, задающие ca, cert и key. Поставьте знак комментария перед строками этих директив, поскольку вы вскоре добавите сертификаты и ключи в сам файл:

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

Также добавьте знак комментария в начале строки директивы tls-auth, поскольку вы добавите ключ ta.key непосредственно из файла конфигурации клиента:

# If a tls-auth key is used on the server
# then every client must also have the key.
#tls-auth ta.key 1

Создайте зеркальное отражение настроек cipher и auth, заданных в файле /etc/openvpn/server.conf:

cipher AES-256-CBC
auth SHA256

Затем добавьте в файл директиву key-direction. Вы должны задать значение «1», чтобы VPN правильно работала на клиентском компьютере:

key-direction 1

В заключение, добавьте несколько строк комментариев. Хотя вы можете включить эти директивы в каждый файл конфигурации клиента, их нужно включать только для клиентов Linux с файлом /etc/openvpn/update-resolv-conf. Этот скрипт использует утилиту resolvconf для обновления данных DNS клиентов Linux.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Сохраните файл и закройте его
Затем создайте простой скрипт, который скомпилирует базовую конфигурацию с соответствующим сертификатом, ключом и файлами шифрования, и поместите сгенерированную конфигурацию в каталог ~/client-configs/files. Откройте новый файл с именем make_config.sh в каталоге ~/client-configs:

nano ~/client-configs/make_config.sh

Добавьте в файл следующий код, заменив user на имя учетной записи пользователя сервера без привилегий root:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/home/user/client-configs/keys
OUTPUT_DIR=/home/user/client-configs/files
BASE_CONFIG=/home/user/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-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Прежде чем продолжить, отметьте этот файл как исполняемый, введя следующую команду:

chmod 700 ~/client-configs/make_config.sh

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

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

Создание конфигураций клиентов

Вы можете сгенерировать файл конфигурации для учетных данных client01, перейдя в каталог ~/client-configs и запустив скрипт, созданный в конце предыдущего шага:

cd ~/client-configs
sudo ./make_config.sh client01

Файл client01.ovpn будет создан в каталоге ~/client-configs/files:

ls ~/client-configs/files

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

Похожие записи