quarta-feira, dezembro 06, 2006

NAT de tráfego VPN (pptp) Windows com Iptables

Essa semana, me deparei com a tarefa de subir um serviço VPN no servidor Windows 2000 (infelismente) da empresa. Tarefa muito "árdua", afinal é muito difícil dar uns 5 ou 6 cliques, mas, enfim... o serviço está rodando na rede interna, que é protegida por um Firewall recem construído rodando Gentoo Linux que tem endereço IP público, então para as requisições de VPN (pptp) chegarem até o servidor que provê o serviço, foi usado NAT (Natwork Address Translator) com Iptables.

Ok.. tarefa simples: redirecionar o tráfego da porta usada pelo pptp para a maquina da rede interna. Sabendo que o servidor escuta na porta 1723 (pptp), uma linha de regra iría dar conta do recado, como em:

#iptables -t nat -A PREROUTING -p tcp -d IP_WAN --dport 1723 -j DNAT --to-destination IP_VPN_LAN:1723
É..aí foi que eu me enganei.

Acontece o seguinte: O pptp (Point-to-Point Tunneling Protocol) trabalha enviando sessões PPP (ponto a ponto) encapsuladas com o Protocolo GRE (Generic Routing Encapsulation). Uma segunda sessão TCP é usada para iniciar e gerenciar essa sessão GRE, dificultando o NAT por usar duas conexões. Isso explica a falha na autenticação da VPN.

Então uma segunda linha de regra no firewall DEVE ser usada para NAT de pptp:
#iptables -t nat -A PREROUTING -p 47 -j DNAT --to-destination IP_VPN_LAN

Essa linha diz para todas as requisições com sessões GRE (Protocolo 47) serem redirecionadas para o servidor onde se encontra o serviço de VPN.

É extremamente importante que o kernel tenha suporte ao protocolo GRE.
Em Networking > Networking Options, marcar "IP: GRE tunnerls over IP" como M ou *.
Se compilado como módulo, será necessário subir o mesmo com:
#modprobe ip_gre

Depois, algumas observações com IPtraf serão muito construtivas. :)

Só concluindo, o Protocolo pptp não foi proposto, nem ratificado como um padrão pelo IETF, porém uma especificação do protocolo foi publicada nesta RFC.

Dica: Sempre leia os HELP's na configuração do kernel, é muito exclarecedor.

Abraço.
Junior

fonte: http://en.wikipedia.org/wiki/Pptp, http://www.faqs.org/rfcs/rfc2784.html

Um comentário:

Claudinei disse...

muito bem garoto, to gostando de ver :)