Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8). |
|
|
Введение
strongSwan – это программное обеспечение для создания VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
Используется двухфакторная аутентификации пользователя:
- первый фактор –
пара: открытый ключ (сертификат) и закрытый ключ; - второй фактор – токен, принадлежащий пользователю.
Сертификат и закрытый ключ пользователя хранятся на токене.
Общая статья по работе с токенами: Ключевые носители (токены) PKCS в Astra Linux.
Настройка сети
На серверном и клиентском узлах:
- Разрешить пересылку сетевых пакетов:
cat << EOF | sudo tee /etc/sysctl.d/10-net-forward.conf >/dev/null net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.all.send_redirects = 0 EOF sudo sysctl --system |

Создание удостоверяющего центра и сертификатов
Все сертификаты создаются и хранятся в удостоверяющем центре (УЦ), в качестве которого может использоваться любой компьютер.
Первым создаётся самоподписанный сертификат УЦ. Затем с помощью сертификата УЦ создаются сертификаты для сервера и клиента. Созданные сертификаты и ключи копируются в определённые каталоги на сервере и клиенте.
Далее рассматривается вариант создания УЦ непосредственно на сервере в подкаталогах каталога /etc/ipsec.d/:
- Установить программы для работы с сертификатами:
sudo apt install strongswan strongswan-pki libtss2-tcti-tabrmd0 |
- Создать для удостоверяющего центра закрытый ключ
ca.key.pem и самоподписанный сертификат ca.cert.pem:pki --gen --size 4096 --type rsa --outform pem \ | sudo tee /etc/ipsec.d/private/ca.key.pem sudo pki --self --ca --in /etc/ipsec.d/private/ca.key.pem --type rsa --dn "CN=CA" --lifetime 3650 --outform pem \ | sudo tee /etc/ipsec.d/cacerts/ca.cert.pem |
- Создать для сервера закрытый ключ
server.key.pem и сертификат server.cert.pem:
pki --gen --size 4096 --type rsa --outform pem \ | sudo tee /etc/ipsec.d/private/server.key.pem sudo pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa \ | sudo pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \ --dn "CN=<IP-адрес_сервера>" --san "<IP-адрес_сервера>" --flag serverAuth --flag ikeIntermediate --outform pem \ | sudo tee /etc/ipsec.d/certs/server.cert.pem |
где <IP-адрес_сервера> – IP-адрес сервера.
- Создать для клиента закрытый ключ
client.key.pem и сертификат client.cert.pem:
pki --gen --size 4096 --type rsa --outform pem \ | sudo tee /etc/ipsec.d/private/client.key.pem sudo pki --pub --in /etc/ipsec.d/private/client.key.pem --type rsa \ | sudo pki --issue --lifetime 3650 --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \ --dn "CN=<IP-адрес_клиента>" --san "<IP-адрес_клиента>" --flag clientAuth --flag ikeIntermediate --outform pem \ | sudo tee /etc/ipsec.d/certs/client.cert.pem |
где <IP-адрес_клиента> – IP-адрес клиента.
Настройка VPN-сервера
На серверном узле:
- Установить пакеты с strongSwan:
sudo apt install strongswan libstrongswan-extra-plugins |
- Если УЦ был создан на сервере с помощью команд из раздела "Создание удостоверяющего центра и сертификатов", то сертификаты уже расположены в нужном месте, и этот пункт не надо выполнять.
Скопировать из УЦ на серверный узел:
- ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/;
- server.cert.pem (сертификат сервера) в каталог /etc/ipsec.d/certs/;
- server.key.pem (закрытый ключ сервера) в каталог /etc/ipsec.d/private/. - Настроить strongSwan-сервер на использование закрытого ключа сервера.
Для этого в файле /etc/ipsec.secrets указать строку с путём до закрытого ключа сервера:
: RSA "/etc/ipsec.d/private/server.key.pem" |
- Задать настройки strongSwan-сервера в файле
/etc/ipsec.conf:
config setup
charondebug= ike 4, cfg 2
conn server
type=tunnel
auto=add
keyexchange=ikev2
keyingtries=%forever
ike=aes256-sha1-modp1024!
esp=aes256-sha1!
dpdaction=hold
dpddelay=300s
## forceencaps=yes
# left=${MY_HOST_IP}
left=%any
leftid=${MY_HOST_IP}
leftcert=server.cert.pem
leftsubnet=10.1.1.0/24
leftauth=pubkey
rightsourceip=10.1.1.0/24
rightauth=pubkey
right=%any
rightid=%any
rightdns=10.1.1.250 |
где
- <IP-адрес_сервера> – IP-адрес серверного узла;
- <Подсеть_виртуальных_IP-адресов_для_клиентов> – . Например, 10.1.1.0/24
- Перезапустить strongSwan для применения настроек:
Настройка VPN-клиента
Настройка strongSwan-клиента
На клиентском узле:
- Установить пакеты с strongSwan:
sudo apt install strongswan libstrongswan-extra-plugins |
- Скопировать из УЦ на клиентский узел:
- ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/;
- client.cert.pem (сертификат пользователя) и client.key.pem (закрытый ключ пользователя) в домашний каталог пользователя. - Задать настройки strongSwan-клиента в файле
/etc/ipsec.conf:
config setup
charondebug= ike 4, cfg 2
conn client
type=tunnel
auto=start
keyexchange=ikev2
keyingtries=%forever
ike=aes256-sha1-modp1024!
esp=aes256-sha1!
dpdaction=restart
# left=${MY_HOST_IP}
leftsourceip=%config
leftauth=pubkey
leftcert=%smartcard0@rutoken:45
right=${PEER_HOST_IP}
rightid=${PEER_HOST_IP}
rightauth=pubkey
rightsubnet=10.1.1.0/24 |
где
- <IP-адрес_сервера> – IP-адрес серверного узла.
Настройка использования ключевого носителя (токена) в качестве второго фактора аутентификации
Предполагается, что на клиентском узле настроен единый доступ к ключевым носителям разных производителей (см. статью).
Общая информация по работе с ключевыми носителями дана в статье "Ключевые носители (токены) PKCS в Astra Linux".
- Подключить ключевой носитель к клиентскому узлу.
- Записать на ключевой носитель сертификат и закрытый ключ клиента:
p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_объекта> --label="<название_объекта>" p11tool --login --write --load-privkey="<путь_к_клиентскому_закрытому_ключу>" --id=<идентификатор_объекта> --label="<название_объекта>" |
где
- <идентификатор_объекта> – идентификатор, с которым сертификат и ключ будут храниться на токене;
- <название_объекта> – название, с которым сертификат и ключ будут храниться на токене.
Пример команд:
p11tool --login --write --load-certificate="client.cert.pem" --id=45 --label="mykey" p11tool --login --write --load-privkey="client.key.pem" --id=45 --label="mykey" |
- Включить поддержку токенов в strongSwan.
Для этого в файле /etc/strongswan.d/charon/pkcs11.conf в секции modules указать произвольное название модуля и путь до интерфейсной библиотеки используемого токена:
pkcs11 {
# Whether to load the plugin. Can also be an integer to increase the
# priority of this plugin.
load = yes
...
# List of available PKCS#11 modules.
modules {
<название_модуля> {
path = <путь_к_интерфейсной_библиотеке_токена>
}
}
} |
Например, для Рутокена файл /etc/strongswan.d/charon/pkcs11.conf может выглядеть так:
pkcs11 {
load = yes
modules {
rutoken {
path = /usr/lib/librtpkcs11ecp.so
}
}
} |
- Настроить strongSwan на использование закрытого ключа клиента, который находится на токене.
Для этого в файле /etc/ipsec.secrets указать строку с описанием токена и закрытого ключа:
: PIN <токен_и_закрытый_ключ> <pin-код_токена> |
где
- <токен_и_закрытый_ключ> – задаётся по формату: %smartcard[<номер_слота_с_токеном>[@<название_модуля>]]:<идентификатор_объекта>
- <название_модуля> – вышезаданное в настройках название модуля;
- <идентификатор_объекта> – идентификатор закрытого ключа, хранящегося на токене.
Пример описания для вышеприведённого Рутокена:
: PIN %smartcard0@rutoken:45 12345678 |
- Перезапустить strongSwan для применения настроек:
Для просмотра состояния установленного VPN-соединения используется команда:
Routed Connections:
client{1}: ROUTED, TUNNEL, reqid 1
client{1}: 10.192.6.110/32 === 10.1.1.0/24
Security Associations (1 up, 0 connecting):
client[1]: ESTABLISHED 5 minutes ago, 10.192.6.110[CN=10.192.6.110]...10.192.6.108[10.192.6.108]
client{2}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cd036fde_i c829d2f1_o
client{2}: 10.1.1.1/32 === 10.1.1.0/24 |
|
Либо для вывода более подробной информации о соединении:
Status of IKE charon daemon (strongSwan 5.9.8, Linux 6.1.141-1-generic, x86_64):
uptime: 6 minutes, since Sep 25 08:47:09 2025
malloc: sbrk 3805184, mmap 405504, used 2036464, free 1768720
worker threads: 10 of 16 idle, 6/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
loaded plugins: charon test-vectors ldap pkcs11 aes rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs12 pgp dnskey sshkey pem openssl gcrypt pkcs8 af-alg fips-prf gmp curve25519 agent chapoly xcbc cmac hmac kdf ctr ccm gcm drbg curl attr kernel-netlink resolve socket-default connmark forecast farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-radius eap-tls eap-ttls eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
10.192.6.110
Connections:
client: %any...10.192.6.108 IKEv2
client: local: [CN=10.192.6.110] uses public key authentication
client: cert: "CN=10.192.6.110"
client: remote: [10.192.6.108] uses public key authentication
client: child: dynamic === 10.1.1.0/24 TUNNEL
Routed Connections:
client{1}: ROUTED, TUNNEL, reqid 1
client{1}: 10.192.6.110/32 === 10.1.1.0/24
Security Associations (1 up, 0 connecting):
client[1]: ESTABLISHED 5 minutes ago, 10.192.6.110[CN=10.192.6.110]...10.192.6.108[10.192.6.108]
client[1]: IKEv2 SPIs: d770b3aced125439_i* 20eee7bd8ad5d3a6_r, public key reauthentication in 2 hours
client[1]: IKE proposal: AES_CBC_256/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
client{2}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cd036fde_i c829d2f1_o
client{2}: AES_CBC_256/HMAC_SHA1_96, 0 bytes_i, 1092 bytes_o (13 pkts, 313s ago), rekeying in 37 minutes
client{2}: 10.1.1.1/32 === 10.1.1.0/24
|
|