Crie sua própria VPN em poucos minutos com Docker + OpenVPN

Em tempos de Docker, uma VPN pessoal pode ser configurada em minutos e é isso que veremos hoje. 🙂

Antes de mais nada, meu intuito não é explicar o que é uma VPN, mas, de qualquer sorte, se você chegou aqui e gostaria de mais informações a respeito, um bom link seria esse (https://pt.wikipedia.org/wiki/Virtual_private_network).

Enfim, a motivação desse post veio de uma necessidade pessoal, visto que a Internet que uso atualmente é compartilhada, e isso por si só já é motivo de sobra para usar uma VPN.

Até algum tempo atrás, configurar uma VPN poderia levar algumas boas horas dependendo das configurações desejadas, sem falar no conhecimento exigido para efetuar toda a configuração, já que é necessário configurar chaves de acesso, scripts de geração de clientes, configurações de rede e assim vai.

Para nossa sorte hoje podemos contar com o Docker que já nos livra 90% do trabalho, nos entregando uma imagem praticamente pronta para o uso.

Caso você não conheça o Docker, essa talvez seja a hora de você fazer o nosso curso… 🙂 onde mostro tin-tin por tin-tin os passos necessários para o real entendimento dessa maravilhosa ferramenta. Mas, deixando o jabá de lado, vamos ao que interessa.

No nosso exemplo, utilizarei a Digital Ocean como VPS devido haver algumas facilidades no uso que veremos logo a seguir.

Criando um Droplet com o Docker Instalado

Após efetuar o seu cadastro na Digital Ocean, proceda criando um droplet que já vem com o Docker instalado, poupando mais um passo em nossa configuração.

Clique em Create > Droplets

Em seguida em One-click-apps > Docker 17.12 ce on 16.04, selecione a configuração desejada e ao final clique em Create para que a droplet seja provisionada.

Acesse sua VPS através de um console

Logo após a conclusão do provisionamento, devemos acessar o console clicando em More > Access Console. No pompt de login, use o usuário root e a senha que foi enviada para o seu email.

É normal que no primeiro acesso seja solicitado que você crie uma nova senha e após criada a nova senha, você deve repetir o procedimento de acesso ao console.

Por fim, após acessar o console, digita-se docker version no terminal para verificar se tudo está devidamente instalado e funcionando.

Baixe a imagem do OpenVPN

O Docker Hub já disponibiliza uma imagem do OpenVPN (https://hub.docker.com/r/kylemanna/openvpn/) que podemos usar com poucos comandos. Vamos começar baixando a imagem:

docker pull kylemanna/openvpn

Após a finalização do download da imagem, confirme que a nova imagem está disponível digitando:

docker images

Pronto! Nesse momento já temos tudo necessário para o funcionamento da nossa VPN, faltando apenas configurá-la.

Então, vamos lá!

Configurando o OpenVPN

Primeiro vamos definir uma variável de ambiente que facilitará nossa vida quando formos fazer os passos seguintes, para isso, digite no terminal:

OVPN_DATA="opvn-data-minha-vpn"

É claro que você pode alterar o nome, mas recomenda-se usar sempre “ovpn-data-<nome desejado>” para o conteúdo dessa variável.

Na sequência você pode fazer um teste, digitando no terminal o comando abaixo para ver se a variável foi criada com sucesso.

echo $OVPN_DATA

Ao digitar o comando acima, o resultado deve ser o valor da variável definida anteriormente.

O próximo passo é criar um volume aproveitando a variável definida.

docker volume create --name $OVPN_DATA

Na sequência, vamos inicializar usar a imagem baixada para gerar uma configuração inicial no nosso droplet.

Perceba que no final do comando você deve digitar o IP da sua droplet que pode ser conseguida no mesmo email que a Digital Ocean enviou a senha.

docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://IP_DO_SEU_DROPLET

A saída será algo como esse trecho abaixo…

Agora vamos criar a chave privada que nos permitirá gerar os certificados que serão usados pelos clientes da VPN, para isso, rode o comando:

docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

Ao rodar o comando acima, será solicitada uma senha (PEM pass phrase) que você deve definir e logo na sequência será solicitado novamente a mesma senha para confirmar.

Logo depois será solicitado o nome do seu servidor que vai identificar o certificado. Esse nome pode ser qualquer um, ou se preferir, deixe em branco.

Depois de um longo processo, ainda será solicitado que você digite mais 2 vezes a senha que determinou no início da configuração.

Nesse momento, já temos nossa VPN configurada! \o/

Inicie o servidor a partir da imagem Docker:

docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

Se o servidor for iniciado corretamente, o Docker informará um hash de identificação do processo, conforme imagem:

Prontinho, agora vamos gerar os certificados para os nossos clientes. 😉

Gerando os certificados para os clientes

Para gerar um certificado sem exigir password do cliente basta rodar o comando:

docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full NOME_DO_CLIENTE nopass

Esse comando exigirá que você digite apenas a senha que determinou para sua chave privada (aquela criada no início da configuração).

Perceba que no comando acima você deve substituir o NOME_DO_CLIENTE por uma string que o identifique (prefira nomes sem caracteres especiais e também não use espaços).

Agora que já temos o certificado, vamos criar um arquivo .ovpn pois é a partir dele para que vamos configurar nossos clientes. Para isso rode o comando:

docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient NOME_DO_CLIENTE > NOME_DO_CLIENTE.ovpn

Prontinho! Como não temos como baixar diretamente o arquivo, uma dica é você usar o comando…

cat NOME_DO_CLIENTE.ovpn 

…para verificar o seu conteúdo, que nada mais são do que a chaves que farão a conexão com o servidor.

Copie o conteúdo apresentado e crie um arquivo de mesmo nome (NOME_DO_CLIENTE.ovpn), colando em seguida o conteúdo copiado.

Configurando o Cliente no Windows

Agora que já temos o arquivo .ovpn podemos fazer um teste, que nesse caso será feito no Windows.

Como aplicativo cliente, vamos usar o OpenVPN-GUI (https://sourceforge.net/projects/openvpn-gui/).

A instalação é básica, mas o pulo do gato é que devemos copiar o arquivo .ovpn para C:\Arquivos de Programas\OpenVPN\config, e só depois iniciar o aplicativo.

Configurando Cliente no macOS

No caso do Mac eu usei o Tunnelblick (https://tunnelblick.net/) que é muito simples de usar, bastando pra isso arrastar o arquivo .ovpn para o ícone do aplicativo em funcionamento (na barra superior).

Configurando o Cliente no Linux

Eu não cheguei a usar no Linux, mas a configuração também parece simples, bastando seguir os passos desse link: https://openvpn.net/index.php/access-server/docs/admin-guides/182-how-to-connect-to-access-server-with-linux-clients.html .

Então é isso, gente! Espero que esse post ajude a criar sua própria VPN, sem depender de nenhum serviço de terceiro! 😉

Até a próxima!