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

Por: e Tiago Cruz (tiagocruz AT linuxrapido.org)
Última atualização: Tue Nov 8 14:52:07 2005



Introdução

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 hotpop.com>
  # 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 adminitrador da rede windows para faze-lo (se não for você mesmo :) da seguinte forma no W2k3:


Configuração do cliente

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


Testando o ambiente

Se algo der errado, tenha certeza que:


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