Desenvolvimento

5 nov, 2015

Criando uma VPN com OpenVPN e DD-WRT

Publicidade

Graças aos entraves do software proprietário, resolvi melhorar minhas opções de uso com OpenVPN e com meu roteador DD-WRT. A história toda começou com alguns jogos que comprei numa promoção na Xbox Live no Brasil (é… Microsoft, eu sei…). Comprei sem problemas, mas não instalei os jogos. Acontece que depois mudei de país e… quem disse que consigo ativar os jogos? A bela ideia de que algo que comprou, que é seu, mas não é seu de verdade.  Só o software proprietário te permite entraves assim.

vpn-1

Uma opção que tentei fazer foi por meio de túnel de DNS, do mesmo tipo que se usa pra Netflix. Eu tenho o serviço do Unlocator, mas ele não foi suficiente pra passar o bloqueio imposto pela Microsoft. Consegui baixar o conteúdo, mas ele não executa pela diferença de região.

Então resolvi realmente criar um túnel até o Brasil e sair por um IP de lá. E pra isso fiz um combo de VPS com AWS (Amazon), OpenVPN e DD-WRT – simplesmente levantar uma máquina virtual com Linux (escolhi Ubuntu), iniciar OpenVPN em modo servidor, e conectar a partir do roteador DD-WRT como cliente.

Então aqui estão os passos pra isso.

Chaves e certificados

Tentei uma configuração mais simples de OpenVPN static-home, que existe no diretório de exemplos, mas descobri que o DD-WRT não funciona com essa configuração e exige toda a infraestrutura de chaves, com autoridade certificadora e tudo mais. Mas existe um pacote Debian/Ubuntu que facilita nessa tarefa: easy-rsa.

Primeiramente, instale o pacote.  Como root:

apt-get install easy-rsa

Note que o comando é rodado em sua máquina de trabalho, como meu laptop no caso – nem na VPS, nem no roteador. É importante rodar separado pra poder guardar as chaves pra usar depois.

Crie um diretório VPN e faça links simbólicos de todos os scripts instalados pelo easy-rsa. Todos os passos seguintes não precisam ser feitos como root.

