OpenVPN Server com Docker

VPN

Uma Virtual Private Network (VPN) permite que você atravesse redes não confiáveis como se estivesse em uma rede privada. Ela dá a você a liberdade de acessar a internet com segurança no seu smartphone ou notebook ao se conectar a uma rede não confiável, como o wi-fi em um hotel ou café. [1]

Docker

Docker é uma plataforma aberta, criada com o objetivo de facilitar o desenvolvimento, a implantação e a execução de aplicações em ambientes isolados. Foi desenhada especialmente para disponibilizar uma aplicação da forma mais rápida possível. [2]

Docker Compose é uma ferramenta que foi desenvolvida para ajudar a definir e compartilhar aplicativos de vários contêineres. Com o Compose, você pode criar um arquivo YAML para definir os serviços e, com um único comando, pode girar tudo ou destruir tudo. [3]

Instalação

Arquivo docker-compose.yml: [4]

version: '3.7'

services:
  openvpn:
    cap_add:
     - NET_ADMIN
    image: kylemanna/openvpn
    container_name: openvpn
    ports:
     - "1194:1194/udp"
    restart: always
    volumes:
     - ./openvpn-data/conf:/etc/openvpn
    expose:
      - 5555
    networks:
      - skynet


  web:
    image: 'ruimarinho/openvpn-monitor'
    environment:
            - OPENVPNMONITOR_DEFAULT_DATETIMEFORMAT=%%d/%%m/%%Y
            - OPENVPNMONITOR_DEFAULT_LATITUDE=-37
            - OPENVPNMONITOR_DEFAULT_LONGITUDE=144
            - OPENVPNMONITOR_DEFAULT_MAPS=True
            - OPENVPNMONITOR_DEFAULT_MAPSHEIGHT=500
            - OPENVPNMONITOR_DEFAULT_SITE=Live
            - OPENVPNMONITOR_SITES_0_ALIAS=server1
            - OPENVPNMONITOR_SITES_0_HOST=openvpn
            - OPENVPNMONITOR_SITES_0_NAME=server1
            - OPENVPNMONITOR_SITES_0_PORT=5555
            - OPENVPNMONITOR_SITES_0_SHOWDISCONNECT=True
    networks:
      - skynet


  auth:
    image: 'beevelop/nginx-basic-auth'
    ports:
      - '8080:80'
    links:
      - "web:web"
    environment:
      - PORT=80
      - FORWARD_HOST=web
      - FORWARD_PORT=80
      ## escape $ with $$ in Docker yml due to variable expansion
      ## example user/pass generated with htpasswd is admin:batman 
      - HTPASSWD=admin:$$apr1$$2tupacmb$$heiUX0m1cgIACrT63/y3k/
    networks:
      - skynet


networks:
  skynet:
    name: skynet
    ipam:
      driver: default
      config:
      - subnet: "192.168.35.0/20"

Inicialize os arquivos de configuração e certificados

docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
docker-compose run --rm openvpn ovpn_initpki

Corrija a permissão (dependendo da forma como lida com seus backups, isso pode não ser necessário)

sudo chown -R $(whoami): ./openvpn-data

Iniciar o processo OpenVPN server

docker-compose up -d openvpn

Você pode acessar os logs do contêiner com:

docker-compose logs -f

Gerar um certificado de cliente

export CLIENTNAME="your_client_name"

# with a passphrase (recommended)
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME

# without a passphrase (not recommended)
docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME nopass

Recupere a configuração do cliente com certificados incorporados

docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn

Revogar um certificado de cliente

# Keep the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME

# Remove the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME remove

Dicas de depuração
Crie uma variável de ambiente com o nome DEBUG e valor 1 para habilitar a saída de depuração (usando “docker -e”)

docker-compose run -e DEBUG=1 -p 1194:1194/udp openvpn

Obs.: para que o monitor tenha acesso ao servidor OpenVPN é necessário incluir no arquivo de configuração do OpenVPN a seguinte linha:

vim openvpn-data/conf/openvpn.conf
management openvpn 5555

Configuração OpenVPN no Linux

  • Mova o arquivo ovpn para "/etc/openvpn"
  • "cd /etc/openvpn" e insira o arquivo "yourserver.txt" contendo:
    • your_server_user_name
    • your_server_passowrd
  • No arquivo "OpenVPNConfigFile.ovpn" encontre ou adicione "auth-user-pass yourserver.txt" Isso permitirá que você pule a inserção de suas credenciais sempre que iniciar a conexão openvpn.
  • Renomeie "OpenVPNConfigFile.ovpn" para "OpenVPNConfigFile.conf"
  • Em "/etc/default/openvpn" descomentar 'AUTOSTART="all"'
  • "sudo service openvpn start" A conexão será estabelecida toda vez que você iniciar o computador.

Dicas

Editar o arquivo vim ~/.bashrc , adicionar em .bashrc a linha a seguir, e posteriormente executar o comando source ~/.bashrc

alias meuip='dig @resolver4.opendns.com myip.opendns.com +short' 

Após esses passos, é possível usar o comando “meuip” para identificar o IP externo e testar se a VPN está ativa.

Para executar o OpenVpn automaticamente, é necessário editar o arquivo /etc/default/openvpn e remover o comentário da linha AUTOSTART=”all”. Copiar o arquivo .opvn para o diretório /etc/openvpn/client.conf

sudo vim /etc/default/openvpn 
# Descomentar a linha AUTOSTART="all"
# Mover o arquivo .ovpn para /etc/openvpn/
sudo cp arquivo.ovpn /etc/openvpn/arquivo.conf

Para executar o OpenVPN client no modo “dettached”:

sudo openvpn --config arquivo.ovpn --askpass --daemon

DNS Leak

To avoid DNS leak use the following commands: (source)

sudo apt install openvpn-systemd-resolved

and append the following lines to your .ovpn file:

script-security 2
dhcp-option DNS 208.67.222.222
dhcp-option DNS 208.67.220.220
dhcp-option DNS 8.26.56.26
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved