FortiClient VPN no Linux sem depender do FortiClient
Quem trabalha com infraestrutura, redes ou ambientes corporativos provavelmente já precisou acessar uma VPN baseada em FortiGate.
No Windows, normalmente o caminho é instalar o FortiClient. No Linux, porém, dependendo da configuração utilizada pelo FortiGate, a situação pode ser bem menos simples, principalmente quando a autenticação envolve IKEv2 + PSK + EAP-MSCHAPv2.
Foi a partir desse problema que desenvolvi o projeto FortiClient VPN - DTIC.
🔗 Repositório:
https://github.com/Miranda3000-CPU/forti-ikev2-linux
O que o projeto faz?
A aplicação fornece uma interface gráfica para estabelecer uma conexão VPN IKEv2 com FortiGate utilizando:
- IKEv2
- PSK (Pre-Shared Key)
- EAP-MSCHAPv2
- strongSwan como motor VPN
- Debian/Ubuntu
- Interface gráfica para configuração e conexão
- Diagnóstico de problemas de conexão
A principal ideia é não implementar novamente o protocolo VPN na aplicação.
O projeto utiliza o strongSwan como motor e fica responsável pela configuração, gerenciamento da conexão e apresentação das informações para o usuário.
Por que não utilizar simplesmente o IKEv2 nativo do Windows?
Existe uma particularidade importante.
Em determinadas configurações, o FortiGate pode utilizar PSK para autenticação do gateway + EAP-MSCHAPv2 para autenticação do usuário.
O cliente IKEv2 nativo do Windows possui limitações nesse cenário, enquanto o strongSwan consegue trabalhar com essa combinação.
Por isso o projeto utiliza o mesmo motor de VPN nos diferentes ambientes.
No Linux
No Debian e Ubuntu, o projeto pode ser instalado através de um pacote .deb.
A instalação pode ser feita diretamente pela release:
sudo apt install ./forticlient-vpn_<versão>_all.deb
Também é possível compilar o pacote a partir do código-fonte.
O projeto mantém a versão centralizada no arquivo VERSION, e o processo de build utiliza essa informação para manter os artefatos sincronizados.
Diagnóstico também é parte do projeto
Um dos problemas que mais me incomodou durante o desenvolvimento foi diferenciar:
"A VPN não conecta"
de:
"O pacote IKEv2 nem sequer está chegando ao FortiGate"
Essas situações são completamente diferentes.
Por isso o projeto possui mecanismos de diagnóstico e logs do aplicativo e do motor strongSwan.
No Windows, por exemplo, o diagnóstico pode gerar um arquivo .zip contendo informações relevantes para investigação da falha.
Também é possível analisar o charon.log, que é onde o strongSwan registra os eventos do IKE.
Alguns erros são particularmente úteis:
AUTHENTICATION_FAILED
NO_PROPOSAL_CHOSEN
ID_MISMATCH
TS_UNACCEPTABLE
Cada um aponta para uma classe diferente de problema.
UDP 500 e 4500
Outro ponto importante durante o troubleshooting é entender que IKEv2 utiliza UDP, principalmente:
UDP/500
UDP/4500
Por isso, testar simplesmente:
TCP/500
TCP/4500
não é uma forma adequada de verificar se uma VPN IKEv2 está funcionando.
Um timeout TCP nessas portas não significa necessariamente que o FortiGate está inacessível.
No Windows, por exemplo, o projeto utiliza pktmon para ajudar a verificar se existe tráfego IKE chegando e retornando:
pktmon start --capture --comp nics --pkt-size 0 --file-name C:\Temp\ike.etl
# realizar a conexão pela aplicação
pktmon stop
pktmon etl2txt C:\Temp\ike.etl -o C:\Temp\ike.txt
Select-String "500|4500" C:\Temp\ike.txt
Isso ajuda a separar problemas de aplicação, autenticação e criptografia de problemas de rota, firewall ou ACL.
E o Windows?
O projeto também possui código experimental para Windows.
Nesse ambiente, o strongSwan é utilizado como motor, enquanto a aplicação fornece a interface gráfica e o gerenciamento da conexão.
Existem algumas particularidades no Windows, principalmente relacionadas ao serviço IKEEXT, instalação do IP virtual e funcionamento do backend de rede do strongSwan.
Por esse motivo, o instalador Windows ainda é tratado como experimental e não é distribuído nas releases públicas.
Segurança das credenciais
As credenciais são armazenadas localmente.
No Windows, o projeto utiliza DPAPI.
No Linux, o arquivo de credenciais é protegido com permissão 0600.
As credenciais não são enviadas para nenhum serviço externo. Elas são utilizadas pelo próprio cliente para autenticação no gateway VPN configurado pelo usuário.
O projeto é um FortiClient?
Não.
Esse ponto é importante.
O objetivo não é reproduzir o FortiClient ou substituir todas as suas funcionalidades.
A proposta é fornecer um cliente focado em VPN IKEv2 para ambientes FortiGate, utilizando o strongSwan como implementação do protocolo.
O nome do projeto é uma referência ao problema que ele resolve e ao ambiente onde foi desenvolvido.
Por que publiquei?
Porque esse tipo de problema parece simples até você realmente precisar investigar uma conexão VPN que não estabelece.
Quando existem várias camadas envolvidas:
Aplicação
↓
strongSwan
↓
IKEv2
↓
UDP 500/4500
↓
Firewall / NAT / Rota
↓
FortiGate
↓
Autenticação EAP
um simples "VPN não conecta" não diz praticamente nada sobre onde está o problema.
A ideia do projeto é justamente tornar essa cadeia mais transparente e facilitar tanto a utilização quanto o diagnóstico.
Código aberto
O projeto está disponível no GitHub:
https://github.com/Miranda3000-CPU/forti-ikev2-linux
Quem utiliza Debian/Ubuntu e precisa trabalhar com FortiGate + IKEv2 pode testar a solução, analisar o código, abrir issues e contribuir com melhorias.
Feedbacks sobre compatibilidade com diferentes configurações de FortiGate, distribuições Linux e cenários de rede são especialmente bem-vindos.