Пользователи iPhone не подключаются к StrongSwan VPN, а пользователи Android и Windows 10 подключаются?

У меня есть StrongSwan VPN, который по какой-то неизвестной мне причине не может подключить пользователей iOS к моему VPN серверу.

Несколько кратких заметок:

  • Мой сервер StrongSwan является передним для VPN клиентов, которые подключаются к моей сети. Я использовал WireGuard для внутренней маршрутизации между сайтами.

  • Все пользователи StrongSwan VPN проверяются на сервере FreeRadius.

  • Клиенты StrongSwan получают IP в подсети 192.168.201.0/24, а магистральная сеть WireGuard работает в подсети 192.168.200.0/24.

  • Всем клиентам также передается публичный IPv6 адрес, принадлежащий подсети /48, назначенной мне.

Я запускаю StrongSwan на Ubuntu 20.04 и мой файл конфигурации находится в папке /etc/swanctl/config/ и включен по умолчанию из-за того, что имя файла заканчивается на .conf.

Содержание папки следующее:

# Default VPN server settings for all connections
conn-defaults {
    local_addrs = PUBLIC_IPV4, PUBLIC_IPV6

    local {
      auth = pubkey
      certs = vpn-ecdsa.cer
      id = vpn.example.com
    }

    version = 2
    send_certreq = no
    send_cert = always
    unique = never
    fragmentation = yes
    encap = yes
    dpd_delay = 60s

    rekey_time = 0s
}

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

connections
{
  # Generic Android configuration that is extended further down.
  #
  # Works with StrongSwan VPN client for Android
  conn-unix : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      net-unix : child-defaults {
      }

      esp_proposals = aes128gcm128-x25519
    }

    proposals = aes128-sha256-x25519
  }

  # All Windows klients matches this rule as username validation 
  # is done by 'eap_start = yes' in strongswan.conf. 
  #
  # Works with Windows 10 built-in VPN client.
  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6

  }

  # A very similar configuration to Windows clients 
  # configuration, except iOS uses 2048 bit keys, 
  # while Windows uses 1024 bit keys.
  #
  # Does NOT work in its current state.
  conn-ios : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha2_256
      pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6

    }

    proposals = aes256-sha256-prfsha256-modp2048
  }

  # Android users is matched against this connection as they are 
  # running the app StrongSwan VPN client. Username is passed in the
  # 'id' field to StrongSwan VPN server.
  conn-unix-site : connections.conn-unix {
    remote {
      id = *@site.example.com
    }
    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
  }
}

pools
{
   IkeVPN-site-ipv4 {
      addrs = 192.168.201.0/24
      dns = 192.168.200.1
   }

   IkeVPN-site-ipv6 {
      addrs = 2001:db8:cafe::/97
      dns = 2001:db8::1
   }
}

Моя конфигурация создана с использованием структуры, приведенной на следующей веб-странице:

https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf#Referencing-other-Sections

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

Если вы не знакомы с этой структурой, то следующая конфигурация для conn-ios должна считаться эквивалентной:

