Создание защищённых VPN-туннелей, использующих контроль заголовков IP-пакетов в соответствии с ГОСТ Р 34.12-2015

Введение

Данный раздел описывает процедуру настройки VPN-туннеля на базе OpenVPN с контролем заголовков IP-пакетов в соответствии с ГОСТ Р 34.12-2015 «Информационная технология. Криптографическая защита информации. Блочные шифры».

Все команды, описанные в данном разделе, необходимо выполнять с привилегиями системного администратора (root).

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

На сервере и на клиентских компьютерах необходимо установить последнюю версию криптографических политик и пакет openssl-gost-engine, добавляющий поддержку ГОСТ алгоритмов в OpenSSL:

$ dnf install openssl-gost-engine
$ dnf upgrade crypto-policies

Затем подключите модуль TLSGOST к текущей политике:

# отобразить на экран название текущей политики
$ update-crypto-policies --show
DEFAULT

# добавить к политике "DEFAULT" модуль "TLSGOST"
$ update-crypto-policies --set DEFAULT:TLSGOST

Дополнительную информацию о криптографических политиках и модулях вы можете получить из раздела «Использование алгоритмов ГОСТ».

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

Установка сервера OpenVPN

На компьютере, который будет выполнять роль сервера OpenVPN, установите соответствующий пакет:

$ dnf install openvpn

Настройка удостоверяющего центра

Для настройки сервера OpenVPN с авторизацией по сертификатам TLS необходимо настроить собственный удостоверяющий центр (англ. Certification authority, CA), основной функцией которого является управление сертификатами сервера и клиентов OpenVPN, в том числе их создание и отзыв.

В данном примере в качестве рабочего каталога для удостоверяющего центра будет использоваться каталог /root/CA. Создайте необходимую структуру каталогов, а также файлы index.txt, serial и crlnumber, требуемые для работы центра:

$ mkdir -p /root/CA/{certs,crl,newcerts,private}
$ touch /root/CA/index.txt
$ echo 1000 > /root/CA/serial
$ echo 01 > /root/CA/crlnumber

Создайте конфигурационный файл для OpenSSL:

$ cat > /root/CA/openssl.conf << EOF
[ca]
default_ca          = CA_default

[CA_default]
dir                 = /root/CA
certs               = \$dir/certs
crl_dir             = \$dir/crl
new_certs_dir       = \$dir/newcerts
database            = \$dir/index.txt
serial              = \$dir/serial
crlnumber           = \$dir/crlnumber
private_key         = \$dir/private/ca.key
certificate         = \$dir/certs/ca.crt
crl                 = \$dir/crl/ca.crl
policy              = policy_strict
default_days        = 365
default_crl_days    = 30
default_md          = gost12_512
preserve            = no

[policy_strict]
countryName         = match
stateOrProvinceName = match
organizationName    = match
commonName          = supplied

[req]
default_bits        = 2048
prompt              = no
encrypt_key         = no

[v3_ca]
basicConstraints    = CA:TRUE
keyUsage            = critical,keyCertSign,cRLSign

[server]
basicConstraints    = CA:FALSE
keyUsage            = digitalSignature,keyAgreement
extendedKeyUsage    = serverAuth

[client]
basicConstraints    = CA:FALSE
keyUsage            = digitalSignature,keyAgreement
extendedKeyUsage    = clientAuth
EOF

Создайте секретный ключ удостоверяющего центра, защищённый паролем:

$ openssl genpkey -aes256 -algorithm gost2012_512 -pkeyopt paramset:A \
    -out /root/CA/private/ca.key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

В тестовом окружении вы можете использовать секретный ключ без пароля — для этого из приведённой выше команды необходимо убрать аргумент -aes256. Однако, в условиях промышленной эксплуатации ключ обязательно нужно защищать паролем и хранить в надёжном месте.

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

$ openssl req -x509 -new -config /root/CA/openssl.conf \
    -extensions v3_ca -key /root/CA/private/ca.key \
    -subj '/C=RU/ST=Moscow/O=MyVPN/CN=MyCA' \
    -days 3650 -out /root/CA/certs/ca.crt
Enter pass phrase for /root/CA/private/ca.key:

Перед запуском установите для полей аргумента -subj значения, соответствующие вашей организации: C=RU — страна, ST=Moscow — область, O=MyVPN — название организации, CN=MyCA — название удостоверяющего центра. Параметр -days определяет количество дней, в течение которых сертификат будет считаться действительным. В этом примере сертификат выпускается на 3650 дней (10 лет).

Затем, создайте список отозванных сертификатов:

$ openssl ca -config /root/CA/openssl.conf -gencrl \
    -out /root/CA/crl/ca.crl -md gost12_512 crldays 30
Using configuration from /root/CA/openssl.conf
Enter pass phrase for /root/CA/private/ca.key:

На этом процедуру создания удостоверяющего центра можно считать завершённой.

