Feb 05, 2020 11:18
Довелось попробовать настроить IPSec в туннельном режиме под FreeBSD в «новом стиле», с созданием системного интерфейса ipsec0 со всеми причиндалами, включая MTU, чего раньше очень не хватало при настройке туннеля в «традиционном» стиле одними политиками IPSec, без туннельного интерфейса.
Удалённый пир нам не подконтролен (головная контора), требует согласования туннеля через IKEv2, не выдаёт дополнительных адресов на туннель.
Сначала поставил strongswan-5.8.2_1 из портов и настроил его через новомодный vici-интерфейс. Создал файл с произвольным именем и расширением .conf:
# cat /usr/local/etc/swanctl/conf.d/hq.conf
connections {
hq {
version = 2
pull = no
mobike = no
send_certreq = no
dpd_delay = 5
keyingtries = 0
local_addrs = 1.1.1.1
local_port = 500
remote_addrs = 2.2.2.2
remote_port = 500
proposals = aes256-sha256-modp2048
reauth_time = 28800
local {
auth = psk
id = 1.1.1.1
}
remote {
}
children {
net-net {
mode = tunnel
dpd_action = restart
ipcomp = yes
copy_df = no
start_action = start
close_action = start
reqid = 100
# policies = no
local_ts = 192.168.18.0/24
remote_ts = 10.0.0.0/8,192.168.21.0/24
esp_proposals = aes256-sha256-modp2048
}
}
}
}
secrets {
ike-hq {
id-hq = 1.1.1.1
secret = XXX
}
}
#EOF
В этом виде после запуска strongswan согласует IPSec в туннельном режиме, но системный интерфейс ipsec0 не используется и strongswan сам инсталлирует в ядро и политики SPD, и маршруты до удалённых сетей в таблицу маршрутизации. Туннель, тем не менее, работает.
Чтобы теперь добавить в картинку p2p-интерфейс ipsec0, добавляем в /usr/local/etc/strongswan.d/charon.conf команду "install_routes = no" внутрь блока charon {}, так что strongswan перестаёт сам добавлять маршруты до сетей 10.0.0.0/8,192.168.21.0/24 через внешний интерфейс (WAN) и раскомментируем "policies = no" в hq.conf (см. выше), чтобы strongswan не добавлял SPD в ядро, их ядро само создаёт при использовании route-based IPSec-туннеля.
Остальные настройки в /etc/rc.conf по такому типу:
cloned_interfaces="ipsec0"
ifconfig_ipsec0="tunnel 1.1.1.1 2.2.2.2 reqid 100 mtu 1460 up"
static_routes="hq1 hq2"
route_hq1="10.0.0.0/8 -iface ipsec0"
route_hq2="192.168.21.0/24 -iface ipsec0"
strongswan_enable="YES"
strongswan_interface="vici"
Индекс 100 после слова reqid должен быть одинаковым в настройках одного и того же туннеля в rc.conf и в конфигурации strongswan, а если есть ещё туннели, то отличаться для разных туннелей.
Update: Добавил keyingtries = 0 (см. выше), так как оказалось, что без этого при запуске strongswan делает 5 переповторов при попытке подключиться к пиру и если он в это время недоступен, прекращает дальшейшие попытки. Нулевое значение заставляет его делать бесконечное число повторов (каждый с 5 переповторами). Кроме того, в /usr/local/etc/strongswan.d/charon.conf полезно прописать make_before_break = yes и retransmit_base = 1 - последнее для того, чтобы сильно ускорить восстановление туннеля после временных обрывов из-за перезагрузки пира или просто аварии по трассе до него.
Update 2: добавил close_action = start, без этого strongswan может бросить попытки восстановить работу туннеля при обрыве.
ipsec,
#eof,
strongswan,
networking,
freebsd