conn-ios {
   # Obtained from conn-default
   local_addrs = PUBLIC_IPV4, PUBLIC_IPV6

   local {
      auth = pubkey
      certs = vpn-ecdsa.cer
      id = vpn.example.com
   }

   version = 2
   send_certreq = no
   send_cert = always
   unique = never
   fragmentation = yes
   encap = yes
   dpd_delay = 60s

   rekey_time = 0s

   # Obtained from eap-defaults
   remote {
      auth = eap-radius
      id = %any
      eap_id = %any
   }

   # Obtained from original conn-ios profile above.
   children {
      net {
         local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha2_256
      pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
   }

   proposals = aes256-sha256-prfsha256-modp2048
}

Сертификат сервера, указанный в разделе conn-default - это сертификат ECDSA, полученный от Let's Encrypt с помощью Acme.sh.

Значения шифрования для proposalsи esp_proposals в конфигурации iOS взяты из подсказки в: https://wiki.strongswan.org/projects/strongswan/wiki/AppleClients.

При тестировании всех комбинаций Android и Windows пользователи подключаются без проблем, но когда кто-то пытается войти в систему с помощью iPhone, соединение прерывается.

Вывод из журнала при попытке подключения iPhone выглядит следующим образом:

10[IKE] CLIENT_IPV4 is initiating an IKE_SA
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] configured proposals: IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
10[IKE] no matching proposal found, trying alternative config
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] configured proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
10[IKE] no matching proposal found, trying alternative config
10[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
10[IKE] remote host is behind NAT
10[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(CHDLESS_SUP) N(MULT_AUTH) ]
10[NET] sending packet: from PUBLIC_IPV4[500] to CLIENT_IPV4[6452] (456 bytes)
06[NET] received packet: from CLIENT_IPV4[13549] to PUBLIC_IPV4[4500] (512 bytes)
06[ENC] unknown attribute type INTERNAL_DNS_DOMAIN
06[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
06[CFG] looking for peer configs matching PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[PRIVATE_CLASS_A_ADDRESS]
06[CFG] selected peer config 'conn-ios'
06[IKE] initiating EAP_IDENTITY method (id 0x00)
06[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
06[IKE] peer supports MOBIKE
06[IKE] authentication of 'vpn.example.com' (myself) with ECDSA-256 signature successful
06[IKE] sending end entity cert "CN=vpn.example.com"
06[IKE] sending issuer cert "C=US, O=Let's Encrypt, CN=R3"
06[ENC] generating IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/ID ]
06[ENC] splitting IKE message (2816 bytes) into 3 fragments
06[ENC] generating IKE_AUTH response 1 [ EF(1/3) ]
06[ENC] generating IKE_AUTH response 1 [ EF(2/3) ]
06[ENC] generating IKE_AUTH response 1 [ EF(3/3) ]
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (1236 bytes)
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (1236 bytes)
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (500 bytes)
11[JOB] deleting half open IKE_SA with CLIENT_IPV4 after timeout

Пользователи iPhone подключаются с помощью встроенного VPN клиента, используя следующие настройки:

  • Тип IKEv2

  • Описание: VPN сервер

  • Сервер: vpn.example.com

  • Удаленный id: vpn.example.com

  • Локальный id: BLANK

  • Аутентификация по имени пользователя и паролю.

  • Имя пользователя: user@site.example.com

  • Пароль: ItIsASecret

Кто-нибудь знает, почему соединение замирает у пользователей iOS после загрузки профиля conn-ios?

UPDATE И мы взлетели! :-)

По совету @ecdsa я поменял сертификат на 2048-битный RSA сертификат.

Мой Radius сервер вызывается. Аутентификация пользователя проходит успешно и клиент получает ip-адрес. Я счастлив. :-)

Моя конфигурация для conn-ios теперь такова:

  conn-ios : conn-defaults, eap-defaults {

    # Overriding defaults from 'conn-default'
    local {
      auth = pubkey
      certs = vpn-rsa.cer
      id = vpn.example.com
    }

    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha256
    }

    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
    proposals = aes256-sha256-prfsha256-modp2048
  }

Все остальное - как и в моей начальной конфигурации.

2
задан 15 June 2021 в 13:53
1 ответ

Как видно из журнала, клиент не поддерживает RFC 7427 (в противном случае произошел бы обмен уведомлениями об алгоритмах хэширования во время IKE_SA_INIT), который определяет гибкую аутентификацию на основе подписи.

Хотя IKEv2 поддерживает ECDSA и без этого расширения, RFC 4754 добавил лишь ограниченную поддержку для него (могут использоваться только три кривые NIST, и для каждой назначен определенный хэш-алгоритм). Поэтому возможно, что клиенты Apple принимают/используют ECDSA, только если он явно настроен в профиле конфигурации (есть опция CertificateType, которая может быть установлена, например, на ECDSA256).

Если использование профилей конфигурации невозможно, единственной альтернативой является использование серверных сертификатов RSA, по крайней мере до тех пор, пока Apple не внедрит поддержку RFC 7427 в свой клиент IKEv2.

0
ответ дан 28 July 2021 в 12:33

Теги

Похожие вопросы