Конфигурация и запуск сервера OpenVPN

Создайте файл секретного ключа для сервера OpenVPN:

$ openssl genpkey -algorithm gost2012_512 -pkeyopt paramset:A \
    -out /root/CA/server.key

Создайте CSR запрос (Certificate Signing Request) на выпуск сертификата для сервера OpenVPN:

$ openssl req -new -config /root/CA/openssl.conf \
    -key /root/CA/server.key -subj '/C=RU/ST=Moscow/O=MyVPN/CN=server' \
    -out /root/CA/server.csr -md_gost12_512

Перед запуском установите для полей аргумента -subj значения, соответствующие вашей организации: C=RU — страна, ST=Moscow — область, O=MyVPN — название организации, CN=server — название сервера OpenVPN. В результате выполнения команды будет создан файл CSR запроса /root/CA/server.csr, который затем будет использован для выпуска сертификата сервера OpenVPN удостоверяющим центром.

Для выпуска сертификата сервера OpenVPN выполните следующую команду:

$ openssl ca -config /root/CA/openssl.conf -in /root/CA/server.csr \
    -out /root/CA/server.crt -extensions server -md gost12_512 -batch
Using configuration from /root/CA/openssl.conf
Enter pass phrase for /root/CA/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :ASN.1 12:'Moscow'
organizationName      :ASN.1 12:'MyVPN'
commonName            :ASN.1 12:'server'
Certificate is to be certified until May 15 15:19:27 2026 GMT (365 days)

Write out database with 1 new entries
Database updated

Выпущенный ключ будет записан в файл /root/CA/server.crt.

Затем необходимо сгенерировать файл с параметрами безопасности Диффи-Хеллмана для создания безопасного TLS соединения:

$ openssl dhparam -out /root/CA/dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime
...

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

$ cp -f /root/CA/certs/ca.crt \
    /root/CA/server.key \
    /root/CA/server.crt \
    /root/CA/dh2048.pem \
    /root/CA/crl/ca.crl \
    /etc/openvpn/server/

$ chmod 600 /etc/openvpn/server/server.key

где:

  • /root/CA/certs/ca.crt — публичный сертификат удостоверяющего центра;

  • /root/CA/server.key — секретный ключ сервера OpenVPN;

  • /root/CA/server.crt — публичный сертификат сервера OpenVPN;

  • /root/CA/dh2048.pem — параметры безопасности Диффи-Хеллмана;

  • /root/CA/crl/ca.crl — список отозванных клиентских сертификатов.

Далее, создайте конфигурационный файл сервера OpenVPN:

$ cat > /etc/openvpn/server/server.conf << EOF
mode server
topology subnet
;local 192.168.10.38
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh2048.pem
crl-verify /etc/openvpn/server/ca.crl

server 10.10.4.0 255.255.255.0
;push "route 192.168.10.0 255.255.255.0"
;push "dhcp-option DNS 192.168.10.1"

keepalive 10 120
cipher kuznyechik-cbc
user openvpn
group openvpn
persist-key
persist-tun
verb 3
explicit-exit-notify 1
data-ciphers kuznyechik-cbc
auth id-tc26-gost3411-12-512
EOF

По умолчанию сервер OpenVPN принимает запросы со всех сетевых интерфейсов, раскомментируйте директиву local и укажите ей в качестве значения IP-адрес интерефейса, на котором должен принимать подключения сервер.

Далее, разрешите доступ к порту 1194, на котором принимает подключения OpenVPN, в настройках брандмауэра:

$ firewall-cmd --permanent --add-service=openvpn
$ firewall-cmd --reload

После этого активируйте и запустите службу сервера OpenVPN:

$ systemctl enable --now openvpn-server@server.service
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn-server@server.service → /usr/lib/systemd/system/openvpn-server@.service.

Проверить статус службы можно с помощью следующей команды:

$ systemctl status openvpn-server@server.service
● openvpn-server@server.service - OpenVPN service for server
   Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; enabled; preset: disabled)
   Active: active (running) since Thu 2025-05-15 17:07:57 UTC; 5s ago
...

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

$ sudo journalctl -u openvpn-server@server.service

Создание клиентских сертификатов

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

Создайте файл сектретного ключа /root/CA/client1.key:

$ openssl genpkey -algorithm gost2012_512 -pkeyopt paramset:A \
    -out /root/CA/client1.key

Создайте CSR запрос на выпуск сертификата:

$ openssl req -new -config /root/CA/openssl.conf -key /root/CA/client1.key \
    -subj "/C=RU/ST=Moscow/O=MyVPN/CN=client1" \
    -out /root/CA/client1.csr -md_gost12_512

Перед запуском команды внесите необходимые изменения в поля аргумента -subj.

Создайте клиентский сертификат:

$ openssl ca -config /root/CA/openssl.conf -in /root/CA/client1.csr \
    -out /root/CA/client1.crt -extensions client -md gost12_512 -batch
