Implantando VPNs com FreeBSD - de LAN para LAN

Como eu implemento uma VPN usando FreeBSD ???

Acho que agora chegamos ao ponto que voce queria :-)

Claramente esta estratégia permite que duas estações FreeBSD  estabeleçam contato entre si - utilizando a VPN - porém é um meio muito famoso por ser utilizado para a conexão entre  servidores.

É um método padrão, que pode ser utilizado inclusive entre servidores em outras plataformas.

A implementação de VPNs no FreeBSD é realizada utilizando-se do IPSec (ip Security Tunnel Mode) desenvolvido pela IETF. O IPSec é um protocolo padrão de camada 3 que oferece transferência segura de informações através de rede IP puplica ou privada. Uma conexão via IPSec envolve sempre 3 etapas:

1. Negociação do nível de segurança.
2. Autenticação e Integridade.
3. Confidencialidade.

Para implementar essas 3 etapas o IPSec utiliza-se de 3 mecanismos:

  • AH - Autentication Header
  • ESP - Encapsulation Security Payload
  • ISAKMP - Internet Security Association and Key Management Protocol


No FreeBSD o IPSec suportado nativamente no kernel fornece os mecanismos de AH e ESP, ja o serviço de ISAKMP é provido pelo aplicativo /usr/ports/security/racoon.

Implantação passo a passo

1. Adicionando suporte ao IPSec ao seu kernel

Antes de iniciar a implantação da sua VPN é necessario incluir o suporte ao IPSec ao seu Kernel, para isso basta inserir as linhas abaixo no seu arquivo de configuração e recompilar o kernel:

options         IPSEC                   #IP security
options         IPSEC_ESP               #IP security (crypto; define w/ IPSEC)
options         IPSEC_DEBUG             #debug for IP security
pseudo-device   gif     4               #IPv6 and IPv4 tunneling

2. Instalar o suporte a ISAKMP.

Antes de instalar o racoon é recomendado que voce sincronize a sua arvore do ports usando o cvsup para garantir que voce estará instalando a ultima versao disponivel.
Após sincronizar a sua arvore do ports, execute o comando abaixo:

# cd /usr/ports/security/racoon
# make clean
# make
# make install

3. Configuração do Firewall

Apesar de não ser obrigatório, é altamente recomendado que os seus gateways da VPN, rodem algum tipo de firewall, limitando a comunicação da interface publica do primeiro host apenas para a interface publica do segundo. Voce pode usar o ipfw ou o ipfilter, fica a seu critério escolher aquele que voce domina melhor.
Se voce nao definir uma boa politica de segurança para os seus gateways, voce pode colocar a segurança de sua VPN em risco, assim perca alguns minutos configurando seu firewall antes de começar a configurar uma VPN!!!

4.Configuração

Antes de iniciar a configuração vamos considerar a seguinte estrutura:

                 Gateway A                                 Gateway B
            +------------------+                     +-------------------+
Intranet A  |                  |      INTERNET       |                   |  Intranet B
<---------->|xl0            xl1+<------------------->+xl1             xl0+<---------->
            |                  |                     |                   |
            +------------------+                     +-------------------+

Gateway A:
           xl0 -> 192.168.1.1/255.255.255.0
           xl1 -> 200.230.245.20/255.255.255.0
	
Gateway B:
           xl0 -> 192.168.2.1/255.255.255.0
           xl1 -> 200.220.125.50/255.255.255.0

Cada um dos hosts acima possui duas interfaces de rede, uma com ip publico e uma com ip invalido e ambos os hosts estao configurados para atuar como gateway.



4.1 - Como configurar sua VPN sem usar ISAKMP (chaves estaticas)

No Gateway A

Voce deve criar o arquivo /usr/local/etc/rc.d/vpn.sh com o seguinte conteudo:

#!/bin/sh
gifconfig gif0 200.230.245.20 200.220.125.50
ifconfig gif0 192.168.1.1 192.168.2.1 netmask 0xffffffff
route add -net 192.168.2.0/24 192.168.2.1
setkey -f /etc/ipsec.conf  

