Как настроить OpenVPN на Debian 11. Часть 1
Когда вы настраиваете удалённый доступ, важно не только предоставить всем сотрудникам подключение к нужным сервисам, но и позаботиться о безопасности. В этом помогает VPN — виртуальная частная сеть. VPN‑сервер действует как единая точка входа: он аутентифицирует пользователей и создаёт зашифрованный туннель между их устройствами и частной сетью. А ещё он считается более гибким решением, чем, например, SSH Jump Server.
Вы можете использовать платный VPN или создать и администрировать собственный. В этой статье разбираем, как настроить OpenVPN на Debian 11.
Вам понадобится
два сервера Debian 11: один — для размещения OpenVPN, второй — для центра сертификации (Certificate Authority или CA);
пользователь с привилегиями sudo на обоих серверах;
Easy‑RSA на обоих серверах (это утилита, которую мы будем использовать для управления сертификатами VPN).
Хотя технически можно запустить CA с вашего OpenVPN‑сервера или локального компьютера, безопаснее хранить CA на отдельном сервере, который не подключен к интернету постоянно. Так у злоумышленников меньше шансов получить доступ к закрытому ключу и использовать его для подписания новых сертификатов.
Также обращаем внимание, что если вы отключите аутентификацию по паролю при настройке серверов, в дальнейшем можете столкнуться с трудностями при передаче файлов между ними. Чтобы решить эту проблему, вы можете повторно включить аутентификацию по паролю на каждом сервере. Или в качестве альтернативы — сгенерировать пару SSH‑ключей для каждого сервера, а затем добавить открытый SSH‑ключ OpenVPN‑сервера в файл authorized_keys и наоборот. Здесь подробнее о том, как настроить SSH‑ключи в Debian 11 для любого из этих решений.
Шаг 1: установка OpenVPN
Для начала обновите индекс пакета VPN‑сервера и установите OpenVPN. OpenVPN доступен в репозиториях Debian по умолчанию, поэтому вы можете использовать apt
для установки:
sudo apt update
sudo apt install openvpn
Поскольку мы уже установили Easy‑RSA на оба сервера в качестве предварительного условия и инициализировали CA, мы готовы сгенерировать сертификат VPN‑сервера.
Шаг 2: создание сертификата сервера, ключа и файлов шифрования
На сервере OpenVPN перейдите в каталог /easy-rsa
и запустите сценарий easyrsa
с параметром gen-req
, за которым идёт общее имя компьютера. Хорошо, если вы сделаете это описательно. В рамках этой статьи общее имя OpenVPN‑сервера — «server». Не забудьте включить опцию nopass
. В противном случае файл запроса будет защищен паролем, что впоследствии приведёт к проблемам с правами доступа:
Примечание: если выберете имя, отличное от «server», вам придётся изменить некоторые из приведенных ниже инструкций. Например, при копировании сгенерированных файлов в каталог /etc/openvpn
придётся заменить имена. Позже также придётся изменить файл /etc/openvpn/server.conf
, чтобы указать правильные .crt
и .key
.
cd ~/easyrsa
./easyrsa gen-req server nopass
Скрипт предложит ввести общее имя, которое вы хотите отобразить в запросе на подписание сертификата (CSR). По умолчанию в нём будет отображаться любое имя, которое вы передали в ./easyrsa gen-req
. Введите ENTER
, чтобы принять имя по умолчанию, или укажите другое.
Это создаст закрытый ключ для сервера и файл запроса сертификата с именем server.req
. Скопируйте ключ сервера в каталог /etc/openvpn/
:
sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/
Используя безопасный метод (например, SCP), перенесите файл server.req
на свою машину CA:
scp ~/easy-rsa/pki/reqs/server.req sammy@your_CA_ip:/tmp
Затем на машине CA перейдите в каталог ~/easy-rsa
:
cd ~/easy-rsa
Используя скрипт easyrsa
, импортируйте файл server.req
, следуя пути к файлу с общим именем, которое вы ввели при создании CSR:
./easyrsa import-req /tmp/server.req server
Затем подпишите запрос, запустив параметр easyrsa
с помощью sign-req
. Тип запроса может быть либо client
, либо server
. Для запроса сертификата OpenVPN-сервера обязательно используйте тип запроса server
:
./easyrsa sign-req server server
В выходных данных вам предложат подтвердить, что запрос исходит из надёжного источника. Введите yes
и нажмите ENTER
, чтобы подтвердить это:
Если вы зашифровали ключ CA, следуя перечисленным в начале статьи инструкциям, на этом этапе вам будет предложено ввести пароль.
Далее нужно передать подписанный сертификат обратно на VPN-сервер с помощью безопасного метода:
scp pki/issued/server.crt sammy@your_server_ip:/tmp
Также нужно перенести на VPN-сервер файл ca.crt
:
scp pki/ca.crt sammy@your_server_ip:/tmp
ca.crt
нужен, чтобы OpenVPN знал, что может доверять сущности, подписавшей server.crt.
Затем на OpenVPN-сервере скопируйте файлы server.crt
и ca.crt
в каталог /etc/openvpn/
:
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/
Перейдите в каталог ~/easy-rsa
:
cd ~/easy-rsa
Оттуда создайте надёжный ключ Diffie-Hellman, набрав:
./easyrsa gen-dh
Это может занять несколько минут. Далее сгенерируйте подпись HMAC, чтобы усилить возможности проверки TLS-сервера:
sudo openvpn --genkey secret ta.key
Когда команда завершится, скопируйте два новых файла в каталог /etc/openvpn/
:
sudo cp ~/easy-rsa/ta.key /etc/openvpn/
sudo cp ~/easy-rsa/pki/dh.pem /etc/openvpn/
Все файлы сертификатов и ключей, необходимые серверу, сгенерированы. Теперь можем переходить к созданию сертификатов и ключей, которые клиентский компьютер будет использовать для доступа к OpenVPN-серверу.
Шаг 3: генерация клиентского сертификата и пары ключей
Вы можете сгенерировать закрытый ключ и запрос сертификата на клиентской машине, а затем отправить его в CA для подписи, но в этой статье разберём процесс генерации запроса сертификата на VPN-сервере. Преимущество данного способа в том, что мы можем создать серверный скрипт, который автоматически сгенерирует файлы конфигурации клиента, содержащие все необходимые ключи, сертификаты и параметры в одном файле.
На этом шаге сначала сгенерируем пару клиентского ключа и сертификата. Если у вас более одного клиента, можете повторить этот процесс для каждого из них. Но, обратите внимание, что вам нужно будет передать скрипту уникальное значение имени для каждого клиента. На протяжении всей статьи первая пара сертификат/ключ упоминается как client1
.
На VPN-сервере начните с создания структуры каталогов в домашнем каталоге для хранения клиентского сертификата и файлов ключей:
mkdir -p ~/client-configs/keys
Поскольку вы будете хранить пары сертификатов/ключей ваших клиентов и файлы конфигурации в этом каталоге, следует заблокировать его разрешения в качестве меры безопасности:
chmod -R 700 ~/client-configs
Затем нужно вернуться в каталог ~/easy-rsa
и запустить скрипт easyrsa
с параметрами gen-req
и nopass
, а также общим именем для клиента:
cd ~/easy-rsa
./easyrsa gen-req client1 nopass
Нажмите ENTER
, чтобы подтвердить общее имя. Затем скопируйте файл client1.key
в каталог /client-configs/keys/
, который создали ранее:
cp pki/private/client1.key ~/client-configs/keys/
Перенесите файл client1.req
на машину CA, используя безопасный метод:
scp pki/reqs/client1.req sammy@your_CA_ip:/tmp
На машине CA перейдите в каталог ~/easy-rsa
и импортируйте запрос сертификата:
cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1
Затем подпишите запрос, как делали это на предыдущем шаге. Но на этот раз обязательно укажите тип запроса client
:
./easyrsa sign-req client client1
В командной строке введите yes
, чтобы подтвердить, что вы готовы подписать запрос на сертификат и что он поступил из надёжного источника:
Если вы зашифровали свой ключ CA, вам будет снова предложено ввести пароль.
Это создаст файл сертификата клиента с именем client1.crt
. Перенесите этот файл обратно на сервер:
scp pki/issued/client1.crt sammy@your_server_ip:/tmp
На OpenVPN-сервере скопируйте сертификат клиента в каталог /client-configs/keys/
:
cp /tmp/client1.crt ~/client-configs/keys/
Файлы ca.crt
и ta.key
также скопируйте в каталог /client-configs/keys/
:
sudo cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
Все сертификаты и ключи сгенерированы и хранятся в соответствующих каталогах. Есть ещё несколько действий, которые необходимо выполнить с этими файлами, но они появятся в следующих шагах. А пока перейдём к настройке OpenVPN на сервере.
Шаг 4: настройка 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
. Эта строка уже должна быть раскомментирована, но если это не так, то удалите «;»:
Далее найдите раздел о криптографических шифрах, выполнив поиск закомментированных строк шифра. Шифр AES-256-CBC
предлагает хороший уровень шифрования и хорошо поддерживается. Опять же, эта строка уже должна быть раскомментирована, но если это не так, просто удалите «;»:
Добавьте директиву auth
для выбора алгоритма обработки сообщений HMAC. Неплохой выбор — SHA256
:
Найдите строку, содержащую директиву dh
, которая определяет параметры Diffie-Hellman. Из-за изменений, внесенных в Easy-RSA, имя файла для ключа Diffie-Hellmanможет отличаться от того, что указано в примере файла конфигурации сервер. При необходимости измените указанное здесь имя файла, удалив 2048
, чтобы оно соответствовало ключу, сгенерированному на предыдущем шаге:
Наконец, найдите настройки user
и group
и удалите «;» в начале каждого, чтобы раскомментировать строки:
Изменения, которые вы внесли в образец файла server.conf
до этого момента, необходимы для работы OpenVPN. Изменения, описанные ниже, являются необязательными, хотя они также необходимы для многих распространенных случаев использования.
Отправка изменений DNS для перенаправления трафика через VPN (необязательно)
Приведенные выше настройки создадут VPN-соединение между двумя машинами, но не заставят их использовать туннель. Чтобы применить VPN для маршрутизации всего трафика, нужно передать настройки DNS на клиентские компьютеры.
В файле server.conf
есть несколько директив, которые нужно изменить, чтобы включить эту функциональность. Найдите раздел redirect-gateway
и удалите точку с запятой «;» из начала строки redirect-gateway
:
Найдите раздел dhcp-option
. Снова уберите «;» перед обеими строками, чтобы раскомментировать их:
Это поможет клиентам перенастроить конфигурацию DNS, чтобы использовать VPN-туннель в качестве шлюза по умолчанию.
Настройка порта и протокола
По умолчанию сервер OpenVPN использует порт 1194
и протокол UDP для приема клиентских подключений. Если вам нужно использовать другой порт из-за ограниченных сетевых сред, вы можете изменить параметр port
. Если вы не размещаете веб-контент на сервере OpenVPN, порт 443
— оптимальный выбор, поскольку обычно он разрешён правилами брандмауэра.
Часто протокол также ограничен этим портом. Если это так, измените proto
с UDP на TCP:
Если вы все-таки переключите протокол на TCP, нужно изменить значение директивы explicit-exit-notify
с 1
на 0
, поскольку эта директива используется только UDP. Невыполнение этого требования при использовании TCP приведёт к ошибкам при запуске службы OpenVPN:
Если у вас нет необходимости использовать другой порт и протокол, лучше всего оставить эти настройки по умолчанию.
Учетные данные не по умолчанию
Если во время команды ./easyrsa gen-req
вы выбрали другое имя для сертификата сервера на шаге 2, измените строки cert
и key
, чтобы они указывали на соответствующие файлы .crt
и .key
. Если вы использовали имя по умолчанию, оно уже задано правильно:
Когда закончите, сохраните и закройте файл.
Шаг 5: настройка сетевой конфигурации сервера
Есть некоторые аспекты сетевой конфигурации сервера, которые нужно настроить, чтобы OpenVPN мог правильно направлять трафик через VPN. Первым из них является IP-переадресация — метод определения, куда следует направлять IP-трафик.
Настройте параметры переадресации IP вашего сервера по умолчанию, изменив файл /etc/sysctl.conf
:
sudo nano /etc/sysctl.conf
Внутри найдите строку с комментариями, которая устанавливает net.ipv4.ip_forward
. Удалите символ «#» из начала строки, чтобы раскомментировать этот параметр:
Сохраните и закройте файл, когда закончите.
Чтобы прочитать файл и скорректировать значения для текущего сеанса, введите:
sudo sysctl -p
Output
net.ipv4.ip_forward = 1
Если вы следовали инструкции по настройке сервера Debian 11, у вас должен быть установлен брандмауэр UFW. В рамках этой статьи нам понадобится брандмауэр для управления частью трафика, поступающего на сервер. Некоторые правила брандмауэра должны быть изменены, чтобы включить masquerading и концепцию iptables, обеспечивающую динамическую трансляцию сетевых адресов для правильной маршрутизации клиентских подключений.
Прежде чем открывать файл конфигурации брандмауэра для добавления правил masquerading, нужно найти общедоступный сетевой интерфейс компьютера. Для этого введите:
ip route | grep default
Ваш публичный интерфейс — это строка, следующая за «dev» в выходных данных команды. Например, приведенный ниже вывод показывает интерфейс с именем eth0
:
Когда у вас есть интерфейс, связанный с вашим маршрутом по умолчанию, откройте файл /etc/ufw/before.rules
, чтобы добавить соответствующую конфигурацию:
sudo nano /etc/ufw/before.rules
Правила UFW обычно добавляются с помощью команды ufw
. Однако правила, перечисленные в файле before.rules
, считываются и применяются до загрузки обычных правил UFW. Ближе к началу файла добавьте выделенные ниже строки. Это установит политику по умолчанию для цепочки POSTROUTING
в таблице nat
и замаскирует любой трафик, поступающий из VPN. Не забудьте заменить eth0
в строке -A POSTROUTING
:
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# 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
# Don't delete these required lines, otherwise there will be errors
*filter
. . .
Сохраните и закройте файл, когда закончите.
Затем укажите 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
. Если вы изменили порт и/или протокол, замените выбранные значения.
Если вы не добавили SSH-порт, добавьте его также здесь:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
После добавления этих правил отключите и снова включите UFW, чтобы перезапустить его и загрузить изменения из всех файлов, которые вы изменили:
sudo ufw disable
sudo ufw enable
Теперь ваш сервер настроен на корректную обработку трафика OpenVPN.
Шаг 6: запуск и включение службы OpenVPN
Наконец-то вы готовы запустить службу OpenVPN на своем сервере. Делается это с помощью утилиты systemctl
:
sudo systemctl start openvpn@server
Команда запустит службу openvpn
, используя /etc/openvpn/server.conf
в качестве файла конфигурации.
Дважды проверьте, что служба успешно запущена, введя:
sudo systemctl status openvpn@server
Если все прошло хорошо, ваш результат будет выглядеть примерно так:
Output
● openvpn@server.service - OpenVPN connection to server
Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-12-21 03:39:24 UTC; 29s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 3371 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 3587)
Memory: 1.2M
CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
└─3371 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn/server.conf --writepid /run/openvpn/
Вы также можете проверить, доступен ли интерфейс OpenVPN tun0
, набрав:
ip addr show tun0
Это выведет сконфигурированный интерфейс:
После запуска сервиса включите его, чтобы он автоматически запускался при загрузке:
sudo systemctl enable openvpn@server
Коротко о главном
Теперь ваш сервис OpenVPN запущен и работает. Однако, прежде чем вы сможете начать его использовать, вы должны сначала создать файл конфигурации для клиентской машины. В этой части мы разобрали, как создавать пары сертификат/ключ для клиентов, а в следующей расскажем, как создать инфраструктуру, которая будет генерировать файлы конфигурации клиента. Также отдельно рассмотрим, как установить клиентский VPN-профиль на Windows, macOS, Linux, iOS и Android.
Умения приобретаются на практике
Курс «Aдминистрирование Linux Mega» системного инженера Платона Платонова поможет разобраться не только во всех «фишках» контроля прав, но повысить владение Linux до уровня «бог» за 5 недель. Это самая хардовая и самая «прикладная» программа в духе Слерм + Southbridge: 12 часов теории, 48 часов практики на стендах, 9 масштабных тем и несчитанное количество реальных кейсов.
Документ о прохождении курса получит каждый участник. А те, кто выполнит финальный итоговый проект на стенде, добавят к своему портфолио специальный номерной сертификат. Цель нашего хардового финального тестирования — проверить полученные знания выпускников совокупно, поэтому мы включим каждую изученную тему.