У меня есть 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
.
Содержание следующее:
# Настройки VPN-сервера по умолчанию для всех подключений
подключения по умолчанию {
local_addrs = PUBLIC_IPV4, PUBLIC_IPV6
местный {
авторизация = публичный ключ
сертификаты = vpn-ecdsa.cer
идентификатор = vpn.example.com
}
версия = 2
send_certreq = нет
send_cert = всегда
уникальный = никогда
фрагментация = да
инкап = да
dpd_delay = 60 с
rekey_time = 0 с
}
# Метод входа по умолчанию
eap-по умолчанию {
удаленный {
авторизация = eap-радиус
идентификатор =% любой
eap_id = % любой
}
}
связи
{
# Общая конфигурация Android, расширенная ниже.
#
# Работает с VPN-клиентом StrongSwan для Android
conn-unix : conn-defaults, eap-defaults {
дети {
сеть {
local_ts = 0.0.0.0/0, ::/0
}
net-unix: дочерние значения по умолчанию {
}
esp_proposals = aes128gcm128-x25519
}
предложения = aes128-sha256-x25519
}
# Все клиенты Windows соответствуют этому правилу проверки имени пользователя
# делается с помощью 'eap_start = yes' в strongswan.conf.
#
# Работает со встроенным VPN-клиентом Windows 10.
conn-windows: conn-defaults, eap-defaults {
дети {
сеть {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha256-prfsha256-modp1024
}
предложения = aes256-sha256-prfsha256-modp1024
пулы = IkeVPN-сайт-ipv4, IkeVPN-сайт-ipv6
}
# Очень похожая конфигурация для клиентов Windows
# конфигурация, за исключением того, что iOS использует 2048-битные ключи,
# в то время как Windows использует 1024-битные ключи.
#
# НЕ работает в текущем состоянии.
conn-ios : conn-defaults, eap-defaults {
дети {
сеть {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha2_256
пулы = IkeVPN-сайт-ipv4, IkeVPN-сайт-ipv6
}
предложения = aes256-sha256-prfsha256-modp2048
}
# Пользователи Android сопоставляются с этим соединением как есть
# запуск приложения StrongSwan VPN-клиент. Имя пользователя передается в
# поле 'id' для VPN-сервера StrongSwan.
conn-unix-сайт : connection.conn-unix {
удаленный {
идентификатор = *@site.example.com
}
пулы = IkeVPN-сайт-ipv4, IkeVPN-сайт-ipv6
}
}
бассейны
{
IkeVPN-сайт-ipv4 {
адрес = 192.168.201.0/24
DNS = 192.168.200.1
}
IkeVPN-сайт-ipv6 {
адрес = 2001:db8:кафе::/97
DNS = 2001:db8::1
}
}
Моя конфигурация создается с использованием структуры, приведенной на следующей веб-странице:
https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf#Referencing-other-Sections
Причина, по которой я его использую, заключается в том, чтобы не повторять одни и те же настройки конфигурации во всех моих профилях подключения.
Если вы не знакомы с этой настройкой, следующая конфигурация для conn-ios
это следует считать эквивалентным:
conn-ios {
# Получено из conn-default
local_addrs = PUBLIC_IPV4, PUBLIC_IPV6
местный {
авторизация = публичный ключ
сертификаты = vpn-ecdsa.cer
идентификатор = vpn.example.com
}
версия = 2
send_certreq = нет
send_cert = всегда
уникальный = никогда
фрагментация = да
инкап = да
dpd_delay = 60 с
rekey_time = 0 с
# Получено из eap-defaults
удаленный {
авторизация = eap-радиус
идентификатор =% любой
eap_id = % любой
}
# Получено из исходного профиля conn-ios выше.
дети {
сеть {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha2_256
пулы = IkeVPN-сайт-ipv4, IkeVPN-сайт-ipv6
}
предложения = aes256-sha256-prfsha256-modp2048
}
Сертификат сервера, указанный в подключение по умолчанию
Раздел представляет собой сертификат ECDSA, полученный от Let's Encrypt с использованием Acme.sh.
Значения шифрования для предложения
и esp_proposals
в конфигурации iOS берется из подсказки в: https://wiki.strongswan.org/projects/strongswan/wiki/AppleClients.
При тестировании всех комбинаций Android или Windows пользователи подключаются без проблем, но когда кто-то пытается войти с помощью iPhone, соединение останавливается.
Вывод из журнала при попытке подключения iPhone выглядит следующим образом:
10[IKE] CLIENT_IPV4 инициирует 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]: IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
10[IKE] Соответствующее предложение не найдено, пробуем альтернативную конфигурацию
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]: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
10[IKE] Соответствующее предложение не найдено, пробуем альтернативную конфигурацию
10[CFG] выбрал предложение: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
10[IKE] удаленный хост находится за NAT
10[ENC] генерирует ответ IKE_SA_INIT 0 [SA KE Нет N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(CHDLESS_SUP) N(MULT_AUTH) ]
10[NET] отправка пакета: от PUBLIC_IPV4[500] до CLIENT_IPV4[6452] (456 байт)
06[NET] полученный пакет: от CLIENT_IPV4[13549] до PUBLIC_IPV4[4500] (512 байт)
06[ENC] неизвестный тип атрибута INTERNAL_DNS_DOMAIN
06[ENC] проанализированный запрос IKE_AUTH 1 [IDi N(INIT_CONTACT) IDr CPRQ(MASK ADDR DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
06[CFG] ищет одноранговые конфигурации, соответствующие PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[PRIVATE_CLASS_A_ADDRESS]
06[CFG] выбрана одноранговая конфигурация 'conn-ios'
06[IKE] инициирует метод EAP_IDENTITY (id 0x00)
06[IKE] получил ESP_TFC_PADDING_NOT_SUPPORTED, не используя заполнение ESPv3 TFC
06 [IKE] одноранговый узел поддерживает MOBIKE
06[IKE] аутентификация 'vpn.example.com' (я) с подписью ECDSA-256 успешна
06[IKE] отправляет сертификат конечного объекта "CN=vpn.example.com"
06[IKE] отправляет сертификат издателя "C=US, O=Let's Encrypt, CN=R3"
06[ENC] генерация ответа IKE_AUTH 1 [IDr CERT CERT AUTH EAP/REQ/ID]
06[ENC] разделение сообщения IKE (2816 байт) на 3 фрагмента
06[ENC] генерация ответа IKE_AUTH 1 [EF(1/3)]
06[ENC] генерация ответа IKE_AUTH 1 [EF(2/3)]
06[ENC] генерация ответа IKE_AUTH 1 [EF(3/3)]
06[NET] отправка пакета: от PUBLIC_IPV4[4500] до CLIENT_IPV4[13549] (1236 байт)
06[NET] отправка пакета: от PUBLIC_IPV4[4500] до CLIENT_IPV4[13549] (1236 байт)
06[NET] отправка пакета: от PUBLIC_IPV4[4500] до CLIENT_IPV4[13549] (500 байт)
11[ЗАДАНИЕ] удаление полуоткрытого IKE_SA с CLIENT_IPV4 после тайм-аута
Пользователи iPhone подключаются с помощью встроенного VPN-клиента со следующими настройками:
Тип IKEv2
Описание: VPN-сервер.
Сервер: vpn.example.com
Удаленный идентификатор: vpn.example.com
Местный идентификатор: ПУСТО
Аутентификация по имени пользователя и паролю.
Имя пользователя: [email protected]
Пароль: ItIsASecret
Кто-нибудь знает, почему соединение останавливается для пользователей iOS, когда он загружает conn-ios
профиль?
ОБНОВИТЬ
А у нас старт! :-)
По совету @ecdsa я переключил сертификат на 2048-битный сертификат RSA.
Мой сервер Radius вызывается. Аутентификация пользователя прошла успешно, и клиент получает IP-адрес. Я счастлив. :-)
Моя конфигурация для conn-ios
сейчас:
conn-ios : conn-defaults, eap-defaults {
# Переопределение значений по умолчанию из 'conn-default'
местный {
авторизация = публичный ключ
сертификаты = vpn-rsa.cer
идентификатор = vpn.example.com
}
дети {
сеть {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha256
}
пулы = IkeVPN-сайт-ipv4, IkeVPN-сайт-ipv6
предложения = aes256-sha256-prfsha256-modp2048
}
Все остальное как есть из моей первоначальной конфигурации.