quinta-feira, 27 de maio de 2010

VPN IPSec com o Banco do Brasil no Centos 5.4

Recentemente fui incubido da tarefa de criar uma VPN utilizando IPSec entre minha empresa e o Banco do Brasil. Como não encontrei muita documentação disponível escrevo este artigo para facilitar a vida de nossos amigos da comunidade.

Decidi utilizar o Centos pois o mesmo possui uma documentação mais clara a respeito do funcionamento do IPSec em sua distribuição. O único pacote necessário para a configuração da vpn é o ipsec-tools.i386 que já vem instalado por padrão.

Para configurar o túnel IPSec entre minha empresa e o BB realizei as configurações abaixo:

01 - Inicialmente devemos criar o arquivo ifcfg-ipsec0 em /etc/sysconfig/network-scripts/ com a seguinte configuração:

TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=xxx.xxx.xxx.xxx
DSTGW=170.66.6.34
SRCNET=xxx.xxx.xxx.xxx/xx
DSTNET=170.66.50.0/24
DST=170.66.6.34

As configurações de SRCGW (Source Gateway) e SRCNET (Source Network) devem corresponder as suas informações.

02 - A conexão com o BB utiliza Pre-shared key para a autenticação, por isso devemos criar também em /etc/sysconfig/network-scripts o arquivo keys-ipsec0 que deve conter a chave utilizada para a conexão entre o BB e sua empresa conforme abaixo:

IKE_PSK=xxxxxxxxx

03 - Devemos configurar o Racoon que é o responsável pela troca de chaves através do arquivo /etc/racoon/racoon.conf conforme abaixo:

path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";

sainfo anonymous
{
pfs_group 2 ;
lifetime time 1 hour ;
encryption_algorithm 3des ;
authentication_algorithm hmac_md5 ;
compression_algorithm deflate ;
}
include "/etc/racoon/170.66.6.34.conf";

Observe que ao se editar o arquivo racoon.conf pela primeira vez a entrada

include "/etc/racoon/170.66.6.34.conf";

ainda não existe uma vez que a mesma é criada automaticamente juntamente com o arquivo e é baseada no DSTGW citado anteriormente no arquivo ifcfg-ipsec0.

04 - Para criar o arquivo automaticamente deve-se iniciar o túnel com o comando ifup ipsec0
para desativá-lo digite ifdown ipsec0. Agora edite o arquivo 170.66.6.34.conf criado em /etc/racoon/ conforme abaixo:

remote 170.66.6.34
{
exchange_mode main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm md5;
authentication_method pre_shared_key;
dh_group 2;
}
}

Note que a documentaçao oficial do Centos informa que não devemos alterar este arquivo diretamente porém, o arquivo criado automaticamente não corresponde as informações solicitadas pelo BB.

05 - Lembre de ativar o roteamento em seu servidor no arquivo /etc/sysctl.conf alterando a variável net.ipv4.ip_forward para 1

Para habilitar o roteamento use o comando

sysctl -p /etc/sysctl.conf

06 - Mais um passo é necessário para realizar a conexão. As configurações de setkey realizadas por padrão não atendem ao necessário para a conexão, por isso alterei as configurações através de um script iniciado automaticamente através do arquivo /etc/rc.local. O script deve conter os dados abaixo:

#!/sbin/setkey -f

flush;
spdflush;

spdadd 170.66.50.0/24 xxx.xxx.xxx.xxx/xx any -P in ipsec
esp/tunnel/170.66.6.34-xxx.xxx.xxx.xxx/require;
spdadd xxx.xxx.xxx.xxx/xx 170.66.50.0/24 any -P out ipsec
esp/tunnel/xxx.xxx.xxx.xxx-170.66.6.34/require;


07 - Feito isso podemos testar nossa conexão com o comando ifup ipsec0

Note que o IPSec não cria interfaces no sistema como o PPTPD ou o Openvpn, por isso deve-se utilizar o tcpdump para verificar a troca de pacotes com o comando:

