В этом руководстве мы узнаем, как установить и настроить сервер OpenVPN в Debian 12 для обеспечения безопасного сетевого взаимодействия между серверами и клиентами.
Внимание! Данная конфигурация VPN-сервера не предназначена для туннелирования трафика транзитом в интернет! Только для обеспечения связи между серверами и клиентами!
OpenVPN — это надежное и очень гибкое программное обеспечение с открытым исходным кодом, которое использует функции шифрования, аутентификации и сертификации библиотеки OpenSSL для безопасного туннелирования IP-сетей.
Для начала обновим список пакетов и установим необходимые компоненты для работы OpenVPN: это сама служба OpenVPN и утилита EasyRsa для генерации необходимых сертификатов.
sudo apt update
sudo apt -y install openvpn easy-rsa
После установки необходимых пакетов необходимо создать инфраструктуру публичных ключей (Public Key Infrastructure, PKI )
PKI состоит из:
Я несколько раз встречал совет - копировать каталог easy-rsa в другое место, что бы избежать будущих проблем при обновлении пакета OpenVPN. Пока я с таким не сталкивался, но вреда от этого точно не будет.
cp -r /usr/share/easy-rsa /etc/
Теперь перейдем в этот каталог и запустим процесс инициализации PKI:
cd /etc/easy-rsa/
./easyrsa init-pki
Результатом выполнения станет создание каталога /etc/easy-rsa/pki
Появится примерно такое сообщение:
* Notice:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /etc/easy-rsa/pki
* Notice:
IMPORTANT: Easy-RSA 'vars' file has now been moved to your PKI above.
Теперь сгенерируем сертификат CA и ключ для подписи сертификатов сервера и клиента OpenVPN.
cd /etc/easy-rsa/
./easyrsa build-ca
При создании сертификата и ключа система предложит ввести пароль для их защиты, а так же предложит ввести имя. Можно выбрать любое, хоть имя сервера.
Происходящее будет выглядеть примерно так:
root@openvpn:/etc/easy-rsa# ./easyrsa build-ca
* Notice:
Using Easy-RSA configuration from: /etc/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Using configuration from /etc/easy-rsa/pki/3ab5b10e/temp.4e6a451a
..+.............+.+......+.....+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:tims
* Notice:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/easy-rsa/pki/ca.crt
Теперь создадим ключи Диффи-Хеллмана, используемые для обмена ключами во время TLS-рукопожатия между сервером OpenVPN и подключающимися клиентами. Эта команда должна быть выполнена в каталоге Easy-RSA.
./easyrsa gen-dh
Файл будет доступен в каталоге /etc/easy-rsa/pki/dh.pem
Теперь создадим ключи для самого сервера Open-VPN/
cd /etc/easy-rsa
./easyrsa build-server-full server nopass
В создании ключей будет участвовать ЦС, при создании которого мы создавали пароль. Этот пароль защищает нас от возможных проблем в случае кражи приватных данных ЦС. Этот же пароль система будет спрашивать у нас каждый раз, когда мы генерируем новые ключи для сервера и клиентов.
Чтобы аннулировать ранее подписанный сертификат, необходимо создать сертификат отзыва.
./easyrsa gen-crl
Теперь, когда все сертификаты и ключи для сервера у нас готовы, скопируем их каталог сервиса OpenVPN.
cp -rp /etc/easy-rsa/pki/{ca.crt,dh.pem,crl.pem,issued,private} /etc/openvpn/server/
Сертификаты и закрытые ключи клиентов OpenVPN создаются в директории /etc/easy-rsa следующей командой:
cd /etc/easy-rsa
./easyrsa build-client-full <username> nopass
Замените username на свое уникальное имя. Оно больше не должно повторяться и не может использоваться повторно, после отзыва сертификата.
Например, для создания сертификата для пользователя tims используем
./easyrsa build-client-full tims nopass
Файлы сертификатов будут размещены в каталоге /etc/easy-rsa/pki/issued для каждого пользователя.
Советую сразу раскладывать сертификаты клиентов отдельные папки.
mkdir /etc/openvpn/client/tims
После этого скопируем все нужные ключи и сертификаты, необходимые для работы клиента.
cp -rp /etc/easy-rsa/pki/{ca.crt,issued/tims.crt,private/tims.key} /etc/openvpn/client/tims
Теперь у нас есть все небходимые ключи и сертификаты для работы сервера Open-VPN и хотя бы одного клиента.
Займемся настройкой сервера. Мы можем скопировать пример конфигурации сервиса Open-VPN из обрзаца и заполнить его исходя из своих потребностей.
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
В этом файле много комментариев, которые помогут использовать дополнительные функции. После заполнения обновленный вариант без комментариев должен выглядеть примерно так:
grep -vE "^$|^#|^;" /etc/openvpn/server/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert issued/server.crt
key private/server.key # This file should be kept secret
dh dh.pem
topology subnet
server 172.16.20.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "dhcp-option DNS 9.9.9.9"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
auth SHA512
Если все делалось строго по этой инструкции, то расположение всех ключей и сертификатов здесь совпадают.
Разуемеется, я всегда меняю стандартный порт 1194 на другой.
Внимание! Данная конфигурация VPN-сервера не предназначена для туннелирования трафика транзитом в интернет!
Параметр push «redirect-gateway def1 bypass-dhcp» убран именно с этой целью.
После настройки запускам сервер.
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server
Теперь нужно очень аккуратно и внимательно заполнить клиентский файл конфигуарции. Замените данные на свои актуальные.
client
proto udp
remote YOUR_SERVER_IP 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
<ca>
-----BEGIN CERTIFICATE-----
(вставьте содержимое ca.crt)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
(вставьте содержимое client1.crt)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(вставьте содержимое client1.key)
-----END PRIVATE KEY-----
</key>