Создание защищённых 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 через графический интерфейс откройте главное меню системы и запустите приложение «Настройки» (помечено красной рамкой на снимке экрана ниже):

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

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

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

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

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