Sete o arquivo criado acima como executavel dando um chmod 755 /usr/local/etc/rc.d/vpn.sh.
Agora voce precisa criar o arquivo /etc/ipsec.conf com o seguinte conteudo:

flush;
spdflush;
 
add 200.230.245.20 200.220.125.50 esp 9991 -E blowfish-cbc "Escolha_uma_Chave_para_a_conexao_A_B_quanto_maior_melhor";
add 200.220.125.50 200.230.245.20 esp 9992 -E blowfish-cbc "Escolha_uma_Chave_para_a_conexao_B_A_quanto_maior_melhor";
 
spdadd 192.168.1.0/24 192.168.2.0/24 any -P out ipsec esp/tunnel/200.230.245.20-200.220.125.50/require;
spdadd 192.168.2.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/200.220.125.50-200.230.245.20/require;  

No Gateway B

Voce deve criar o arquivo /usr/local/etc/rc.d/vpn.sh com o seguinte conteudo:

#!/bin/sh
gifconfig gif0 200.220.125.50 200.230.245.20
ifconfig gif0 192.168.2.1 192.168.1.1 netmask 0xffffffff
route add -net 192.168.1.0/24 192.168.1.1
setkey -f /etc/ipsec.conf  

Sete o arquivo criado acima como executavel dando um chmod 755 /usr/local/etc/rc.d/vpn.sh.
Agora voce precisa criar o arquivo /etc/ipsec.conf com o seguinte conteudo:

flush;
spdflush;
 
add 200.230.245.20 200.220.125.50 esp 9991 -E blowfish-cbc "Escolha_uma_Chave_para_a_conexao_A_B_quanto_maior_melhor";
add 200.220.125.50 200.230.245.20 esp 9992 -E blowfish-cbc "Escolha_uma_Chave_para_a_conexao_B_A_quanto_maior_melhor";
 
spdadd 192.168.2.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/200.220.125.50-200.230.245.20/require;
spdadd 192.168.1.0/24 192.168.2.0/24 any -P in ipsec esp/tunnel/200.230.245.20-200.220.125.50/require;  

Obs: As chaves utilizadas no host A devem ser identicas ao do Host B ou nao vai funcionar!!!
Para subir sua VPN basta executar manualmente os arquivos /usr/local/etc/rc.d/vpn.sh em cada um dos hosts, se tudo esta funcionando como devia voce ja deve ser capaz de pingar os hosts de uma intranet para a outra, se tiver duvidas se o trafego esta realmente criptografado utilize o tcp dump para capturar alguns pacotes e veja por voce mesmo ;-).
A configuração acima ja lhe proporciona um canal seguro de uma intranet para a outra, porem como estamos usando chaves estaticas essa configuraçao ainda nao é a ideal, o proximo passo é configurar o uso de chaves dinamicas. Nesta configuração uma chave pre-definida eh utilizada para iniciar a comunicaçao dos 2 hosts e em seguida uma nova chave aleatoria eh utilizada e alterada de tempos em tempos.



4.1 - Como configurar sua VPN usando ISAKMP (chaves dinamicas)

No Gateway A

Voce deve criar o arquivo /usr/local/etc/rc.d/vpn.sh com o seguinte conteudo:

#!/bin/sh
gifconfig gif0 200.230.245.20 200.220.125.50
ifconfig gif0 192.168.1.1 192.168.2.1 netmask 0xffffffff
route add -net 192.168.2.0/24 192.168.2.1
setkey -f /etc/ipsec.conf  
/usr/local/sbin/racoon

Sete o arquivo criado acima como executavel dando um chmod 755 /usr/local/etc/rc.d/vpn.sh.
Agora crie o arquivo /usr/local/etc/racoon/chave.txt com o seguinte conteudo:

200.220.125.50 Escolha_uma_Chave_para_a_conexao_A_B_quanto_maior_melhor

O próximo passo é criar o arquivo de configuração do racoon, crie o arquivo /usr/local/etc/racoon/racoon.conf com o seguinte conteudo:

