Meu servidor VPN strongswan está autenticando clientes VPN em um servidor Freeradius local.
Todos os logs de usuários são enviados por proxy para o servidor radius remoto, que valida os usuários em relação a um servidor Samba Active Directory.
No entanto, eu me deparei com um pouco de um problema.
A seção a seguir funciona para usuários do Android usando o cliente VPN Strongswan:
connections
{
rw-eap {
local_addrs = SERVER_PUBLIC_IPV4, SERVER_PUBLIC_IPV6
local {
auth = pubkey
certs = example-ecdsa.cer
id = vpn.example.com
}
remote-android {
auth = eap-radius
id = *@example.com
}
}
}
A saída de monitoramento do Freeradius revela coisas como:
(5) Received Access-Request Id 135 from 192.168.200.1:47851 to 192.168.200.1:1812 length 193
(5) User-Name = "[email protected]"
(5) NAS-Port-Type = Virtual
(5) Service-Type = Framed-User
(5) NAS-Port = 4
(5) NAS-Port-Id = "rw-eap"
(5) NAS-IP-Address = SERVER_PUBLIC_IPV4
(5) Called-Station-Id = "SERVER_PUBLIC_IPV4[4500]"
(5) Calling-Station-Id = "CLIENT_IPV4[3988]"
E o log do Strongswan dá:
06[IKE] IKE_SA rw-eap[6] established between SERVER_PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[[email protected]]
No entanto, ao tentar se conectar ao servidor a partir de um cliente Windows, ele está praticamente morto, a menos que eu use a seguinte configuração no Strongswan:
connections
{
rw-windows {
local_addrs = SERVER_PUBLIC_IPV4, SERVER_PUBLIC_IPV6
local {
auth = pubkey
certs = example-ecdsa.cer
id = vpn.example.com
}
remote-windows {
auth = eap-radius
# Don't use *@example.com here - as windows does not pass username as id,
# so this config will not match in that case.
id = %any
}
}
}
Usando essa configuração, posso pelo menos fazer com que o Strongswan inicie a autenticação Radius, mas não vou muito além disso.
A saída do Freeradius me dá coisas como:
(21) Received Access-Request Id 151 from 192.168.200.1:47851 to 192.168.200.1:1812 length 306
(21) User-Name = "\300\250\000d"
(21) NAS-Port-Type = Virtual
(21) Service-Type = Framed-User
(21) NAS-Port = 7
(21) NAS-Port-Id = "rw-windows"
(21) NAS-IP-Address = SERVER_PUBLIC_IPV4
(21) Called-Station-Id = "SERVER_PUBLIC_IPV4[4500]"
(21) Calling-Station-Id = "CLIENT_PUBLIC_IPV4[3989]"
E isso resulta na seguinte entrada no log do Strongswan:
06[CFG] looking for peer configs matching SERVER_PUBLIC_IPV4[%any]...CLIENT_PUBLIC_IPV4[CLIENT_PRIVATE_IPV4]
Isso me leva a algumas perguntas como:
Primeiro: Por que o cliente VPN do Windows não passa o nome de usuário como seu ID, como o Strongswan faz?
Segundo: Por que o nome de usuário é passado de Strongswan para Freeradius
"\300\250\000d"
?
Um pouco mais de depuração no cliente Windows:
O exemplo acima é gerado ao usar EAP-TTLS no lado do cliente com MS-CHAP v2.
Ao usar o MS-CHAP, o Freeradius é invocado com o nome de usuário correto, mas quando a solicitação é proxy, a autenticação do nome de usuário/senha falha.
Acho que o login do MS-CHAP precisa ser encapsulado ou algo assim, pois a codificação da solicitação de autenticação não é a mesma de quando os usuários do Android se conectam?
A resposta para ambas as suas perguntas é a mesma: o Windows envia seu endereço IP como identidade IKE (que é então encaminhada literalmente como atributo User-Name na mensagem RADIUS).
Em vez disso, você deve configurar seu servidor RADIUS para fazer uma troca EAP-Identity (se você configurou
eap_start = yes
em strongswan.conf ), ou deixar que o strongSwan faça isso habilitando o plug-in eap-identity e configurandoeap_id = %any
nasremote...
seções.