Задача:
Построить защищенный канал связи IPsec типа "route-based". С аутентификацией по сертификатам X.509 на CentOS.
Решение:
0) Устанавливаем StrongSwan
1) Заполучаем X.509-сертификат для хоста а также CA-сертификат.
Сертификат хоста должен быть в виде двух файлов: host-cert.crt host-key.key
Отдельно СА-сертификат: ca-cert.crt
2) Файлы сертификатов и ключа размещаем в соответствующие папки:
/etc/strongswan/ipsec.d/cacerts
/etc/strongswan/ipsec.d/certs
/etc/strongswan/ipsec.d/private
3) Правим файл ipsec.secrets, дописываем строку:
: RSA host-key.key
4) Перечитываем ключи командой:
strongswan rereadsecrets
5) Правим ipsec.conf. Записываем туда примерно следующее:
conn %default
ikelifetime=24h
keyingtries=%forever
ike=aes128-sha256-ecp384
esp=aes128-sha256-ecp384
keyexchange=ikev2
authby=pubkey
aggressive=no
compress=no
forceencaps=no
closeaction=restart
# LEFT - Local side
left=%any
leftauth=pubkey
leftid=centos1.hvostat.local
leftcert=host-cert.crt
leftsendcert=always
leftsubnet=0.0.0.0/0
# DPD
dpdaction=restart
dpddelay=10s
dpdtimeout=30s
conn SRX-MSK
# RIGHT - Remote side
right=%any
rightauth=pubkey
rightid="C=RU, L=Moscow, O=LongTail Security inc, OU=IT, CN=SRX-CAT.hvostat.local"
rightsubnet=0.0.0.0/0
lifetime=1h
auto=add
mark=42
Обратите внимание: в rightid надо добавлять всю строку "subject" целиком.
6) Правим strongswan.conf. Добавляем строку:
install_routes = no
9) Настраиваем роутинг и интерфейсы:
Для примера: локальный IP-адрес 1.2.3.4, удаленный 2.3.4.5. Удаленная подсеть 192.168.313.0/24.
Нюанс: безадресные тоннельные интерфейсы (в отличие от Juniper), насколько я смог выяснить после раскуривания мануалов и проведения экспериментов -
НЕ поддерживаются.
IP-адрес тоннельного интерфейса ip_vti1 может быть ЛЮБЫМ частным IP-адресом.
ip tunnel add ip_vti1 local 1.2.3.4 remote 2.3.4.5 mode vti key 42
ip link set mtu 1365 dev ip_vti1
sysctl -w net.ipv4.conf.ip_vti1.disable_policy=1
ip addr add 172.16.1.1/32 dev ip_vti1
ip link set ip_vti1 up
route add -net 192.168.313.0/24 dev ip_vti1
10) Стартуем:
systemctl start strongswan
11) "Прибиваем гвоздями":
systemctl enable strongswan
12) Настраиваем и стартуем IPsec с "противоположной" стороны.
13) Проверяем, как ходят пакеты.
14) На основе п.9 пишем юнит systemd:
...
[Unit]
Description=ip_vti1 tunnel if start.
After=network.target strongswan.service
...
15) ???
16) PROFIT !!!
__