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