Um guia para os iniciantes no mundo do
FreeBSD
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!!!
[]'s Edson