mkdir vpn
cd vpn
ln -s /usr/share/easy-rsa/* .

Crie primeiro o certificado de autoridade certificadora (CA). Para isso, faça “source” no arquivo vars e, em seguida, limpe qualquer configuração com “clean-all”.

. vars
./clean-all
./build-ca

Basta ir respondendo às perguntas e criar o certificado com seus dados.

Country Name (2 letter code) [US]:BR
State or Province Name (full name) [CA]:SP
Locality Name (eg, city) [SanFrancisco]:Tucanistao
Organization Name (eg, company) [Fort-Funston]:Loureiro Software
Organizational Unit Name (eg, section) [MyOrganizationalUnit]:Loureiro Engenharia
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:openvpn
Name [EasyRSA]:
Email Address [me@myhost.mydomain]:helio@loureiro.eng.br

Apesar de não ter escrito nada a respeito, acho que fica bem explícito que os dados podem ser fictícios. Então qualquer coisa serve, apenas pra identificar seu próprio certificado, ou melhor, entidade certificadora que assinará as chaves.

Em seguida, crie o certificado do servidor e assine. Basta rodar o comando seguinte que ele pedirá para entrar como uma senha e pra assinar a chave.  Não entre com senha (tecle <Enter> somente), pois isso facilitará a configuração. Mas selecione pra assinar o certificado.

./build-key-server server

O próximo passo é a criação da chave do DD-WRT. Para isso, use o comando:

./build-key dd-wrt

Assim como no passo do servidor, não entre com uma senha, para tornar as coisas mais simples.

Por último, basta gerar os parâmetros de Diffie-Hellman pro servidor (chave pública-privada). Leva um certo tempo esse passo de geração.

./build-dh

Terminados os passos de geração de certificados e chaves, terá um diretório “keys” com todas as informações criadas:

$ ls -1 keys/
01.pem
02.pem
ca.crt
ca.key
dd-wrt.crt
dd-wrt.csr
dd-wrt.key
dh2048.pem
index.txt
index.txt.attr
index.txt.attr.old
index.txt.old
serial
serial.old
server.crt
server.csr
server.key

Amazon EC2

Por meio do AWS, a Amazon permite criar uma conta gratuita por 1 ano. Então pra minha finalidade foi perfeito. E tem a vantagem de permitir criar o servidor em qualquer lugar do mundo onde a Amazon tenha datacenter. Isso significa EUA, Brasil, Irlanda, Alemanha, Japão, Singapura e Austrália. E a criação está simplesmente a um clique de distância.

vpn-2

Não vou descrever o processo de criação de uma instância no AWS (máquina virtual) pra não deixar o artigo muito extenso, e também porque existem já bastantes documentos sobre o assunto. Mas é basicamente clicar pra criar uma instância, decidir o tipo gratuito, que foi Ubuntu no meu caso, e esperar a máquina virtual ser criada e ativada.

É importante permitir que a instância receba tráfego na port 1194 com protocolo UDP pra estabelecer a VPN.

Com a instância funcionando, basta instalar o pacote openvpn e copiar as chaves criadas para dentro do servidor.

ssh root@servidor_aws
aws# apt-get install openvpn
aws# exit
scp -r keys root@servidor_aws:/etc/openvpn

Eu resolvi deixar tudo dentro de “/etc/openvpn” pra facilitar a configuração.

A configuração do lado servidor pode ser inserida dentro do arquivo “/etc/openvpn/dd-wrt-server.conf”:

dev tun
verb 4 
dh /etc/openvpn/keys/dh2048.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/01.pem
key /etc/openvpn/keys/server.key
tls-server
mode server
client-to-client
persist-key
persist-tun
push "redirect-gateway"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DOMAIN aws.lan"
keepalive 15 60
server 10.1.0.0 255.255.255.0
auth sha256
cipher aes-256-cbc
link-mtu 1570
comp-lzo

e dentro de “/etc/default/openvpn” basta inserir a linha:

AUTOSTART="dd-wrt-server"

e reiniciar o daemon de openvpn pra ter tudo funcionando. O servidor também precisa permitir tráfego e fazer NAT dele, então os seguintes comandos são necessários (e podem ser colocados em scripts dentro da configuração do openvpn):

iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
sysctl -w net.ipv4.ip_forward

Criando um cliente OpenVPN para testar a configuração

DD-WRT não tem uma das melhores formas de debugar conexão. Então, caso queira testar de um outro computador, basta criar um arquivo “dd-wrt-client.conf” com a seguinte configuração:

dev tun
remote 52.30.152.15
verb 3
client
remote-cert-tls server
resolv-retry infinite
nobind
persist-key
persist-tun
float
route-delay 30
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/dd-wrt.crt
key /etc/openvpn/keys/dd-wrt.key
comp-lzo

No caso, basta apenas trocar a linha “remote 52.30.152.15” pra da VPS no AWS. Como no servidor, copie as chaves para dentro do diretório “/etc/openvpn/keys” pra facilitar a configuração.

Para iniciar o túnel, basta chamar openvpn como root ou via sudo:

sudo openvpn --config dd-wrt-client-conf

e testar se a conexão está estabelecida corretamente.

Finalmente o DD-WRT

No DD-WRT, basta ir na aba de “services/VPN” e habilitar o “OpenVPN”.  A configuração é a seguinte:

vpn-3

Em “Server IP/Name”, basta colocar o IP da instância da AWS. Em CA Cert, o certificado da entidade certificadora, basta copiar e colar o conteúdo de “keys/ca.crt”. Em “Public Client Cert”, é copiado o conteúdo de “keys/dd-wrt.crt” inteiro, inclusive os dados que estão no início (e que parecem não ser necessários, mas são). Por último, em “Private Client Key”, vão os dados de “keys/dd-wrt.key”, que é a chave privada.

Terminada a configuração, basta salvar e aplicar pra ter seu túnel OpenVPN iniciado diretamente do roteador.

E deu certo no final?

Não.  Eu mudei minha conta pra UK pra ter conteúdo em inglês. Então preciso mudar de novo pro Brasil, mudança permitida somente a cada 3 meses, pra ativar os jogos. Não é à toa que Bill Gates é o homem mais rico do mundo.

De agora em diante, só jogos em mídia digital pro playstation e steam.