Última atualização:
VPN dentro do conteiner docker por codamos.com.br
Foto: Anthony DeRosa, via Pexels

Como rodar um client OpenVPN dentro de um container docker

Nawarian
Nawarian docker

Com certa frequência eu preciso me conectar a redes VPN para realizar serviços em clientes com servidores em outros continentes, de forma que a latência de todos os aplicativos do meu computador que utilizam a internet acabam por sofrer - e muitas vezes eu preciso apenas fazer uma conexão SSH.

Neste tutorial eu vou te mostrar como eu resolvi este problema ao mover o cliente VPN para um contêiner docker de forma que toda a rede da minha máquina se manteve com a conexão local comum.

Como já é de costume, fiz um vídeo rápido explicando como seguir o passo a passo deste artigo:

Configurar um contêiner docker para conectar-se à VPN

Para este tutorial vamos utilizar a imagem alpine:3.17, mas este passo a passo deverá funcionar com qualquer outra distribuição - talvez com alguns ajustes aqui e ali.

Vamos então baixar a imagem:

$ docker pull alpine:3.17
Comando docker pull que baixa a imagem alpine:3.17
Comando docker pull que baixa a imagem alpine:3.17

Após baixada a imagem podemos já rodar o nosso contêiner. Para executar o contêiner precisamos passar alguns parâmetros relacionados à rede e como ele vai criar o túnel VPN. A linha de comando completa fica assim:

$ docker run --rm -it --cap-add=NET_ADMIN alpine:3.17
Dentro do contêiner, visualizando dados do usuário e interfaces de rede.
Dentro do contêiner, visualizando dados do usuário e interfaces de rede.

O comando acima vai rodar um contêiner em modo interativo (-it) e este contêiner vai ser removido assim que você terminar sua sessão (--rm). Além disso nós vamos dar a capacidade ao contêiner de mexer na nossa interface de rede (--cap-add=NET_ADMIN). Por fim, estamos invocando uma sessão shell da imagem alpine:3.17.

Como instalar e configurar o cliente openvpn no contêiner docker

Agora que o contêiner já tem a capacidade de modificar a nossa interface de rede (--cap-add=NET_ADMIN) nós podemos instalar os pacotes necessários e configurar o ambinte.

Vamos criar um device que será capaz de abrir um túnel VPN dentro do contêiner seguindo as instruções de configuração do driver TAP/TUN do manual do Kernel GNU/Linux:

$ mkdir /dev/net
$ mknod /dev/net/tun c 10 200
$ chmod 0666 /dev/net/tun
Criando o device de TUN/TAP conforme o manual do Kernel GNU/Linux
Criando o device de TUN/TAP conforme o manual do Kernel GNU/Linux

Agora podemos instalar o cliente openvpn diretamente no nosso contêiner alpine:

$ apk update
$ apk add openvpn
Instalação do pacote openvpn através do gerenciador de pacotes apk
Instalação do pacote openvpn através do gerenciador de pacotes apk

Como ligar a rede VPN dentro do contêiner docker

Agora que tudo está instalado e configurado, podemos conectar o nosso contêiner à rede VPN através da linha de comando seguinte:

$ openvpn client.ovpn > /dev/null &

Onde client.ovpn é um arquivo de configuração no formato do OpenVPN com os dados de conexão e credenciais da rede externa. Repare que o fim do comando redireciona qualquer texto para o limbo de forma que não apareça na sua tela (> /dev/null) e joga o comando para executar em plano de fundo (&) de maneira que você possa rodar outros comandos imediatamente.

Ilustração do comando que abre o túnel VPN. Repare que o tempo de resposta do ping aumentou após alguns momentos - exatamente quando o túnel foi estabelecido.
Ilustração do comando que abre o túnel VPN. Repare que o tempo de resposta do ping aumentou após alguns momentos - exatamente quando o túnel foi estabelecido.

Desta forma você consegue rodar o cliente VPN dentro de um contêiner docker sem precisar conectar a sua máquina host ao servidor externo, de forma a poder utilizar outros serviços online sem o problema da latência.

Comentários