você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Soluções de VPN integrando Linux, FreeBSD e Windows

Colaboração: Tiago Cruz

Data de Publicação: 15 de Novembro de 2005

VPN significa Virtual Private Network, usada amplamente para fazer um túnel seguro entre duas redes distantes, separadas pela internet. Os dados são criptografados antes de entrar no túnel e apenas a outra ponta conhece a chave para descriptografar o mesmo, criando um canal de comunicação relativamente seguro.

Existem basicamente duas formas de se implementar uma VPN:

Host-to-Host

Quando ambas as pontas são servidores dedicados (geralmente os gateways de ambas as redes) e usam o protocolo IPSec para comunicarem entre si. Um bom exemplo em FreeBSD pode ser lido no Handbook do FreeBSD e para Linux, tem um artigo bem legal aqui.

Se você ler o handbook, verá que como o comando gifconfig não existe mais na versão 5.x do FreeBSD, é usado o comando ifconfig no lugar. Mas verá também que não existe nenhum exemplo prático de como usa-lo nas versões atuais. Caso este seja seu problema, recomendo que crie um script em /usr/local/etc/rc.d/ neste formato:

#/bin/sh
# Script de inicialização da VPN Out/2005
# Irado furioso com tudo <irado at globecom.net>
# Tiago Cruz < tiagocruz at linuxrapido.org>

ip_DE_LAH="200.000.000.001"
ip_DAQUI="200.000.000.002"
gateway_DE_LAH="192.168.0.1"
gateway_DAQUI="192.168.2.1"
rede_DE_LAH="192.168.0.0"
rede_DAQUI="192.168.2.0"
mascara="255.255.255.0"

case ${1} in
  start)
   echo "Inicializando VPN..."
   /sbin/ifconfig gif0 create
   /sbin/ifconfig gif0 tunnel ${ip_DAQUI} ${ip_DE_LAH}
   /sbin/ifconfig gif0 inet ${gateway_DAQUI} ${gateway_DE_LAH} netmask ${mascara}
   /sbin/route add -net ${rede_DE_LAH} -netmask ${mascara} ${gateway_DE_LAH}
   /usr/sbin/setkey -f /etc/ipsec.conf
   /usr/local/sbin/racoon
   pfctl -f /etc/pf.conf
   ;;
   stop)
          echo "Terminando VPN..."
         /sbin/ifconfig gif0 destroy
        ;;
   *)
          echo "Use 'vpn start' ou 'vpn stop'!"
         ;;
 esac
exit 0

Outra coisa legal não documentada no handbook: Você pode usar o comando setkey -a -D antes do host A (192.168.0.1) começar a pingar o host B (192.168.2.1) para você ver como o racoon cria as chaves usadas no túnel criptografado. Assim você tem certeza que a comunicação está sendo segura!

Uma solução mais simples e flexível pode ser conseguida utilizando o OpenVPN, e um excelente tutorial em português pode ser lido aqui. Segundo o amigo Augusto Bott, "uma das vantagens em potencial de usar o OpenVPN é não depender do protocolo GRE (General Routing Encapsulation, protocolo IP tipo 47). Alguns gateways que fazem nat (como muitos modems ADSL) não roteiam propriamente o GRE, impossibilitando a comunicação."

Client-to-Host

Quando uma estação, como sua máquina de casa ou o notebook do seu chefe acessa a rede empresarial de um lugar qualquer da internet. Neste caso usamos o protocolo pptp que é nativo do Windows, ou seja, não é necessário baixar nenhum software adicional e a configuração é bem simples, bem semelhante ao processo de criar uma conexão dial-up, como você pode ver aqui.

Neste artigo abordarei uma implementação do PPTP integrada com os usuário de um PDC Windows 2003, usando o Radius como centralizador de autenticação. Assim, temos uma integração perfeita com o Active Directory e um usuário e senha a menos para decorar ao acessar a rede da empresa.

Configuração do VPN Server

Dentre as várias opções de implementação existentes, eu testei:

poptop + radiusclient

O PopTop é um servidor pptp Open Source para Linux, portado para alguns BSD's, relativamente bem documentado (principalmente para usuários de Linux) mas bem escasso para o BSD.