path pre_shared_key "/usr/local/etc/racoon/chave.txt" ; 
log info;


remote anonymous
{
        exchange_mode aggressive,main;
        doi ipsec_doi;
        situation identity_only;
 
        nonce_size 16;
        lifetime time 2 hour;   # sec,min,hour
        lifetime byte 50 MB;    # B,KB,GB
        initial_contact on;
        support_mip6 on;
        proposal_check obey;    # obey, strict or claim
 
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key ;         
                dh_group 2 ;
        }
} 

sainfo anonymous
{
        pfs_group 2;
        lifetime time 1 hour;
        lifetime byte 50000 KB;
        encryption_algorithm 3des,des,cast128,blowfish;
        authentication_algorithm hmac_sha1,hmac_md5;
        compression_algorithm deflate ;
}      

Agora voce precisa criar o arquivo /etc/ipsec.conf com o seguinte conteudo:

flush;
spdflush;
 
spdadd 192.168.1.0/24 192.168.2.0/24 any -P out ipsec esp/tunnel/200.230.245.20-200.220.125.50/require;
spdadd 192.168.2.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/200.220.125.50-200.230.245.20/require;  

No Gateway B

Voce deve criar o arquivo /usr/local/etc/rc.d/vpn.sh com o seguinte conteudo:

#!/bin/sh
gifconfig gif0 200.220.125.50 200.230.245.20
ifconfig gif0 192.168.2.1 192.168.1.1 netmask 0xffffffff
route add -net 192.168.1.0/24 192.168.1.1
setkey -f /etc/ipsec.conf  
/usr/local/sbin/racoon

Sete o arquivo criado acima como executavel dando um chmod 755 /usr/local/etc/rc.d/vpn.sh.
Agora crie o arquivo /usr/local/etc/racoon/chave.txt com o seguinte conteudo:

200.230.245.20 Escolha_uma_Chave_para_a_conexao_A_B_quanto_maior_melhor

O próximo passo é criar o arquivo de configuração do racoon, crie o arquivo /usr/local/etc/racoon/racoon.conf com o seguinte conteudo:

path pre_shared_key "/usr/local/etc/racoon/chave.txt" ; 
log info;


remote anonymous
{
        exchange_mode aggressive,main;
        doi ipsec_doi;
        situation identity_only;
 
        nonce_size 16;
        lifetime time 2 hour;   # sec,min,hour
        lifetime byte 50 MB;    # B,KB,GB
        initial_contact on;
        support_mip6 on;
        proposal_check obey;    # obey, strict or claim
 
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key ;         
                dh_group 2 ;
        }
} 

sainfo anonymous
{
        pfs_group 2;
        lifetime time 1 hour;
        lifetime byte 50000 KB;
        encryption_algorithm 3des,des,cast128,blowfish;
        authentication_algorithm hmac_sha1,hmac_md5;
        compression_algorithm deflate ;
}      

Agora voce precisa criar o arquivo /etc/ipsec.conf com o seguinte conteudo:

flush;
spdflush;

spdadd 192.168.2.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/200.220.125.50-200.230.245.20/require;
spdadd 192.168.1.0/24 192.168.2.0/24 any -P in ipsec esp/tunnel/200.230.245.20-200.220.125.50/require;  

Novamente, para iniciar sua VPN basta executar o arquivo /usr/local/etc/rc.d/vpn.sh em cada um dos gateways. Apos inicializar a VPN verifique o arquivo de log /var/log/racoon.log para ver se esta tudo OK, caso nao funcione verifique com um setkey -D se o suporte ao IPSec esta habilitado no seu kernel.
As configurações propostas neste tutorial para o racoon são basicas e são o minimo necessario para que voce start uma VPN com chaves dinamicas, mas existem muitas outras opções, por ex: o uso de uma chave RSA para a fase inicial de autenticação, etc. 
Para conhecer as demais opções sugiro fortemente que voces leiam as man pages do racoon e do racoon.conf.
Bom era isso, boa sorte!!!

 

Documentação: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ipsec.html

Fonte: http://www.primeirospassos.org/sessao10_8_b.html

.