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.


8 comentários:

  1. Se quiserem vários clientes a ligar ao Servidor com o mesmo certificado, então devem acrescentar "duplicate-cn
    " no ficheiro de configuração do server

    ResponderEliminar
  2. Posso ter lido mal, mas não consegui encontrar como se configura uma VPN para o windows, gostava de saber
    Cumprimentos

    ResponderEliminar
    Respostas
    1. Olá

      No tutorial tem uma secção "Configurações do lado do cliente" é onde tem os passos para configurar o cliente do lado do windows.
      Com o cliente para windows vai poder ligar-se à VPN e aceder à internet ou Meo GO atravês de sua casa.

      Eliminar
  3. Talvez seja por demais evidente e eu não estou a ver, mas não estou a perceber como vejo o MEO GO na raspberry ...

    ResponderEliminar
  4. Olá, este procedimento não permite ver MEO GO no raspeberry, não é essa a utilidade do raspberry.

    O raspberry serve de servidor de vpn, para que possas de fora de casa, te ligares a casa usando uma vpn.
    Depois de teres o túnel (vpn) estabelecido até casa, configuras o teu browser para usar um proxy (previamente) configurado em casa.
    E através desse proxy vais visualizar os canais da MEO GO.
    Porque é que funciona ? porque os pedidos aos servidores MEO GO "saem" de tua casa, e é suposto o serviço funcionar quando estas em casa.

    Deu para entender ?

    ResponderEliminar
  5. Obrigado pela informação partilhada. Ainda não experimentei, estou à espera do meu Raspberry, mas com tanto detalhe, estou confiante. Ainda para mais de um óbvio aficionado do grande JRR Tolkien, só pode ser bom material ;)

    ResponderEliminar
  6. Com esta instalação posso navegar pela internet ninguém saber o meu ip de casa?

    ResponderEliminar
    Respostas
    1. Não,
      Esta instalação permite que você (esteja onde estiver) faça um túnel até casa, e que a navegação para a internet seja feira a partir de casa. EX:
      Ao pedir uma página o trafego faz este sentido Escola --(túnel)--> Casa ---> Internet
      O trafego de resposta ao pedido faz este sentido Internet --> Casa --(túnel)--> Escola

      Portanto o IP publico utilizado na navegação será o IP configurado no Router de sua casa.

      Eliminar