Como ter sua própria VPN com OpenVPN e Docker

Nesse artigo mostraremos como você pode hospedar sua própria VPN usando os software OpenVPN e Docker.

Pré-requisitos

  • Acesso à shell de um VPS com um endereço IP público
  • Acesso à algum usuário do grupo docker na VPS
  • Familiaridade com a linha de comando

Docker OpenVPN

Docker OpenVPN é um projeto que visa automatizar a configuração e set up do software OpenVPN usando Docker.

Como diz a própria página do GitHub

Out of the box stateless openvpn server docker image which starts in just a few seconds and doesn't require persistent storage

Estaremos utilizando esse software nesse tutorial.

Instalando OpenVPN

Primeiro, faça ssh na sua VPS.

Arquivo .env

Então, crie um diretório onde iremos armazenar algumas configurações que serão usadas posteriormente.

mkdir docker-openvpn && cd docker-openvpn
touch .env

O arquivo .env terá algumas configurações básica sobre a VPN.

CONTAINER_NAME=openvpn
PUBLIC_IP=127.0.0.1

Substituta 127.0.0.1 pelo seu endereço IP público. Se você não sabe qual é o endereço, execute o seguinte comando na shell da sua VPS:

curl -s https://api.ipify.org

Que irá imprimir o endereço IP da sua VPS. Então coloque esse endereço no arquivo .env.

Usando docker

Há duas formas de instalar Docker OpenVPN. Usando docker, execute os seguintes comandos:

source .env
docker run --detach \
    --cap-add=NET_ADMIN \
	--publish 1194:1194/udp \
	--env HOST_ADDR=${PUBLIC_iP} \
	--name ${CONTAINER_NAME} \
	alekslitvinenk/openvpn

O comando source .env irá colocar as variáveis espeficadas em .env como variáveis de ambiente.

A flag --detach é para o container ser executado como um background process. A flag --cap-add adiciona capacidades do Linux ao container, nesse caso, ser administrador da rede. A flag --env especifica variáveis de ambiente do container. A flag --name especifica o nome do container. A flag --publish irá mapear portas do host para o container usando o protocolo especificado.

Por fim, temos o nome da imagem usada: alekslitvinenk/openvpn.

Usando docker-compose

Eis un docker-compose.yml para facilitar o trabalho:

version: "2.0"

services:
  openvpn:
    container_name: ${CONTAINER_NAME}
    image: alekslitvinenk/openvpn
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    environment:
      - HOST_ADDR=${PUBLIC_IP}
    ports:
      - 1194:1194/udp

Coloque esse arquivo no mesmo diretório que o arquivo .env, ou seja, em docker-openvpn/docker-compose.yml.

Então, nesse mesmo diretório, rode o comando:

docker-compose up --detach

Novamente, a flag detach é para rodar a VPN no background.

Configurando o cliente

Obtendo o arquivo de configuração

Após ter configurado o servidor, precisamos obter o arquivo de configuração do OpenVPN. Para isso, usaremos curl.

Por padrão, essa imagem Docker não vem com curl. Temos que instala-lo como segue:

docker exec ${CONTAINER_NAME} apk add curl

Onde ${CONTAINER_NAME} é o nome do container especificado em .env.

Após isso, execute:

docker exec ${CONTAINER_NAME} curl -s localhost:8080 > client.ovpn

Isso irá executar o comando curl dentro do container, que irá fazer um request para localhost:8080, o qual devolverá o arquivo de configuração do nosso OpenVPN e redirecionar a saída para o arquivo client.ovpn.

Atenção: Após o request ser feito, o servidor http que está ativo em localhost:8080 será automaticamente desativado, o que significa que não será possível mais obter a configuração do OpenVPN. Entretanto, você pode gerar uma nova configuração usando o comando docker exec ${CONTAINER_NAME} ./genclient.sh.

Depois disso você pode transferir o arquivo client.ovpn para sua máquina local usando scp, rsync, ou copiando e colando o conteúdo do arquivo caso seu terminal suporte operações de copiar-e-colar.

Usando scp:

scp username@host_address:/path/to/client.ovpn .

O comando acima irá usar o protocolo ssh para transferir o arquivo client.ovpn para o diretório atual na sua máquina local.

Lembre-se de substituir username, host_address, e /path/to/client.ovpn pelo seu usuário de nome na VPS, o endereço IP da VPS, e o caminho absoluto do arquivo salvo anteriormente.

Ativando a VPN com o Network Manager

Há inúmros software clientes do OpenVPN. Essa parte do tutorial pressupõe que você está usando network-manager, que é um software gerenciador de rede disponível em variás distribuições Linux e BSD. Entretanto, mesmo que você não use networkmanager , é provável que tenha algum cliente que funciona para o seu gerenciador de redes.

Primeiro, instale os pacotes openvpn, networkmanager, e networkmanager-openvpn. É possível que os nomes dos pacotes sejam diferentes dependendo do seu Sistema Operacional.

Se você está usando alguma Arch-based distro, instale como segue:

pacman -S openvpn networkmanager networkmanager-openvpn

Após isso, e após habilitar o networkmanager, execute:

nmcli connection import type openvpn file /path/to/client.ovpn/

Onde /path/to/client.ovpn/ é o caminho do arquivo client.ovpn na sua máquina local.

Esse comando irá adicionar uma conexão VPN na sua máquina. Para se conectar à VPN, execute o comando:

nmcli connection up client

Pronto :D, agora você tem sua própria VPN!