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:
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."
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.
Dentre as várias opções de implementação existentes, eu testei:
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.
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
Peça ao seu adminitrador da rede windows para faze-lo (se não for você mesmo :) da seguinte forma no W2k3:
Pegue aquele notebook com Windão XP e faça:
Se algo der errado, tenha certeza que:
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