Route-based IPSec tunnel для FreeBSD

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

Previous post Next post
Up