Graças aos entraves do software proprietário, resolvi melhorar minhas opções de uso 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 idéia de que algo que comprou, que é seu, mas não é seu de verdade. Só o software proprietário te permite entraves assim.
Uma opção que tentei fazer foi através 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 o mesmo 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.
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 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 para 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 seguinda limpe qualquer configuração com "clean-all".
. vars ./clean-all ./build-ca
Basta ir respondendo as 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 [This email address is being protected from spambots. You need JavaScript enabled to view it. ]:This email address is being protected from spambots. You need JavaScript enabled to view it.
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 para 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 o mesmo 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
Através 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 simplesmente a um clique de distância.
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 a instância receber tráfego na port 1194 com protocolo UDP pra estabelecer a VPN.
Uma vez 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 do mesmo, 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
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" para 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.
No DD-WRT, basta ir na aba de "services/VPN" e habilitar o "OpenVPN". A configuração é a seguinte:
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.