você está aqui: Home  → Arquivo de Mensagens

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

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script