Описание стенда
Операционная система сервера = Ubuntu 20.04
Доменное имя сервера сервера = server.astradomain.ad
Операционная система клиента = Ubuntu 20.04
Имя VPN клиента = user
Настройка сервера
Установка пакетов для работы
За основу инструкции по настройке сервера была взята следующая инструкция.
В первую очередь поставим все необходимые пакеты для работы:
sudo apt update # пакеты для работы strongSwan VPN сервера sudo apt-get install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins # пакеты для работы со смарт-картами и токенами (чтобы создать ключевую пару и сертификаты на Рутокене) sudo apt install opensc libengine-pkcs11-openssl1.1
Генерация ключевых пар и сертификатов УЦ и сервера:
# инициализируем директорию для хранения ключей и сертификатов
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
# создание ключевой пары УЦ
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
# создание корневого сертификата
pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
--type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem
# создание ключевой пары сервера
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
# получение сертификата сервера
# обратите внимание, что аргументы --dn и --san нужно будет заменить на свои
pki --pub --in ~/pki/private/server-key.pem --type rsa \
| pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--dn "CN=server.astradomomain.ad" --san server.astradomain.ad \
--flag serverAuth --flag ikeIntermediate --outform pem \
> ~/pki/certs/server-cert.pem
# копируем полученные сертификаты в директорию strongSwan
sudo cp -r ~/pki/* /etc/ipsec.d/
Настройка strongSwan
Сохраним предыдущую конфигурацию:
sudo mv /etc/ipsec.conf{,.original}
Откроем файл /etc/ipsec.conf и вставим туда следующее содержимое:
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
# доменное имя сервера нужно будет заменить на свое
leftid=@server.astradomain.ad
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
# активация аутентификации по сертификатам
rightauth=eap-tls
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
Укажем какой ключ использовать серверу для аутентификации себя клиенту /etc/ipsec.secrets:
: RSA "server-key.pem"
Настройка firewall
sudo ufw allow OpenSSH sudo ufw enable sudo ufw allow 500,4500/udp
Узнаем имя интерфейса, к которому подключен сервер. Данное имя нам потребуется при настройке firewall. Это можно сделать с помощью команды:
ip route show default # вывод данной команды будет примерно следующим: # default via your_server_ip dev eth0 proto static # Имя интерфейса -- eth0
Добавим в файл настроек firewall /etc/ufw/before.rules следующие строки:
# Добавим этот блок # Не забудьте поменять имя интерфейса *nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE COMMIT # Добавим этот блок # Не забудьте поменять имя интерфейса *mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 COMMIT # Этот блок остается без изменений *filter :ufw-before-input - [0:0] :ufw-before-output - [0:0] :ufw-before-forward - [0:0] :ufw-not-local - [0:0] # Добавим этот блок -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
Добавим в файл /etc/ufw/sysctl.conf следующие строки:
net/ipv4/ip_forward=1 net/ipv4/conf/all/accept_redirects=0 net/ipv4/conf/all/send_redirects=0 net/ipv4/ip_no_pmtu_disc=1
Перезагрузка firewall
sudo ufw disable sudo ufw enable
Запуск VPN сервера
sudo systemctl restart strongswan-starter
Проверить, что сервер поднялся успешно, можно, например, с помощью команды:
sudo systemctl status strongswan-starter
Добавление нового клиента со смарт-картой
Модуль pkcs11 для работы со смарт-картами
В настоящий момент смарт-карта отформатированная для работы с librtpkcs11ecp.so модулем не подходит для аутентификации внутри VPN strongSwan, т.к. не поддерживает необходимые PKCS#11-механизмы.
К счастью, модуль opensc-pkcs11.so их поддерживает.
Отформатируем смарт-карту, сгенерируем на ней ключи и получим сертификат.
# форматирование и инициализация
pkcs15-init --erase-card -p rutoken_ecp
pkcs15-init --create-pkcs15 --so-pin "87654321" --so-puk ""
pkcs15-init --store-pin --label "User PIN" --auth-id 02 --pin "12345678" --puk "" --so-pin "87654321" --finalize
# генерация ключей
ID=45
pkcs15-init -G rsa/2048 --auth-id 02 --label "My Private Key" --public-key-label "My Public Key" --id $ID
# генерация заявки на сертификат
openssl
> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11.so
# не забудьте заменить идентификатор сертификата
> req -engine pkcs11 -new -key 45 -keyform engine -out req.csr -subj "/C=RU/CN=user"
> exit
# выдадим сертификат по заявке
pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--in req.csr --type pkcs10 --outform pem \
> ~/pki/certs/client-cert.pem
# загрузим сертификат на токен
pkcs15-init --store-certificate ~/pki/certs/client-cert.pem --auth-id 02 --id $ID --format pem
Убедиться, что сертификат и ключи загружены на токен можно с помощью команды:
pkcs11-tool -O -l
Теперь Рутокен готов к работе и его можно отдать клиенту.
Настройка клиента
Проверка доступности сервера
Проверим, что сервер доступен.
ping server.astradomain.ad
Установка пакетов
Установим необходимые пакеты для работы:
sudo apt update # пакеты для работы strongSwan VPN сервера sudo apt-get install strongswan libstrongswan-extra-plugins libcharon-extra-plugins # пакеты для работы со смарт-картами (чтобы создать ключевую пару и сертификаты на токене) sudo apt install opensc libengine-pkcs11-openssl1.1
Настройка strongSwan
Корневой сертификат сервера положим в директорию /etc/ipsec.d/cacerts:
sudo cp /path/to/ca-cert.pem /etc/ipsec.d/cacerts
Настроим файл конфигурации strongSwan /etc/ipsec.conf:
config setup
conn ikev2-rw
# измените адрес сервера на свой
right=server.astradomain.ad
rightid=@server.astradomain.ad
rightsubnet=0.0.0.0/0
rightauth=pubkey
leftsourceip=%config
# имя пользователя для которого выдан сертификат
leftid=user
leftcert=%smartcard:45
leftauth=eap
eap_identity=%identity
auto=start
Настроим файл паролей аутентфикации strongSwan /etc/ipsec.secrets и укажем, какой ключ нужно использовать для аутентификации по смарт-карте:
# Формат следующий #: PIN %smartcard:<keyid> <pin code> : PIN %smartcard:45 "12345678"
Более подробно о способах задания паролей смарт-карт можно почитать здесь.
Настройка модуля pkcs11
Настроим использование pkcs11 модулей в strongSwan. Для этого откроем файл конфигурации /etc/strongswan.d/charon/pkcs11.conf и отредактируем настройки модулей pkcs11:
modules {
opensc-pkcs11 {
# Whether to automatically load certificates from tokens.
# load_certs = yes
# Whether OS locking should be enabled for this module.
# os_locking = no
# Full path to the shared object file of this PKCS#11 module.
path = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
}
Подключение к сети
Подключите смарт-карту и инициализируйте подключение c помощью команды:
sudo systemctl stop strongswan-starter sudo systemctl start strongswan-starter
Проверить, что соединение прошло успешно, можно, например, выведя список своих ip адресов С помощью команды:
ip addr show
Среди них появится ваш виртуальный ip:

