domingo, janeiro 30, 2011

Servidor VPN L2TP/IPSec

Redes wi-fi abertas disponíveis ao público já são comuns de encontrar em eventos, bares, shoppings. Mas como navegar de maneira segura através das redes públicas?

A solução para isso é uso de VPNs (Virtual Private Network, ou Rede Privada Virtual). Conforme definição na wikipedia:

Rede Privada Virtual é uma rede de comunicações privada normalmente utilizada por uma empresa ou um conjunto de empresas e/ou instituições, construída em cima de uma rede de comunicações pública (como por exemplo, a Internet). O tráfego de dados é levado pela rede pública utilizando protocolos padrão, não necessariamente seguros.

VPNs seguras usam protocolos de criptografia por tunelamento que fornecem a confidencialidade, autenticação e integridade necessárias para garantir a privacidade das comunicações requeridas. Quando adequadamente implementados, estes protocolos podem assegurar comunicações seguras através de redes inseguras.

Deve ser notado que a escolha, implementação e uso destes protocolos não é algo trivial, e várias soluções de VPN inseguras são distribuídas no mercado. Adverte-se os usuários para que investiguem com cuidado os produtos que fornecem VPNs. Por si só, o rótulo VPN é apenas uma ferramenta de marketing.






O PROBLEMA:

Possuo um smartphone com o sistema operacional Android, e por diversas vezes preciso utilizar as redes wifi públicas para acessar alguns serviços da internet, e gostaria de fazer isso de forma segura e simples. Já que precisaria implantar um servidor de VPN, estabeleci alguns requisitos:

- Simples de configurar nos clientes VPN
- Uso de criptografia forte
- Tenha clientes multiplataforma (Smartphones Android, IPhone, sistemas operacionais Mac OS, Linux, Windows, BSD)
- Tenha cliente nativo em Android, sem necessidade de procedimento de root
- Cliente nativo para Mac OS, para utilizar a VPN no notebook
- Como vou utilizar um servidor Linux (em um provedor fora do país), utilizar pacotes disponíveis na distribuição Debian



A SOLUÇÃO:

Verificando os requisitos acima, cheguei até a opção de servidor VPN L2TP/IPSec (alguém tem alguma outra sugestão?). Para facilitar a configuração, a VPN vai ser através do uso de uma chave pré-compartilhada (PSK - Pre-shared key) e uma autenticação de usuário e senha. Simples e eficiente. É possível fazer a configuração utilizando certificados digitais, porém sua configuração dos clientes é mais complicada.


O servidor utilizado é um Linux Debian Lenny, utilizando sempre softwares instalados através do gerenciador de pacotes do repositório oficial. Alguns sites de referência que utilizei foram esses:

http://www.jacco2.dds.nl/networking/openswan-macosx.html

http://riobard.com/blog/2010-04-30-l2tp-over-ipsec-ubuntu/

http://tools.ietf.org/html/rfc3193

http://tools.ietf.org/html/rfc2661


Passo 1: Instalar os pacotes

# apt-get install openswan xl2tpd ppp


Passo 2: Configurar o IPSec

Editar o arquivo /etc/ipsec.conf e colocar o seguinte conteúdo:

version 2.0
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8 <-- Mude os IPs da VPN conforme necessidade
protostack=netkey

conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=IP.SEU.SERVIDOR <-- Mude para o IP do seu servidor VPN
leftprotoport=17/1701
right=%any
rightprotoport=17/%any

# 'include' this file to disable Opportunistic Encryption.
# See /usr/share/doc/openswan/policygroups.html for details.
#
# RCSID $Id: no_oe.conf.in,v 1.2 2004-10-03 19:33:10 paul Exp $
conn block
auto=ignore

conn private
auto=ignore

conn private-or-clear
auto=ignore

conn clear-or-private
auto=ignore

conn clear
auto=ignore

conn packetdefault
auto=ignore



Editar o arquivo /etc/ipsec.secrets:

IP.SEU.SERVIDOR %any: PSK "SuaSenhaCompartilhada"



Passo 3: Configurar o L2TP

O L2TP (Layer 2 Tunneling Protocol) fornece um túnel para enviar dados. Ele não fornece criptografia e autenticação, porém, é por isso que precisamos usá-lo em conjunto com o IPSec. Curiosamente, tanto a Apple quanto a Microsoft costumam se referir ao L2TP como a tecnologia VPN segura, mas ignoram totalmente o fato de que a segurança é fornecida pelo IPSec.

Edite o arquivo /etc/xl2tpd/xl2tpd.conf:

[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255 <-- Modifique de acordo com o número de clientes
local ip = 10.1.2.1 <-- IP do servidor VPN no túnel (lado esquerdo)
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes



Passo 4: Configuração do PPP

Edite o arquivo /etc/ppp/options.xl2tpd:

require-mschap-v2
ms-dns 8.8.8.8 <-- Coloquei aqui os servidores DNS públicos do google
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4


Edite o arquivo /etc/ppp/chap-secrets para cadastrar os usuários e senhas:
# user server password ip
test l2tpd testpassword *



Passo 5: Prepare a rede conforme necessidade

Eu criei um script de start de todos os serviços, já configurando a rede para a VPN e realizando NAT:

#!/bin/bash
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done

/etc/init.d/ipsec start
/etc/init.d/xl2tpd start

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



Nesse site tem as configurações do cliente VPN em smartphones Android:https://12vpn.com/wiki/index.php?title=Android_1.6_L2TP/IPSec_PSK_instructions

Pronto. A configuração de clientes para Android e para Mac OS é bem simples e é nativo, não é necessário instalar nenhum programa para configuração. Agora você já pode utilizar as redes públicas abertas de forma segura.

3 comentários:

Jeronimo Zucco disse...

Update: confirmei o funcionamento com um cliente nativo de VPN do Iphone.

Pedro H. Matheus disse...

Zucco, Parabens pelo blog e pelo tutorial, mas devo confessar que tive um pouco de dor de cabeça para colocar para funcionar no ubuntu 10.10. Nessa versão do Ubuntu tem um Bug no xl2ptd que não fornece automaticamente o ip para o cliente, devendo você colocar o ip na mão no arquivo /etc/ppp/chap-secrets

Link para o bug: https://bugs.launchpad.net/ubuntu/+source/xl2tpd/+bug/659181

Do resto testei com meu Xoom com android 3.1 e funcionou perfeito.

Só uma resalva, se você tem mais de um dispositivo movel, cadastre usuarios diferentes para não ter problema de conflito de IP's caso utilize o ubuntu 10.10 e ou cadastre os IP's manualmente no chap-secrets.

Abraço
Pedro H. Matheus

Anônimo disse...

ZUCCO to com um problema

Seguei o tuto e de boa, a VPN fecha tunel

O problema é quando eu tento um acesso externo, configuro o computador para DMZ e nada!!

Uso conexao domestica e SPEEDD

ME Ajuda por favor

Obrigado,
Daniel Moreno