Strongswan / Ipsec несколько подключений roadwarrior разные подсети

Strongswan / Ipsec несколько подключений roadwarrior разные подсети

Я пытаюсь настроить VPN-сервер StrongSwan, который должен обслуживать несколько (Windows 10 - внутренний VPN-клиент) подключений RoadWarrior, но в разных подсетях, в зависимости от сертификата клиента.

root@VPN:/# ipsec version

Linux strongSwan U5.8.2/K5.4.0-26-generic

В моей настройке есть 2 пары открытого и закрытого ключа, использующие разные CN, скажем, vpn-dev.mycom.comи vpn-liv.mycom.com. Используемый код ipsec.confвыглядит примерно так:

conn vpn-dev
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    ikelifetime=25200s
    leftid=vpn-dev.mycom.com
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.100.0.0/16-10.100.254.254/16
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    rightcert=ca-cert.pem
    eap_identity=%identity
    ike=aes128-sha1-modp1024


conn vpn-liv
    also=vpn-dev
    leftid=vpn-liv.mycom.com
    leftcert=liv-server-cert.pem
    rightsourceip=10.200.0.0/16-10.200.254.254/16
    rightcert=liv-ca-cert.pem

оба ключа сертификата также хранятся вipsec.secrets

vpn-dev.mycom.com : RSA "server-key.pem"
vpn-liv.mycom.com : RSA "liv-server-key.pem"

someuser : EAP "somepassword"

Однако как только я пытаюсь подключиться к экземпляру strongswan, соединение vpn-devиспользуется, и strongswan не переключается на подключение.vpn-liv

вот логи во время попытки:

Mar 30 08:47:48 VPN charon: 16[NET] received packet: from X.X.X.X[64558] to X.X.X.X[500] (1084 bytes)
Mar 30 08:47:48 VPN charon: 16[IKE] received MS NT5 ISAKMPOAKLEY v9 vendor ID
Mar 30 08:47:48 VPN charon: 16[IKE] received MS-Negotiation Discovery Capable vendor ID
Mar 30 08:47:48 VPN charon: 16[IKE] X.X.X.X is initiating an IKE_SA
Mar 30 08:47:48 VPN charon: 16[CFG] selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
Mar 30 08:47:48 VPN charon: 16[IKE] local host is behind NAT, sending keep alives
Mar 30 08:47:48 VPN charon: 16[IKE] remote host is behind NAT
Mar 30 08:47:48 VPN charon: 16[NET] sending packet: from X.X.X.X[500] to X.X.X.X[64558] (328 bytes)
Mar 30 08:47:48 VPN charon: 06[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 10[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 05[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 14[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (368 bytes)
Mar 30 08:47:48 VPN charon: 14[IKE] received cert request for "CN=PRIV VPN LIV CA"
Mar 30 08:47:48 VPN charon: 14[IKE] received 69 cert requests for an unknown ca
Mar 30 08:47:48 VPN charon: 14[CFG] looking for peer configs matching X.X.X.X[%any]...X.X.X.X[192.168.0.117]

Mar 30 08:47:48 VPN charon: 14[CFG] selected peer config 'vpn-dev' # << here it has not selected vpn-live, even if the earlier provided private key is only matching vpn-live

Mar 30 08:47:48 VPN charon: 14[IKE] initiating EAP_IDENTITY method (id 0x00)
Mar 30 08:47:48 VPN charon: 14[IKE] peer supports MOBIKE
Mar 30 08:47:48 VPN charon: 14[IKE] authentication of 'vpn-dev.mycom.com' (myself) with RSA     signature successful
Mar 30 08:47:48 VPN charon: 14[IKE] sending end entity cert "CN=vpn-dev.mycom.com"
Mar 30 08:47:49 VPN charon: 14[IKE] sending cert request for "CN=PRIV VPN DEV CA"
Mar 30 08:47:49 VPN charon: 14[IKE] sending cert request for "CN=PRIV VPN LIV CA"
Mar 30 08:47:49 VPN charon: 14[NET] sending packet: from X.X.X.X[500] to X.X.X.X[64548] (364 bytes)
Mar 30 08:47:49 VPN charon: 06[NET] received packet: from X.X.X.X[64618] to X.X.X.X[4500] (92 bytes)
Mar 30 08:47:49 VPN charon: 06[IKE] received (28) error notify

Цель по сути состоит в том, чтобы разместить 2 конечные точки VPN на одной машине, но предоставить разные диапазоны IP-адресов в зависимости от имени пользователя/используемого сертификата.

Локальная конфигурация выполняется с помощью (powershell)

Import-Certificate -FilePath liv-ca-cert.pem -CertStoreLocation 'Cert:\LocalMachine\Root'
Add-VpnConnection -Name 'LIV VPN' -ServerAddress 'vpn-live.mycom.com' -AuthenticationMethod Eap -IdleDisconnectSeconds 43200

Я что-то упускаю? Мои настройки неправильно настроены? Или это просто невозможно с StrongSwan и внутренним VPN-клиентом Windows 10?

решение1

Переключение соединений на основе идентификатора/сертификата сервера возможно только в том случае, если:

  • клиенты отправляют удаленную идентификацию (IDr) в своем запросе IKE_AUTH, чего многие клиенты не делают (в частности, Windows), в противном случае нет никакой идентификации для сопоставления, поэтому будет использовано первое соединение

или

  • если полные доменные имена сопоставлены с разными IP-адресами, которые можно настроить как локальные адреса для подключений, чтобы правильное подключение выбиралось на ранней стадии

решение2

Оказывается, использовать сертификат невозможно, поскольку он не используется для идентификации пользователей на сервере.

Поэтому я в конечном итоге использовал обходной путь, который описан вэтот ответчто помогает оценить eap_identiy.

Теперь мои клиенты используют один и тот же сертификат, но на основе логинов я могу решить, какую подсеть они будут использовать.

Теперь мой ipsec.conf выглядит примерно так:

conn eap-shared
   type=tunnel
   ike=aes128-sha1-modp1024
   rightauth=eap-mschapv2
   leftcert=server-cert.pem

conn eap-init
   also=eap-shared
   # this config is used to do the EAP-Identity exchange and the
   # authentication of client and server
   eap_identity=%identity
   # the following is used to force a connection switch after
   # the authentication completed
   rightgroups=thisseemsirrelevant
   auto=add

conn eap-liv
   also=eap-shared
   eap_identity=*@liv-some-domain.com
   rightsourceip=10.200.0.0/16-10.200.254.254/16
   auto=add

conn eap-dev
   also=eap-shared
   eap_identity=*@dev-some-domain.com
   rightsourceip=10.100.0.0/16-10.100.254.254/16
   auto=add

Возможно, это не самое элегантное решение, но в моем случае оно работает.

решение3

Для нескольких конфигураций подключения с одинаковым методом аутентификации Strongswan может выбрать правильный метод на основе личности клиента.

Например, используя две конфигурации подключения:

  1. Обе правые стороны, используя открытый ключ, мы можем использовать rightcaв качестве ограничения:
    conn dev-network_ikev2-cert
        rightauth=pubkey
        rightca="C=CN, O=Sample, CN=Develop CA"
        rightsourceip=10.100.0.0/16
        rightdns=8.8.8.8
    
    conn test-network_ikev2-cert
        rightauth=pubkey
        rightca="C=CN, O=Sample, CN=Testing CA"
        rightsourceip=10.200.0.0/16
        rightdns=8.8.8.8
  • В этой настройке клиент с сертификатами, выпущенными , Develop CAбудет выбирать конфигурацию dev-network_ikev2-certнапрямую.

  • Если клиент использует сертификаты, выданные Testing CA, strongswan сначала выберет конфигурацию dev-network_ikev2-cert, затем вывод constraint check failed: peer not authenticated by CA 'C=CN, O=Sample, CN=Develop CA'и выберет следующий test-network_ikev2-cert.

  1. Обе правые стороны, использующие eap-mschapv2, мы можем использовать eap_identityв качестве ограничения:
    conn dev-network_ikev2-eap
        rightauth=eap-mschapv2
        eap_identity=*@dev.com
        rightsourceip=10.100.0.0/16
        rightdns=8.8.8.8
    
    conn test-network_ikev2-eap
        rightauth=eap-mschapv2
        eap_identity=*@test.com
        rightsourceip=10.200.0.0/16
        rightdns=8.8.8.8

Этот метод использует Flo. Strongswan будет выполнять ту же логику проверки, что и при использовании открытого ключа.

  • Если клиент использует идентификатор в *@test.com, strongswan сначала выберет dev-network_ikev2-eap, затем найдет его constraint check failed: EAP identity '*@dev.com' requiredи выберет следующий test-network_ikev2-eap.

Надеюсь, это поможет.

Связанный контент