Cliente OpenVPN para Android


Recebi alguma perguntas relacionadas com a configuração de um cliente OpenVPN em Android.

O processo é bastante simples, para tal basta instalar este software cliente android do OpenVPN.

Após instalar, o cliente para Android, devem gerar no servidor os certificados de cliente para o Smartphone ou Tablet. Para tal podem consultar este tutorial.

Podem ligar o Smartphone ou Tablet por USB ao PC e transferir os três ficheiros para uma pasta à escolha:

ca.crt
cliente2.crt 
cliente2.key


A partir daqui o processo é bastante simples, basta clicar no "+" em baixo à esquerda



Escolher um nome para o Perfil


Em Server Address colocar o nome do host que aponta para o IP Público configurado no Dynamic DNS

Em Type escolher a opção Certificates e seleccionar os ficheiros transferidos com os dois certificados e a chave



Configurar as opções de Routing adequadas para cada caso, no meu optei por redireccionar todo o tráfego pela VPN



Após estes passos o dispositivo Android está pronto a usar a VPN.
Uma boa forma de testar é após ligar a VPN aceder a este site e verificar se o IP público coincide com o IP público da ligação à Internet de casa.
Se os IP's coincidirem então todo o tráfego com origem/destino do Android está a ser correctamente redireccionado pelo Túnel da VPN.







OpenVPN Server em Raspberry PI e Cliente em Windows

Porquê instalar uma VPN até à nossa rede em casa ? ou até à empresa onde trabalhamos ?
No meu caso para:
  • - Imprimir documentos remotamente
  • - Aceder ao meu NAS e transferir ficheiros
  • - Aceder a um proxy HTTP para navegar pela Internet com o IP público da minha ligação em casa
  • - Aceder a câmaras IP
  • - Usar um ponto de acesso wireless público e navegar encriptadamente enviando tráfego HTTP pelo túnel VPN para o proxy em casa e a partir daí para a Internet.
  • - Ver televisão com MEO GO
Porquê o OpenVPN ? é gratuíto e distruibuido ao abrigo da licença GPL

Vpn Layer 2 ou Layer 3 ? Quais são as diferenças ?

Numa VPN Layer 2 (ou camada 2) as frames transportadas entre os dois locais, usam todas a propriedades básicas da camada Ethernet, logo, tem que aprender MAC's, replicar frames Broadcasts e Multicast, etc. Portanto temos que "imaginar" que o host que usa a VPN vai se ligar pelo túnel L2  ao servidor OpenVPN como se estivesse ligado a um switch. Sendo assim, vai receber um IP na mesma gama de endereçamento da rede onde termina o túnel.

Numa VPN de Layer 3 (ou camada 3) cada lado do túnel fica em sub-redes diferentes. Os pacotes IP são roteados entre as duas sub-redes.

Instalação do OpenVPN Layer 3


sudo su

apt-get update

apt-get install openvpn


Criação do par de chaves, uma para o cliente outra para o servidor


cd /etc/openvpn/easy-rsa
pico vars

Dentro do ficheiro vars, devemos mudar linha que contem :

export EASY_RSA="`pwd`"


Para:
export EASY_RSA="/etc/openvpn/easy-rsa"

No final deste mesmo ficheiro, podemos colocar valores a serem usado por omissão na geração dos certificados, qualquer valor poderá ser alterado aquando da geração do certificado.

export KEY_COUNTRY="PT"
export KEY_PROVINCE="Viana do Castelo"
export KEY_CITY="Viana do Castelo"
export KEY_ORG="Gondor"
export KEY_EMAIL="xxxxx@gmail.com"
export KEY_EMAIL=xxxxx@gmail.com
export KEY_CN=gondor
export KEY_NAME=gondor
export KEY_OU=gondor
export PKCS11_MODULE_PATH=gondor

Toda a informação inserida anteriormente pode ser fictícia.

Inicialização da infraestrutura de chaves públicas (PKI)


cd /etc/openvpn/easy-rsa/
sudo su
source ./vars
./clean-all
ln -s openssl-1.0.0.cnf openssl.cnf
./build-ca



Geração do certificado e chave do Servidor e cliente

No meu caso o servidor é o gandalf e o cliente o sauron

./build-key-server servername
./build-key client1


Na pasta /etc/openvpn/easy-rsa/keys deverão estar os seguintes ficheiros :

ca.crt
ca.key
gandalf.crt 

gandalf.csr 
gandalf.key
sauron.crt 

sauron.csr 
sauron.key


Caso mais tarde seja necessário configurar mais um cliente para a VPN, basta executar:

cd /etc/openvpn/easy-rsa/
sudo su
source ./vars
./build-key client2

Tendo como resultado os ficheiros:
cliente2.crt 
cliente2.csr 
cliente2.key

Destes serão transferidos para o host novo cliente os ficheiros :

ca.crt 
cliente2.crt 
cliente2.key

Geração do Diffie-Hellman

O propósito do Diffie-Helman é possibilitar a troca de chaves entre o servidor e o cliente através de uma rede insegura.

 ./build-dh

Criação do ficheiro de configuração do servidor

A partir deste momento não convém estar logado como root, devemos fazer exit para voltar ao utilizador com privilégios normais.
Vamos copiar um ficheiro de exemplo, para servir de base na nossa configuração

cd /etc/openvpn

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn

sudo gunzip server.conf.gz


dentro do ficheiro server.conf vamos mudar as seguintes configurações para que as chaves geradas anteriormente sejam tidas em conta:

# colocar o ip estático do raspberry
local 192.168.100.253 
# por defeito o serviço OpenVPN escuta no porto 1194
port 1194
# Escolher o protocolo UDP, é mais "leve"
proto udp
# escolher dev tun para que seja estabelecido 
# um túnel ou vpn Layer 3 
dev tun
   
# no meu caso quero usar a rede 
# 192.168.101.0/24 para fazer os túneis ponto-a-ponto
# o IP 192.168.101.1 será atribuído ao servidor
# podendo os clientes chegar ao servidor 
# usando este IP 

server 192.168.101.0 255.255.255.0

# para que seja sempre atribuido
# sempre o mesmo IP aos clientes
# poderá ser útil caso por exemplo
# caso a ligação se perca, ao ser
# retomada é atribuído o mesmo 
# IP ao cliente
ifconfig-pool-persist ipp.txt


# o push serve para que seja instalada uma rota
# na tabela de routing do cliente
# a indicar a rede da LAN de casa
# assim o cliente sabe que para chegar
# à LAN de casa tem que rotear o 
# tráfego pelo túnel
# a minha rede em casa tem endereço 192.168.100.0/24
push "route 192.168.100.0 255.255.255.0"

# Por razões de segurança
# é uma boa ideia reduzir os privilégios do utilizador
# que corre o deamon do OpenVPN
user nobody
group nogroup




ca.crt mudar para ca /etc/openvpn/easy-rsa/keys/ca.crt

cert server.crt mudar para cert /etc/openvpn/easy-rsa/keys/servername.crt



key server.key mudar para key /etc/openvpn/easy-rsa/keys/servername.key



dh dh1024.pem mudar para dh /etc/openvpn/easy-rsa/keys/dh1024.pem


Roteamento e Firewall no Raspberry

De forma a permitir que o Raspberry consiga rotear tráfego entre o túnel e a LAN
Dentro do ficheiro /etc/sysctl.conf procurar a linha:
net.ipv4.ip_forward=1 
e retirar o comentário
Gravar o ficheiro e executar o comando
sudo sysctl -p

Criar o ficheiro /etc/regras-firewall-openvpn.sh e colocar a seguinte configuração de NAT no Iptables.

#!/bin/sh

iptables -t nat -A POSTROUTING -s 192.168.101.0/24 -o eth0 -j SNAT --to-source 192.168.100.253

Gravar e modificar as permissões do ficheiro

sudo chmod 700 /etc/regras-firewall-openvpn.sh
sudo chown root /etc/regras-firewall-openvpn.sh

