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
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.