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.