tcpdump -ni eth0

Com o tcpdump é possível ver a negociação na primeira e na segunda fase do IPSec e logo após os pacotes criptografados.

EX:

1:41:14.935774 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident
11:41:14.935792 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident
11:41:15.009578 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident
11:41:15.009590 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident
11:41:15.015531 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident
11:41:15.015542 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident
11:41:15.090087 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident
11:41:15.090097 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident
11:41:15.095737 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident[E]
11:41:15.095748 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 1 I ident[E]
11:41:15.169339 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident[E]
11:41:15.169350 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 1 R ident[E]
11:41:15.169544 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I inf[E]
11:41:15.169553 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I inf[E]
11:41:16.175291 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I oakley-quick[E]
11:41:16.175303 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I oakley-quick[E]
11:41:16.250253 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 2/others R oakley-quick[E]
11:41:16.250264 IP 170.66.6.34.500 > xxx.xxx.xxx.xxx.500: isakmp: phase 2/others R oakley-quick[E]
11:41:16.250530 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I oakley-quick[E]
11:41:16.250540 IP xxx.xxx.xxx.xxx.500 > 170.66.6.34.500: isakmp: phase 2/others I oakley-quick[E]
11:41:16.493689 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x1), length 76
11:41:16.493702 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x1), length 76
11:41:16.949526 IP xxx.xxx.xxx.xxx > 170.66.6.34: ESP(spi=0x3bbaa20b,seq=0x1), length 116
11:41:16.949538 IP xxx.xxx.xxx.xxx > 170.66.6.34: ESP(spi=0x3bbaa20b,seq=0x1), length 116
11:41:17.027200 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x2), length 116
11:41:17.027212 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x2), length 116
11:41:17.950707 IP xxx.xxx.xxx.xxx > 170.66.6.34: ESP(spi=0x3bbaa20b,seq=0x2), length 116
11:41:17.950720 IP xxx.xxx.xxx.xxx > 170.66.6.34: ESP(spi=0x3bbaa20b,seq=0x2), length 116
11:41:18.025367 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x3), length 116
11:41:18.025377 IP 170.66.6.34 > xxx.xxx.xxx.xxx: ESP(spi=0x0e1e7ad2,seq=0x3), length 116
11:41:18.952179 IP xxx.xxx.xxx.xxx > 170.66.6.34: ESP(spi=0x3bbaa20b,seq=0x3), length 116

Caso haja algum erro com sua conexão um comando muito útil para verificar as possíveis causas é o racoon -Fd que inicia o racoon em modo debug.
OBS: Para iniciar o racoon em mode debug o instância que está rodando deve ser fechada.

É isso galera para a realização deste artigo utilizei como base a documentação de VPN do Centos que pode ser encontrada em:
http://www.linuxtopia.org/online_books/centos_linux_guides/centos_linux_security_guide/s1-ipsec-net2net.html
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-vpn.html

Quaisquer dúvidas ou sugestões estou a disposição.
Um grande abraço a todos.

3 comentários:

  1. Opa,

    Parabéns pelo artigo, ficou muito bem detalhado! Já sei onde procurar a solução quando estiver com problemas com isso! =)

    Abraço!

    ResponderExcluir
  2. Grande Agostinho,

    Qualquer coisa tamo ai...

    Abraço!

    ResponderExcluir
  3. Olá X4ND3M4C!
    estou em uma luta com o BB a mais de 3 semanas e nada de conseguirmos fazer a VPN. Primeiro tentei com o MS Forefront TMG, sem sucesso. Então o BB sugeriu o Racoon - fiz a instalação do CentOS 6.5 + serviços e não consegui suporte deles para a configuração. Enviaram uma série de documentos contraditório com o uso do Raccon. Estou bem perdido! Li teu procedimento mas estou travando no passo 4 - ifup ipsec0. Da mensagem que o Dispositivo parece não estar presente. Alguma dica para me ajudar!?
    Obrigado.

    Laércio.

    ResponderExcluir