dadv: (Default)
Choose your future ([personal profile] dadv) wrote2020-02-05 11:57 am

Route-based IPSec tunnel для FreeBSD

Довелось попробовать настроить 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
        stop_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 может бросить попытки восстановить работу туннеля при обрыве.


Post a comment in response:

This account has disabled anonymous posting.
(will be screened if not validated)
If you don't have an account you can create one now.
No Subject Icon Selected
More info about formatting

Loading anti-spam test...

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org