|
StrongSwan – это программное обеспечение для создания VPN-соединений на основе IPsec-протокола. Домашняя страница ПО: https://strongswan.org/.
При установке VPN-соединения производится аутентификация как strongSwan-сервера, так и strongSwan-клиента. Данные между сервером и клиентом передаются в зашифрованном виде.
В статье описана настройка аутентификации сервера и клиента с помощью закрытых ключей. Для клиента дополнительно используется второй фактор аутентификации в виде ключевого носителя (токена).
На серверном и клиентском узлах:
cat << EOF | sudo tee /etc/sysctl.d/10-net-forward.conf >/dev/null |
Все сертификаты создаются и хранятся в удостоверяющем центре (УЦ), в качестве которого может использоваться любой компьютер.
Вначале создаётся самоподписанный корневой сертификат УЦ. Затем с помощью сертификата УЦ создаются сертификаты для сервера и клиента. Созданные сертификаты и ключи копируются в определённые каталоги на сервере и клиенте.
Далее рассматривается вариант создания УЦ непосредственно на сервере в подкаталогах каталога /etc/ipsec.d/:
sudo apt install strongswan strongswan-pki |
sudo apt install libtss2-tcti-tabrmd0 |
ca.key.pem и самоподписанный сертификат ca.cert.pem:pki --gen --size 4096 --type rsa --outform pem \ sudo pki --self --ca --in /etc/ipsec.d/private/ca.key.pem --type rsa --dn "CN=CA" --lifetime 3650 --outform pem \ |
server.key.pem и сертификат server.cert.pem:pki --gen --size 4096 --type rsa --outform pem \ sudo pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa \ |
На серверном узле:
sudo apt install strongswan libstrongswan-extra-plugins |
sudo apt install libtss2-tcti-tabrmd0 |
server.cert.pem (сертификат сервера) в каталог /etc/ipsec.d/certs/;server.key.pem (закрытый ключ сервера) в каталог /etc/ipsec.d/private/./etc/ipsec.secrets в виде строки:: RSA server.key.pem |
/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
leftid=<IP-адрес_сервера> # Например: 10.192.6.108
leftauth=pubkey
leftcert=server.cert.pem # Сертификат сервера
leftsendcert=always
leftsubnet=<виртуальная_сеть__предоставляемая_сервером> # Например: 10.1.1.0/24
rightauth=pubkey
rightid=%any
rightsourceip=<диапазон_виртуальных_адресов_для_выдачи_клиентам> # Например: 10.1.1.0/24
rightdns=<IP-адреса_DNS-серверов__передаваемые_клиентам> # Например: 10.1.1.250,10.1.1.240 |
sudo ipsec restart |
На клиентском узле:
sudo apt install strongswan libstrongswan-extra-plugins |
sudo apt install libtss2-tcti-tabrmd0 |
ca.cert.pem (сертификат УЦ) в каталог /etc/ipsec.d/cacerts/./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
forceencaps=yes
leftauth=pubkey
leftcert=<токен_и_закрытый_ключ> # Например: %smartcard0@rutoken:45 или %smartcard:45
# Формат значения <токен_и_закрытый_ключ> описан ниже в разделе "Настройка ... токена ...".
leftsendcert=always
leftsourceip=%config
right=<IP-адрес_сервера> # Например: 10.192.6.108
rightid=<IP-адрес_сервера> # Например: 10.192.6.108
rightauth=pubkey
rightsubnet=<виртуальная_сеть__предоставляемая_сервером> # Например: 10.1.1.0/24
# Если указать 0.0.0.0/0, то весь сетевой траффик клиента
# будет "заворачиваться" в VPN-соединение (туннель).
# Тогда на сервере параметру leftsubnet тоже
# необходимо задать значение 0.0.0.0/0. |
Предполагается, что на клиентском узле настроен единый доступ к ключевым носителям разных производителей (см. статью).
Общая информация по работе с ключевыми носителями дана в статье "Ключевые носители (токены) PKCS в Astra Linux".
При использовании пассивного ключевого носителя:
На клиентском узле в домашнем каталоге пользователя:
client1.key.pem:openssl genrsa -out client1.key.pem 4096 |
client1.cert.csr:openssl req -key client1.key.pem -new -out client1.cert.csr \ |
client1.cert.csr на узел УЦ.На удостоверяющем центре:
client1.cert.csr с помощью сертификата УЦ и сохранить подписанный сертификат клиента client1.cert.pem в каталоге /etc/ipsec.d/certs/:sudo pki --issue --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \ |
client1.cert.pem на клиентский узел в домашний каталог пользователя.На клиентском узле в домашнем каталоге пользователя:
p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>" p11tool --login --write --load-privkey="<путь_к_клиентскому_закрытому_ключу>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>" |
Перед записью необходимо убедиться, что на токене отсутствуют какие-либо объекты с идентификатором, с которым будут храниться сертификат и ключ. |
p11tool --login --write --load-certificate="client1.cert.pem" --id=45 --label="mykey" p11tool --login --write --load-privkey="client1.key.pem" --id=45 --label="mykey" |
client1.key.pem из домашнего каталога пользователя.При использовании активного ключевого носителя:
На клиентском узле в домашнем каталоге пользователя:
p11tool --login --generate-rsa --bits=<длина_ключа> --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>" |
Перед созданием необходимо убедиться, что на токене отсутствуют какие-либо объекты с идентификатором, с которым будут храниться ключи. |
p11tool --login --generate-rsa --bits=4096 --id=45 --label="mykey" |
client1.cert.csr:openssl req -new -engine pkcs11 -keyform engine -out client1.cert.csr \ |
client1.cert.csr на узел УЦ.На удостоверяющем центре:
client1.cert.csr с помощью сертификата УЦ и сохранить подписанный сертификат клиента client1.cert.pem в каталоге /etc/ipsec.d/certs/:sudo pki --issue --cacert /etc/ipsec.d/cacerts/ca.cert.pem --cakey /etc/ipsec.d/private/ca.key.pem \ |
client1.cert.pem на клиентский узел в домашний каталог пользователя.На клиентском узле в домашнем каталоге пользователя:
p11tool --login --write --load-certificate="<путь_к_клиентскому_сертификату>" --id=<идентификатор_ключевой_пары> --label="<метка_ключевой_пары>" |
p11tool --login --write --load-certificate="client1.cert.pem" --id=45 --label="mykey" |
/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 {
<название_модуля_1> {
path = <путь_к_интерфейсной_библиотеке_токена_1>
}
<название_модуля_2> {
path = <путь_к_интерфейсной_библиотеке_токена_2>
}
}
} |
/etc/strongswan.d/charon/pkcs11.conf может выглядеть так:pkcs11 {
load = yes
modules {
rutoken {
path = /usr/lib/librtpkcs11ecp.so
}
# aladdin {
# path = /usr/lib/libjcPKCS11-2.so
# }
}
} |
/etc/ipsec.secrets строку с описанием токена и закрытого ключа:: PIN <токен_и_закрытый_ключ> <pin-код> |
: PIN <токен_и_закрытый_ключ> %prompt |
/etc/strongswan.d/charon/pkcs11.conf, в котором указана интерфейсная библиотека для работы с токеном;%smartcard0@rutoken:45 Если к компьютеру подключается только один ключевой носитель, то достаточно использовать укороченный формат параметра <токен_и_закрытый_ключ>: %smartcard:<идентификатор_ключевой_пары> Например: |
/etc/ipsec.secrets:: PIN %smartcard0@rutoken:45 12345678 |
: PIN %smartcard0@rutoken:45 %prompt |
: PIN %smartcard:45 %prompt |
sudo ipsec restart |
/etc/ipsec.secrets указана опция %prompt, то после каждого запуска (перезапуска) strongSwan необходимо вручную вводить pin-код токена. sudo ipsec rereadsecrets |
sudo ipsec rereadsecrets".Login to '%smartcard0@rutoken:45' required PIN: |
sudo ipsec reload |
Для просмотра состояния установленного VPN-соединения используется команда:
sudo ipsec status |
|
Команда для вывода более подробной информации о VPN-соединении:
sudo ipsec statusall |
|
На компьютере пользователя САВЗ Касперского создаёт таблицу маршрутизации, из-за которой strongSwan-клиент не может установить соединение с strongSwan-сервером.
Диагностика.
На компьютере пользователя:
ip rule присутствует таблица с номером 101:0: from all lookup local 32764: from all fwmark 0x200/0x200 lookup 101 32765: from all fwmark 0x100/0x100 lookup 101 32766: from all lookup main 32767: from all lookup default |
/var/log/syslog выводится сообщение:04[NET] error writing to socket: Invalid argument |
Решение.
На компьютере пользователя:
/etc/strongswan.d/charon.conf в блоке charon присвоить параметру ignore_routing_tables значение 101:charon {
...
# A space-separated list of routing tables to be excluded from route
# lookups.
# ignore_routing_tables =
ignore_routing_tables = 101
...
} |
Решение.
На компьютере пользователя:
sudo apt install strongswan-nm |
/etc/strongswan.d/charon-nm.conf и добавить в него блок параметров, содержащих путь до интерфейсной библиотеки используемого токена:charon-nm {
plugins {
pkcs11 {
modules {
<название_модуля_1> {
path = <путь_к_интерфейсной_библиотеке_токена_1>
}
}
}
}
} |
/etc/strongswan.d/charon-nm.conf может выглядеть так:charon-nm {
plugins {
pkcs11 {
modules {
rutoken {
path = /usr/lib/librtpkcs11ecp.so
}
}
}
}
} |




Возможным решением проблемы может быть двойное указание IP-адреса в сертификатах узлов в расширении subjectAltName.
Для этого для создания сертификата сервера и запроса на сертификат клиента необходимо использовать команды:
server.cert.pem:sudo pki --pub --in /etc/ipsec.d/private/server.key.pem --type rsa \ |
client1.cert.csr:openssl req -new -key client1.key.pem -out client1.cert.csr \ |
openssl req -new -engine pkcs11 -keyform engine -out client1.cert.csr \ |
Если в настройках strongSwan-клиента (раздел 5.1) параметру rightsubnet присвоено значение 0.0.0.0/0 и при этом ресурсы локальной сети стали недоступны, то, возможно, решением проблемы будет присвоение параметру rightsubnet значения 0.0.0.1/0.