Using configuration from /root/CA/openssl.conf
Enter pass phrase for /root/CA/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :ASN.1 12:'Moscow'
organizationName      :ASN.1 12:'MyVPN'
commonName            :ASN.1 12:'client1'
Certificate is to be certified until May 15 18:54:10 2026 GMT (365 days)

Write out database with 1 new entries
Database updated

В результате выполнения команды будет создан файл /root/CA/client1.crt.

Затем, необходимо сгенерировать конфигурационный файл (в этом примере — client1.ovpn) для последующей передачи на клиентский компьютер:

$ cat > client1.ovpn << EOF
client
dev tun
proto udp
remote 192.168.10.38 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher kuznyechik-cbc
verb 3
data-ciphers kuznyechik-cbc
auth id-tc26-gost3411-12-512

<ca>
$(cat /root/CA/certs/ca.crt)
</ca>

<cert>
$(openssl x509 -in /root/CA/client1.crt)
</cert>

<key>
$(cat /root/CA/client1.key)
</key>
EOF

Замените 192.168.10.38 на реальный IP-адрес вашего сервера OpenVPN. Созданный конфигурационный файл необходимо передать на клиентский компьютер. Используйте только защищённые каналы связи поскольку в этом файле находится в том числе и секретный ключ доступа к VPN.

Настройка клиента OpenVPN

Установка клиента OpenVPN

На компьютере, который будет выполнять роль клиента OpenVPN, установите соответствующий пакет:

$ sudo dnf install openvpn

Если этот компьютер является графической рабочей станцией, установите также расширение для NetworkManager, которое позволяет настраивать подключение к OpenVPN через графический интерфейс:

$ sudo dnf install NetworkManager-openvpn-gnome

Настройка клиента OpenVPN в режиме командной строки

Для настройки клиента OpenVPN в режиме командной строки скопируйте созданный ранее файл client1.ovpn в каталог /etc/openvpn/client/ под именем client.conf и установите для него безопасные права доступа:

$ sudo cp client1.ovpn /etc/openvpn/client/client.conf
$ sudo chown root:root /etc/openvpn/client/client.conf
$ sudo chmod 600 /etc/openvpn/client/client.conf

Следующая команда активирует и запустит службу клиента OpenVPN:

$ sudo systemctl enable --now openvpn-client@client.service

Посмотреть статус службы можно следующим образом:

$ sudo systemctl status openvpn-client@client.service
● openvpn-client@client.service - OpenVPN tunnel for client
   Loaded: loaded (/usr/lib/systemd/system/openvpn-client@.service; disabled; preset: disabled)
   Active: active (running) since Fri 2025-05-16 00:50:08 MSK; 16min ago

После запуска службы и успешного подключения к VPN-серверу в системе появится новый сетевой интерфейс tun0:

...
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
  link/none
  inet 10.10.4.2/24 scope global tun0
     valid_lft forever preferred_lft forever
  inet6 fe80::640:643d:d512:52ce/64 scope link stable-privacy
     valid_lft forever preferred_lft forever

В диагностических целях системный журнал клиента OpenVPN можно просмотреть с помощью следующей команды:

$ sudo journalctl -u openvpn-client@client.service

Настройка клиента OpenVPN в графическом режиме

Для настройки подключения к OpenVPN через графический интерфейс откройте главное меню системы и запустите приложение «Настройки» (помечено красной рамкой на снимке экрана ниже):

Подключение к OpenVPN через графический интерфейс

В левом меню выберите пункт «Сеть» (отмечен цифрой 1 на снимке экрана ниже), после этого откроется панель настройки сетевых подключений, где в блоке «VPN» вам необходимо нажать на значок + (отмечен цифрой 2 на снимке экрана ниже):

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

В появившемся окне «Добавить VPN» нажмите на пункт «Импортировать из файла…», отмеченный красной рамкой на снимке экрана ниже:

Импортировать из файла

В открывшемся окне выбора файлов выберите ранее созданный файл client1.ovpn и нажмите кнопку «Открыть» — после этого появится окно добавления нового VPN-подключения, представленное на следующем снимке экрана:

Окно добавления нового VPN-подключения

В случае необходимости вы можете изменить название подключения, IP-адрес или TCP-порт сервера. После завершения настройки нажмите на кнопку «Добавить».

После этого новое VPN-соединение появится в блоке «VPN» панели сетевых настроек:

Новое VPN-соединение

Для подключения к VPN активируйте соответствующий переключатель, отмеченный красной рамкой на снимке экрана выше.

Также вы можете подключиться к ранее созданному VPN-соединению, нажав на группу иконок в правом нижнем углу экрана (справа от часов) и выбрав там пункт «Соединиться» в соответствующем блоке, отмеченном красной рамкой на снимке экрана:

Подключиться к ранее созданному VPN-соединению