Editar o ficheiro /etc/network/interfaces e colocar a configuração pre-up na linha logo após o iface eth0 inet static


iface eth0 inet static
        pre-up /etc/regras-firewall-openvpn.sh

De forma a ver se até aqui está tudo bem configurado, recomenda-se um reboot ao raspberry 

Após o reboot ao Raspberry se tudo correr como esperado, a interface tun0 deve ter sido criada (no meu caso com o ip 192.168.101.1)
Para verificar, basta executar o comando ifconfig e analisar o output.


Criação de Dynamic DNS para resolver o IP Público num nome


Existem muitas plataformas na Internet a oferecer o serviço gratuito de Dynamic DNS, Pessoalmente tenho usado o serviço do noip.com e tem funcionado bem. 
Mas para que serve o DNS dinâmico ?
Todos nós usamos em casa um ligação à Internet tipo MEO, NOS, Vodafone, etc ... este tipo de ligações à internet  não garante de obtenhamos sempre o mesmo IP público. O IP público está constantemente a mudar, e nós necessitamos de saber qual é para efectuarmos a ligação VPN com o nosso cliente, para tal, o Dynamic DNS vai permitir associar um nome ao IP público que está atribuído na porta WAN do nosso router em casa. Sempre que o IP público muda, o router atravês de uma configuração específica, vai informar o novo IP ao servidor do Dynamic DNS. Também é possível configurar um serviço em linux que informe o noip.com ou outro, que o IP público mudou. 

No caso dos routers da MEO, podem fazer esta configuração :


Redireccionamento do Porto UDP 1194 para o Raspberry PI

Após termos o Dynamic DNS a funcionar, o router está pronto a receber pedidos de ligação à VPN através do seu IP Público. Mas há que ter em consideração que o serviço de VPN não é responsabilidade do router mas sim do Raspberry PI. Então o que o router tem que fazer, é redireccionar os pedidos UDP ao porto 1194 para o Raspberry PI. Isso faz-se recorrendo às configurações de redireccionamento de portos. Este tipo de configuração é banal e qualquer tipo de router o faz. No caso do router MEO aqui fica a configuração :


Dar um Nome ao Serviço, Escolher entrada Manual


Clicar em Avançar

Escolher protocolo UDP, intervalo de portas de 1194 a 1194 converter em 1194

Escolher Atribuir Jogo ou Aplicação a um dispositivo da rede local, e aqui provavelmente terão que procurar o Raspberry PI pelo seu MAC Address

Após este ponto o router vai passar a redirecionar para o RPI os pedidos à VPN

Configurações do lado do cliente


A parte do servidor, Dynamic DNS e redirecionamento de portas estão arrumadas. Falta agora configura-mos um cliente para testar a solução de ponta a ponta.

Para o meu portátil com windows 7 efectuei o download do software aqui.
Ao executar o cliente Windoes pela primeira vez, deverá abrir a aplicação com privilégios de administrador (botão direito do rato e executar como administrador).
Além do software cliente, deverão retirar do Raspberry os seguintes ficheiros criados no servidor:

ca.crt
cliente.crt (no meu caso sauron.crt)
cliente.key (no meu caso sauron.key)

Aconselho usarem o winscp para transferirem os ficheiros para o portátil.
No windows podem escolher uma directoria para guardar os 3 ficheiros transferidos anteriormente.
Nesta mesma directoria devem criar o ficheiro de configuração do cliente

Deverão criar um ficheiro xxxxxx.ovpn
Fica aqui um exemplo para o meu portatil do ficheiro sauron.ovpn:

client
dev tun
proto udp
# na configuração de remote devem
# colocar o nome que escolherem no Dyn DNS
# para a vossa ligação à NET
remote xxxxxxxx.zapto.org 1194 
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert sauron.crt
key sauron.key
comp-lzo
verb 3


Coloquem este ficheiro e os certificados no mesmo directório, depois no Cliente OpenVPN  basta clicar no Connection Profiles + e importar o ficheiro.ovpn  



A partir daqui podem testar a VPN.