VPN, no mais fundamental dos conceitos é a ligação
de duas redes privadas passando por uma rede pública (internet),
ou seja, interligar matriz e filial, parceiros de negócios ou
qualquer outra situação que exija uma conexão
segura por meios inseguros.
1.2 Porque escrevi esse documento:
------------------------------------------
Passei alguns apuros para colocar uma VPN no ar, mais por falta de
documentação do que por falta de qualidade dos
softwares.
Não que o freeswan esteja mal documentado, mas é muita
informação e fica difícil achar o
necessário.
Também pedi ajuda na lista LinuxBR (abraço pessoal!) e
até pro Telles (Dicas Linux), mas no ninguém conseguiu
ajudar.
Quando coloquei a primeira parte do projeto no ar e comentei na
LinuxBR, recebi vários e-mails pedindo ajuda, então
achei por bem fazer esse mini how-to.
1.3 Sobre o autor
---------------------
Eri Ramos Bastos trabalha com Linux desde 1998, passando por diversas
distribuições e fases diferentes do pinguim. Atualmente
trabalha como consultor em soluções Linux / Unix e
está disponível para ajudar a sua empresa a
implantar Linux em todos os setores. erirb@xtms.com.br
2.0 Iniciando a Configuração
2.1 A Estrutura da VPN que utilizaremos
------------------------------------------------
É uma VPN realmente simples, interligando matriz e filial (por
exemplo). O tipo de autorização que utilizei foi a chave
RSA. Caso prefira usar um segredo, favor recorrer a
documentação oficial.
Eu fiz os testes em 2 distribuições: Conectiva 8.0 e
SuSE 8.0. No conectiva não funcionou, não sei se por
incompetência ou por erro da distribuição.
Quando tento ativar o módulo do kernel para o IPSec recebo a
seguinte mensagem:
Note: /etc/modules.conf is more recent than
/lib/modules/2.4.18-2cl/modules.dep
Warning: loading /lib/modules/2.4.18-2cl/kernel/net/ipsec/ipsec.o will
taint the kernel: no license
E quanto ativo o ipsec recebo a mensagem:
# /etc/init.d/ipsec start
ipsec_setup: Starting FreeS/WAN IPsec 1.95...
ipsec_setup: Warning: loading
/lib/modules/2.4.18-2cl/kernel/net/ipsec/ipsec.o will taint the
kernel: no license
ipsec_setup: WARNING: ipsec0 has route filtering turned on, KLIPS may
not work
ipsec_setup: (/proc/sys/net/ipv4/conf/ipsec0/rp_filter = `1',
should be 0)
ipsec_setup: WARNING: eth0 has route filtering turned on, KLIPS may
not work
ipsec_setup: (/proc/sys/net/ipv4/conf/eth0/rp_filter = `1',
should be 0)
Mesmo mudando os bits 1 para 0, não funciona. Vale ressaltar
que é a instalação padrão do Conectiva,
ou seja, eu não alterei o kernel nem nada do tipo. Atualizei o
sistema, mas não adiantou.
Alguns sites também não recomendavam o RedHat 7.3, por
problemas parecidos com os mencionados no Conectiva.
* Recebi de Fernando Gozetto em 31/07/2002 um
href="http://en.tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap25sec206.html">link
que parece resolver o problema do Conectiva e também do RedHat.
Obrigado pela contribuição!
O SuSE, em compensação, funcionou como um
relógio. Altamente recomendado.
2.3 Instalando o FreeSwan
-------------------------------
Não vou entrar em detalhes de como compilar o freeswan ou
inseri-lo no kernel, já que o objetivo é uma coisa mais
simples.
O Freeswan já vem compilado e instalado na maioria das
distribuções, cheque a sua. :)
2.4 Arquivos de configuração
----------------------------------
Vamos utilizar dois arquivos de configuração: ipsec.conf
e ipsec.secrets. Por padrão eles estão em /etc.
Vou comentar somente o que dá problema.
ipsec.conf:
Nesse arquivo estarão as configurações gerais do
ipsec e também as configurações das VPNs.
Primeira parte:
config setup
# THIS SETTING MUST BE
CORRECT or almost nothing will work;
# %defaultroute is okay for
most simple cases.
interfaces=%defaultroute
# Debug-logging
controls: "none" for (almost) none, "all" for lots.
klipsdebug=none
plutodebug=none
# Use auto= parameters in
conn descriptions to control startup actions.
plutoload=%search
plutostart=%search
# Close down old connection
when new one using same ID shows up.
uniqueids=yes
interfaces=%defaultroute
Se a sua rota padrão (seu gateway) vai ser o caminho até
a outra ponta da VPN, ótimo, deixe assim.
Caso você vá conversar com a outra ponta, digamos, pela
eth1, você deverá colocar: interfaces="ipsec0=eth1"
o resto pode deixar padrão mesmo.
Segunda parte:
conn %default
keyingtries=0
disablearrivalcheck=no
authby=rsasig
leftrsasigkey=%dns
rightrsasigkey=%dns
Deixe isso assim mesmo. Não faz diferença se for uma
estrutura simples como a que nós estamos montando.
Nome da conexão. Poderia ser, ao invés de sample,
matriz-filial
type=tunnel
Isso indica o tipo de VPN.
left=200.xxx.xxx.57
leftsubnet=192.168.4.0/24
leftnexthop=200.xxx.xxx.1
Indica a máquina Linux1, bem como sua rede interna e o gateway
(roteador). Você deve escolher qual máquina/rede vai ser
a left e qual vai ser a right. Tanto faz...
right=200.xxx.xxx.56
rightsubnet=192.168.3.0/24
rightnexthop=200.xxx.xxx.1
Mesmo caso acima. Indica a parte do Linux2
leftrsasigkey=0sAQOXm+T....
rightrsasigkey=0sAQO....
São as chaves públicas dos servidores. Mais tarde eu
explico no ipsec.secrets
auto=start
Faz com que a conexão inicie junto com o serviço. Outra
forma poderia ser: auto=add, exigindo que a conexão fosse feita
manualmente (ipsec auto --up NOME)
Essa parte é a chave pública, que vai ser colocada no
arquivo de configuração ipsec.conf. Note que cada
máquina deverá ter sua própria chave,
consequentemente, seu próprio ipsec.conf
Para gerar o ipsec.secrets:
# ipsec rsasigkey 1024 >> /etc/ipsec.secrets
2.5 Os malditos detalhes:
Na configuração:
- Os arquivos ipsec.conf de ambas as máquinas devem ser iguais,
não devendo ser alterado o parâmetro right e left,
principalmente.
- Os arquivos ipsec.secrets são diferentes, devendo cada um ter
sua própria chave RSA
Nos testes:
- Um gateway não pinga o outro.
- Uma estação não pinga o gateway
- Somente uma estação pinga a outra
3.0 Referências:
Bookmark do meu Netscape que ajudou com minha pesquisa: