Eu tenho uma VPN StrongSwan que por algum motivo desconhecido para mim não pode conectar usuários iOS ao meu servidor VPN.
Algumas notas rápidas:
Meu servidor StrongSwan é a frente para clientes VPN que se conectam à minha rede. Eu usei
WireGuard
para meu roteamento site a site de back-end.Todos os usuários do StrongSwan VPN são validados em um
FreeRadius
servidor.Os clientes StrongSwan são atribuídos a um IP na
192.168.201.0/24
sub-rede, enquanto a rede de backbone WireGuard está sendo executada na192.168.200.0/24
sub-rede.Todos os clientes também recebem um endereço IPv6 público pertencente a uma sub-rede /48 atribuída a mim.
Eu corro o StrongSwan no Ubuntu 20.04 e meu arquivo de configuração está localizado na /etc/swanctl/config/
pasta e é incluído por padrão devido ao nome do arquivo terminar em .conf
.
O conteúdo é o seguinte:
# 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
}
}
Minha configuração é criada usando a estrutura fornecida na seguinte página da web:
https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf#Referencing-other-Sections
A razão pela qual eu o uso é evitar repetir as mesmas configurações em todos os meus perfis de conexão.
Se você não estiver familiarizado com essa configuração, a configuração a seguir conn-ios
deve ser considerada equivalente:
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
}
O certificado do servidor listado na conn-default
seção é um certificado ECDSA obtido da Let's Encrypt usando Acme.sh.
Os valores de criptografia para proposals
e esp_proposals
na configuração do iOS são obtidos da dica em: https://wiki.strongswan.org/projects/strongswan/wiki/AppleClients .
Ao testar todas as combinações de usuários de Android ou Windows, os usuários se conectam sem problemas, mas quando alguém tenta fazer login usando o iPhone, a conexão é interrompida.
A saída do log quando um iPhone tenta se conectar é a seguinte:
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
Os usuários do iPhone estão se conectando usando o cliente VPN integrado usando as seguintes configurações:
Digite IKEv2
Descrição: servidor VPN
Servidor: vpn.example.com
ID remoto: vpn.example.com
Código local: BRANCO
Autenticação de nome de usuário e senha.
Nome de usuário: [email protected]
Senha: ItIsASecret
Alguém sabe por que a conexão trava para usuários do iOS quando carrega o conn-ios
perfil?
ATUALIZAÇÃO E temos decolagem! :-)
De acordo com o conselho do @ecdsa, mudei o certificado para um certificado RSA de 2048 bits.
Meu servidor Radius é chamado. A autenticação do usuário é bem-sucedida e o cliente obtém um endereço IP atribuído. Eu estou feliz. :-)
Minha configuração para conn-ios
agora é:
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
}
Todo o resto está como está na minha configuração inicial.
Como podemos ver no log, o cliente não suporta RFC 7427 (caso contrário, as notificações do algoritmo de hash seriam trocadas durante
IKE_SA_INIT
), que define a autenticação flexível baseada em assinatura.Embora o IKEv2 também suporte ECDSA sem essa extensão, o RFC 4754 adicionou apenas suporte limitado para ele (somente as três curvas NIST podem ser usadas e cada uma tem um algoritmo de hash específico atribuído). Portanto, é possível que os clientes Apple só aceitem/use ECDSA se configurado explicitamente em um perfil de configuração (há uma opção
CertificateType
que pode ser definida como, por exemplo,ECDSA256
).Se o uso de perfis de configuração não for uma opção, a única alternativa é usar certificados de servidor RSA , pelo menos até que a Apple implemente suporte para RFC 7427 em seu cliente IKEv2.