Na esteira do tutorial sobre OpenVPN e depois de algumas experiências com VPN baseada em IPSEC, segue uma rápida comparação entre os dois protocolos que eu acho interessante compartilhar, e é interessante a qualquer um que esteja pensando em criar uma infra-estrutura de VPN.
O IPSEC foi concebido como uma extensão de terceira camada ao TCP/IP, ou seja estende o próprio protocolo IP. Inicialmente para o IPv6, depois adaptado para o IPv4.
A idéia original do IPSEC é permitir a comunicação segura transparente entre quaisquer dois computadores da Internet, desde que os dois implementem IPSEC. Se os dois têm IPSEC, automaticamente há troca de chaves e criptografia. Esse modo de funcionamento do IPSEC denomina-se "modo transporte".
As informações criptográficas são transportadas em cabeçalhos opcionais do IP, de modo que as camadas acima (transporte e aplicação) nem ficam sabendo que a conexão é segura. Apenas a troca das chaves (IKE) usa pacotes UDP na porta 500.
Para a fase IKE, em geral todo computador capaz de IPSEC tem um serviço "user-level" (ou seja, um processo normal) que atenda a porta 500. Uma vez trocadas as chaves, todo o resto da sessão é gerenciada pelo kernel por motivos de performance - afinal IPSEC é para ser transparente, portanto não pode ser um empecilho ao desempenho.
O IPSEC modo transporte não pegou na Internet, e dificilmente vai pegar, por uma série de motivos:
1) Para que as chaves trocadas sejam confiáveis, é necessário haver uma PKI (infra-estrutura de chaves públicas) global. O mais próximo disso que temos é a PKI de certificados X.509, utilizados em servidores Web seguros. Só que obter um certificado "legítimo" custa dinheiro, dificilmente cada computador da Internet teria um certificado pago.
2) A difusão das chaves tem de ser eficiente e distribuída. O sistema imaginado para essa difusão, o DNSSEC, também não está no ar.
3) O DNSSEC associa uma chave por IP, o que implica que um computador protegido por IPSEC tenha IP fixo. Mas a regra da Internet hoje, pelo menos para usuário pessoa física, é o IP dinâmico. Lembrar que o IPSEC foi concebido para IPv6, onde pode-se atribuir faixas fixas de IPs para cada usuário de provedor.
4) Apesar da transparência de criptografia pós-implementação, a implantação em si do IPSEC não é simples.
5) O IPSEC definitivamente não foi concebido para funcionar em conjunto com NAT, e NAT hoje também é a regra em praticamente todas as redes.
6) O IPSEC autentica computadores, não usuários. Para autenticar o usuário, é preciso continuar usando protocolos como HTTPS (Web seguro), PGP (e-mail criptografado) ou SSH (shell e FTP seguro). Como HTTPS, PGP e SSH também garantem confidencialidade, IPSEC é percebido, não sem razão, como redundante.
7) IPSEC tem de ser implementado no kernel do sistema operacional, por usar cabeçalhos opcionais na terceira camada (IP).
Mas o IPSEC oferece um segundo modo de funcionamento: o "modo túnel". Esse modo (que parece ter sido enxertado no IPSEC original) é apropriado para comunicação entre "ilhas" IPSEC na Internet. Ou seja, permite uso de IPSEC mesmo na presença dos problemas 1 e 2.
Este modo tem sido comumente usado para estabelecer VPNs, onde cada lado da VPN é uma "ilha" capaz de IPSEC. Um grande número de "ilhas" (até centenas) pode estar cadastrada.
O "modo túnel" é uma espécie de caminho de migração para o "modo transporte", onde um número de ilhas que confiam umas nas outras estabelecem comunicação IPSEC entre elas.
O uso (ou não) do túnel IPSEC para comunicar-se com um nó remoto tenta ser transparente como no modo transporte. Isso parece interessante, em particular se as "ilhas" forem em número muito grande, mas traz novos problemas:
8) A tabela de roteamento não explicita se um determinado pacote vai sair via IPSEC ou via normal, o que dificulta a depuração de problemas de rede.
Um uso muito freqüente de VPNs é a conexão segura de "road warriors" (viajantes) à empresa. Os problemas 3 e 5 do IPSEC modo túnel impedem seu uso como VPN para este fim.
Para facilitar a vida dos "road warriors", outra extensão do IPSEC foi criada: IPSEC sobre UDP. Ao invés de usar cabeçalhos opcionais IP, os túneis IPSEC são encapsulados em pacotes UDP. Este modo combina mais com IPs dinâmicos e roteadores NAT.
Restam ainda os problemas 4 e 7. Muitas redes corporativas preferem conviver com eles e usam IPSEC para VPNs entre filiais ou para "road warriors".
Existem produtos (por exemplo o VPNC) que eliminam os problemas 4 e 7, implementando a VPN IPSEC inteiramente em user-level (sem drivers de kernel) e explicitando a rota da VPN na tabela de roteamento. Infelizmente, o VPNC é específico para VPNs Cisco, o que revela um último problema do IPSEC:
9) O IPSEC tem grandes problemas de interoperabilidade, o que praticamente obriga usar produtos "casados" nos lados cliente e servidor. Em particular a VPN Cisco utiliza cartões SecurID como autenticação, estendendo o IPSEC de forma não-interoperável para suportar esse tipo de autenticação.
O OpenVPN, como o próprio nome diz, é um software especificamente desenvolvido para VPNs. A arquitetura básica do OpenVPN tem as seguintes características:
Por ser muito menos pretensioso que o IPSEC, o OpenVPN resolve intrinsecamente todos os problemas encontrados no IPSEC para uso com VPNs:
1) O OpenVPN depende de certificados X.509, então é problema do administrador se ele vai usar a PKI oficial (ou seja, adquirindo certificados "oficiais" para cada nó da VPN), ou criar uma Autoridade Certificadora fictícia, o que permite gerar os certificados de graça (mais usual no mundo OpenVPN)
2) Como cada VPN é pré-configurada, e os certificados são parte integrante dessa configuração, não há necessidade de fazer download de certificados sob demanda, então o OpenVPN não precisa de PKI on-line.
3) O OpenVPN aceita configurar VPNs tanto com IP fixo como IP dinâmico (até o lado "servidor" pode ter IP dinâmico)
4) Por ser restrito a VPNs, o OpenVPN é simples de configurar e usar.
5) Os pacotes VPN são transportados sobre TCP ou UDP, então o cliente consegue "furar" NATs sem maiores problemas, tal qual IPSEC sobre UDP.
6) O OpenVPN autentica apenas VPNs, nem sequer computadores (nem tem a pretensão de fazê-lo)
7) Os pacotes de rede que vão passar pela VPN são selecionados unicamente por conta do seu IP de destino. E eles são apenas reencapsulados sem qualquer manipulação. Assim, o OpenVPN não precisa interferir no processamento de terceira camanda, e portanto não precisa ter qualquer módulo implementado dentro do kernel.
8) Cada VPN cria uma interface virtual de rede, baseada na interface genérica TUN/TAP. Ou seja, cada VPN aparece na tabela de roteamento como se fosse uma placa adicional de rede. Isto facilita muito a depuração de problemas de rede.
Naturalmente, o OpenVPN não seria útil no cenário originalmente concebido para o IPSEC modo transporte. Se um dia a Internet chegar ao ponto de ser completamente baseaada em IPv6 e com IPs fixos, o IPSEC volta a ser mais interessante.
O resumo de tudo que foi escrito segue a seguir.