A configuração é feita nos arquivos /etc/ppp/* e /usr/local/etc/radiusclient-ng/*. Seu script de incialização fica em /usr/local/etc/rc.d/pptpd.sh e ele usa a porta 1723 para comunicação com os clientes, portanto, ela deve estar aberta em seu firewall!

Consegui fazer a VPN funcionar depois de muito sacrifício e buscas na lista oficial do projeto, mas a parei no último passo: A autenticação em um servidor radius em uma máquina na rede, já integrada com o AD do Windows.

Se você precisar de usuários e senhas em um arquivo (no caso o /etc/ppp/ppp.secret) você pode optar por esta solução.

mpd + radius

O MDP (Multi-link PPP daemon) é um daemon PPP para FreeBSD e me pareceu funcionar melhor do que o poptop, além se ser mais simples de configurar por ter menos arquivos de configuração e o melhor: Funciona com pptp e radius!

A configuração dele não é muito complicada, toda documentação que você possa precisar está em /usr/local/share/doc/mpd embora seja perfeitamente possível configurar o /usr/local/etc/mpd/mpd.conf somente lendo os comentários do mesmo. Um artigo bem legal em português você encontra aqui, embora meio desatualizado (aborda a versão 4.x do FreeBSD, semana passada foi lançada a 6.0) mas ainda ajuda bastante e vale a pena a leitura!

Dentro do mpd.conf, você pode seguramente apagar as partes desnecessárias e deixar o arquivo parecido com isso:

default:
load pptp

pptp:
new -i ng0 pptp pptp
set iface disable on-demand
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set bundle enable multilink
# Aqui carregamos a seção que habilita o RADIUS server
load radius
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 10 60
set link mtu 1460
set ipcp yes vjcomp
# Range de IPs para as estações, DNS e etc
set ipcp ranges 192.168.1.1/32 192.168.1.50/32
set ipcp dns 192.168.0.19
set ipcp nbns 192.168.0.19
set bundle enable compression
set ccp yes mppc
set ccp yes mpp-e40
set ccp yes mpp-e128
set ccp yes mpp-stateless

radius:
set radius retries 3
set radius timeout 3
# IP e senha do servidor RADIUS
set radius server 192.168.0.119 senha_super_secreta
set radius me 192.168.0.119
set radius acct-update 300
set ipcp enable radius-ip
set bundle enable radius-auth radius-fallback
set bundle enable radius-acct
set iface enable radius-idle radius-session radius-mtu radius-route
set bundle enable compression
set ccp yes mppc
set ccp enable radius

Se você usar o protocolo RADIUS como centralizador de autenticações (o Windows usa o IAS - Internet Authentication Service) ou você mesmo compilar o OpenRadius, você não irá fazer a autenticação em um arquivo texto mas caso queira faze-lo use o arquivo mdp.secret

Use também o arquivo mpd.links para informar o IP externo de ser servidor, onde ele ficará escutando na porta 1723 também.

pptp:
set link type pptp
set pptp self 200.200.200.200
set pptp enable incoming
set pptp disable originate

Inicie o mpd pelo script em /usr/local/etc/rc.d.mpd (antes, habilite-o no /etc/rc.conf com mpd_enable="YES"). Para debuga-lo, insira as linhas abaixo no /etc/syslogd.conf e reinicie o mesmo:

!mpd
*.*           /var/log/mpd.log

Configuração do RADIUS

Peça ao seu administrador da rede windows para faze-lo (se não for você mesmo :) da seguinte forma no W2k3:

  • Vá lá no "Add or Remove Programs -> Windows Components -> Networking Services -> Internet Authentication Service";

  • Depois de instalado, vá para "Start -> Administrative Tools -> Internet Authentication Service";

  • Em "Action -> New RADIUS Client" crie uma nova entrada com o IP do seu servidor VPN e a mesma senha entrada no mpd.conf, usando o client-vendor "RADIUS Standard";

  • Em "Start -> Administrative Tools -> Active Directory Users and Computers", entre na aba "Dial-in" do usuário desejado e permita o "Remote Access";

  • Restarte o IAS e configure um cliente para acessar!

Configuração do cliente

Pegue aquele notebook com Windão XP e faça:

  • Clique "Start -> Settings -> Network Connections -> New Connection Wizard";

  • Continue seguindo em "Next -> Connect to the network at my workplace -> Virtual Private Network connection";

  • Digite um nome qualquer para esta conexão, seguido de um hostname ou IP do servidor de VPN e pronto!

Testando o ambiente

Se algo der errado, tenha certeza que:

  • Seu MPD está instalado, rodando e escutando na porta correta;

  • O mpd.conf aponta para o IP correto do servidor RADIUS, e a senha é a mesma usada por ele;

  • Seu RADIUS está instalado, rodando e apontado corretamente para o IP do servidor com o MPD, assim como a senha deve ser a mesma;

  • O usuário e senha informado tem autorização no Windows para logar remoto;

  • O debug de log está ativo, para você acompanhar detalhadamente;

Agradecimentos

Ao pessoal que perde seu tempo documentando procedimentos, ao pessoal da lista FUG-BR e ao Aurélio Marinho por escrever o txt2tags, usado nesta documentação e em várias outras que escrevi.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Brazil License



Veja a relação completa dos artigos de Tiago Cruz