IKEv2 IPSec Road Warrior для FreeBSD
strongswan-5.9.11_3
, плюс для клиенских подключений создаем интерфейсы ipsecX
ради удобства настройки MTU, роутинга, диагностики при помощи bpf (tcpdump/tshark/wireshark/etc.), SNMP-статистики и прочего.
Авторизация клиентов методом IKEv2 IPSEC MS-CHAPv2. Условное имя VPN-сервера для клиентов vpn.domain.net.
- Первым делом добавляем в
/usr/local/etc/strongswan.d/charon.conf
:install_routes = no install_virtual_ip = no make_before_break = yes retransmit_base = 1
Если у шлюза более одного интерфейса и необходимо, чтобы агент использовал порты 500/4500 только на IP-адресах одного из них, можно также добавить:
interfaces_use = bge0
Для более подробных журналов, туда же:
syslog { IKE2 { log_level = 9 } daemon { ike_name = yes knl = 3 } }
- Далее создаём
/usr/local/etc/swanctl/conf.d/vpn.conf
:connections { vpn { version = 2 send_cert = always pull = 0 dpd_delay = 5 local_addrs = X.X.X.X # IP-адрес, в который ресолвится vpn.domain.net # pools = localpool pools = radius proposals = aes256-sha256-modp2048,aes256-sha256-modp1024,aes256-sha256-modp4096,default reauth_time = 43200 local { auth = pubkey certs = vpn.domain.net.pem id = fqdn:vpn.domain.net } remote { # auth = eap-mschapv2 auth = eap-radius eap_id = %any } children { roadw-eap { mode = tunnel ipcomp = no copy_df = no start_action = start close_action = clear dpd_action = clear reqid = 0 policies = no # local_ts = 192.168.1.0/24 local_ts = 0.0.0.0/0 remote_ts = dynamic esp_proposals = aes256-sha256-modp2048,aes256-sha256-modp1024,aes256-sha256-modp4096,default rekey_time = 0 # workaroung Windows bug updown = /usr/local/etc/swanctl/conf.d/updown.sh } } } }
В данном случае предполагается авторизация пользователей по паролю через RADIUS-сервер (для этого strongswan нужно пересобрать из портов, включив опции EAPDYNAMIC и EAPRADIUS, а заодно добавьте какие вам нравятся ещё типа EAPSIMFILE, FARP, IPSECKEY, MEDITATION, UNITY и XAUTH). При локальной авторизации нужно убрать строчку со словом
eap-radius
, раскомментировать предыдущую строчку сeap-mschapv2
(то же с именем пула в строчкеpools
) и добавить описание локального пула IP-адресов для выдачи пользователям в конец файла:pools { localpool { addrs = 192.168.1.64-192.168.1.190 dns = 192.168.1.1 } }
Закомментированный вариант
local_ts
соответствует доступу через VPN только в указанную сеть, а раскомментированный для хождения через VPN в публичный интернет. - При авторизации через RADIUS добавляем в
/usr/local/etc/strongswan.d/charon/eap-radius.conf
внутрь секцииservers {}
одну или более секций с произвольными именами, описывающих используемые серверы RADIUS:myserver { address = X.X.X.Y port = 1812 retransmit_base = 1.0 retransmit_tries = 3 secret = XXX sockets = 5 nas_identifier = vpn.domain.net }
- И, наконец, создаём исполняемый скрипт
/usr/local/etc/swanctl/conf.d/updown.sh
:#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin mtu=1460 me=X.X.X.X # IP-адрес, в который ресолвится vpn.domain.net case "$PLUTO_CONNECTION" in roadw-eap) case "$PLUTO_VERB" in up-client) if [ -n "$PLUTO_REQID" ]; then ifname=$(ifconfig -g "r${PLUTO_REQID}g") if [ -z "$ifname" ]; then ifname=$(ifconfig ipsec create \ inet $me "$PLUTO_PEER_SOURCEIP" netmask 255.255.255.255 \ tunnel "$PLUTO_ME" "$PLUTO_PEER" \ reqid "$PLUTO_REQID" group "r${PLUTO_REQID}g" mtu $mtu \ description "ikev2: ${PLUTO_XAUTH_ID} \ $PLUTO_PEER_SOURCEIP $PLUTO_ME $PLUTO_PEER" ) fi fi ;; down-client) if [ -n "$PLUTO_REQID" ]; then ifname=$(ifconfig -g "r${PLUTO_REQID}g") [ -n "$ifname" ] && ifconfig "$ifname" destroy fi ;; esac ;; esac exit 0
- Осталось только положить секретный ключ от сертификата сервера в формате PEM в файл
/usr/local/etc/swanctl/private/vpn.domain.net.key
, а сам сертификат также в формате PEM в файл/usr/local/etc/swanctl/x509/vpn.domain.net.pem
и запустить агента, прописав в/etc/rc.conf
:strongswan_enable="YES" strongswan_interface="vici"
- И даём команду
service strongswan start