Configurar um servidor OpenVPN no Ubuntu oferece uma solução VPN robusta e amplamente testada, respaldada por uma PKI madura — ideal para trabalhadores remotos, links site-to-site e para proteger o tráfego em redes não confiáveis. Este guia percorre cada etapa: construção de uma autoridade certificadora com Easy-RSA, escrita de um server.conf pronto para produção, geração de perfis .ovpn para clientes, configuração de regras de firewall UFW e habilitação do NAT masquerade para que os clientes VPN acessem a internet.

Pré-requisitos

  • Servidor Ubuntu 22.04 LTS ou 24.04 LTS com endereço IP público
  • Acesso sudo ou root
  • Um nome de domínio ou IP estático apontando para o servidor (recomendado)
  • Familiaridade básica com a linha de comando Linux
  • UFW instalado (padrão no Ubuntu; instale com sudo apt install ufw se ausente)

Instalando OpenVPN e Easy-RSA

Comece atualizando a lista de pacotes e instalando o OpenVPN e o kit Easy-RSA:

sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y

Copie o diretório de modelos do Easy-RSA para um local persistente dentro do diretório do OpenVPN:

sudo mkdir -p /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

Construindo a PKI com Easy-RSA

Uma PKI completa do OpenVPN é composta por uma Autoridade Certificadora (CA), um par certificado/chave do servidor, parâmetros Diffie-Hellman e uma chave HMAC para autenticação TLS.

Inicializar a PKI e criar a CA

sudo ./easyrsa init-pki
sudo ./easyrsa build-ca nopass

Aceite o Common Name padrão (Easy-RSA CA) ou defina o seu próprio. O parâmetro nopass ignora a solicitação de senha da CA — aceitável para servidores automatizados, mas adicione uma senha em ambientes de alta segurança.

Gerar o certificado do servidor

sudo ./easyrsa gen-req server nopass
sudo ./easyrsa sign-req server server

Digite yes para confirmar a assinatura. Isso gera pki/issued/server.crt e pki/private/server.key.

Gerar os parâmetros Diffie-Hellman e a chave de autenticação TLS

Os parâmetros DH levam vários minutos para serem gerados:

sudo ./easyrsa gen-dh
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key

Copie todas as chaves necessárias para o diretório do servidor OpenVPN:

sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key \
        pki/dh.pem pki/ta.key /etc/openvpn/server/

Escrevendo o server.conf

Crie /etc/openvpn/server/server.conf com a seguinte configuração:

# /etc/openvpn/server/server.conf

port 1194
proto udp
dev tun

ca   /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key  /etc/openvpn/server/server.key
dh   /etc/openvpn/server/dh.pem

# Sub-rede VPN — clientes recebem endereços deste pool
server 10.8.0.0 255.255.255.0

# Empurra a rota padrão (todo o tráfego do cliente pela VPN)
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"

# Reforço TLS
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun

# Registro de logs
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3

Crie o diretório de logs e inicie o serviço:

sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server
sudo systemctl status openvpn-server@server

Regras de Firewall e Roteamento NAT

Habilitar o encaminhamento IP

Edite /etc/sysctl.conf e descomente (ou adicione) a seguinte linha:

net.ipv4.ip_forward=1

Aplique imediatamente sem reinicialização:

sudo sysctl -p

Adicionar regras NAT masquerade ao UFW

Encontre sua interface de rede pública (geralmente eth0 ou ens3):

ip route | grep default

Edite /etc/ufw/before.rules e insira o bloco a seguir antes da seção *filter:

# OpenVPN NAT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Substitua eth0 pelo nome real da sua interface.

Em seguida, permita o encaminhamento de pacotes em /etc/default/ufw:

DEFAULT_FORWARD_POLICY="ACCEPT"

Abra a porta do OpenVPN e recarregue o UFW:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw reload

Gerando Certificados de Cliente e Arquivos .ovpn

Criar um certificado de cliente

cd /etc/openvpn/easy-rsa
sudo ./easyrsa gen-req client1 nopass
sudo ./easyrsa sign-req client client1

Montar o arquivo client1.ovpn

Um arquivo .ovpn autocontido incorpora todos os certificados inline para que o usuário precise de apenas um arquivo. Crie /root/clients/client1.ovpn:

client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
# cole aqui o conteúdo de /etc/openvpn/server/ca.crt
</ca>

<cert>
# cole aqui o conteúdo de /etc/openvpn/easy-rsa/pki/issued/client1.crt
</cert>

<key>
# cole aqui o conteúdo de /etc/openvpn/easy-rsa/pki/private/client1.key
</key>

<tls-auth>
# cole aqui o conteúdo de /etc/openvpn/server/ta.key
</tls-auth>

Você pode automatizar a incorporação com um script shell:

#!/bin/bash
# gen-client.sh
CLIENT=$1
OVPN_DIR=/root/clients
KEYS=/etc/openvpn/easy-rsa/pki

cat > "$OVPN_DIR/$CLIENT.ovpn" <<EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3

<ca>
$(cat "$KEYS/ca.crt")
</ca>

<cert>
$(openssl x509 -in "$KEYS/issued/$CLIENT.crt")
</cert>

<key>
$(cat "$KEYS/private/$CLIENT.key")
</key>

<tls-auth>
$(cat /etc/openvpn/server/ta.key)
</tls-auth>
EOF
echo "Gerado $OVPN_DIR/$CLIENT.ovpn"

Uso: sudo bash gen-client.sh client1

Comparação OpenVPN vs WireGuard

RecursoOpenVPNWireGuard
ProtocoloTLS sobre UDP/TCPSomente UDP (protocolo WireGuard)
Flexibilidade de portaUDP 1194 ou TCP 443Somente UDP (padrão 51820)
Suporte a clientesTodas as plataformas + dispositivos legadosPlataformas modernas (Linux 5.6+, iOS, Android, Windows)
Complexidade de configuraçãoAlta (PKI, múltiplos arquivos)Baixa (par de chaves, configuração única)
ThroughputBomExcelente (espaço de kernel)
Travessia de firewallExcelente (modo TCP 443)Limitado (somente UDP)
Histórico de auditoriaExtenso (desde 2001)Enxuto, formalmente verificado
Suporte site-to-siteNativoNativo
IPs dinâmicosVia flag --floatRoaming automático
Melhor paraAmpla compatibilidade, clientes legados, redes somente TCPAlto desempenho, implantações modernas, simplicidade

Recomendação: Escolha WireGuard para novas implantações onde todos os clientes usam sistemas operacionais modernos. Escolha OpenVPN quando precisar suportar Windows 7/8, versões antigas do iOS ou redes que bloqueiam UDP completamente.

Cenário Real

Você gerencia uma pequena equipe de desenvolvimento de software onde três desenvolvedores remotos acessam uma instância interna do GitLab e um servidor de banco de dados de staging. Seu servidor GitLab fica em 192.168.10.10 dentro da rede do escritório, atrás de um firewall que só expõe SSH e HTTPS à internet.

Após configurar o OpenVPN com os passos acima, cada desenvolvedor executa seu perfil dev-name.ovpn no cliente OpenVPN. Uma vez conectado, a estação de trabalho recebe um endereço na faixa 10.8.0.0/24. Você adiciona uma rota estática no servidor OpenVPN empurrando 192.168.10.0/24 para os clientes:

push "route 192.168.10.0 255.255.255.0"

Agora os desenvolvedores acessam 192.168.10.10 diretamente pelo túnel criptografado sem expor o GitLab à internet pública. Você revoga o acesso instantaneamente executando ./easyrsa revoke dev-name seguido de ./easyrsa gen-crl, depois adicionando crl-verify /etc/openvpn/server/crl.pem ao server.conf — sem necessidade de alterar senhas.

Armadilhas e Casos Especiais

Conflitos de roteamento com 10.8.0.0/24: Se a sua LAN já usa essa sub-rede, altere a diretiva server para um intervalo não utilizado como 10.9.0.0 255.255.255.0 e atualize a regra de NAT masquerade correspondentemente.

Split tunneling vs túnel completo: A diretiva push redirect-gateway def1 roteia todo o tráfego do cliente pela VPN. Para split tunneling (apenas sub-redes específicas), remova essa linha e empurre rotas explícitas.

Modo TCP para firewalls restritivos: Se UDP 1194 estiver bloqueado, altere proto udp para proto tcp e port 1194 para port 443 tanto no servidor quanto nas configurações do cliente. O desempenho será menor devido à ineficiência de TCP sobre TCP, mas a travessia melhora significativamente.

Revogação de certificados: Sempre gere e sirva uma CRL ao revogar clientes. Sem crl-verify no server.conf, os certificados revogados continuam funcionando.

Fragmentação de MTU: Se os clientes apresentarem throughput lento ou pacotes descartados, adicione tun-mtu 1400 e mssfix 1360 ao server.conf.

Atribuições de IP persistentes: Use um client-config-dir (CCD) com diretivas ifconfig-push por cliente para atribuir sempre o mesmo IP quando um cliente se conectar.

Solução de Problemas

Serviço falha ao iniciar: Execute sudo journalctl -u openvpn-server@server -e para ler o log completo. As causas mais comuns são caminhos de arquivos incorretos no server.conf ou direção incompatível do ta.key.

Clientes conectam mas não conseguem acessar a internet: Confirme que o encaminhamento IP está ativo (cat /proc/sys/net/ipv4/ip_forward deve retornar 1), que a regra MASQUERADE está presente (sudo iptables -t nat -L) e que DEFAULT_FORWARD_POLICY=ACCEPT está definido em /etc/default/ufw.

Falha no handshake TLS: Verifique se o valor de key-direction corresponde: 0 no lado do servidor, 1 no lado do cliente (ou use tls-crypt em vez de tls-auth, que é independente de direção).

Vazamentos de DNS: Verifique se os pushes de dhcp-option DNS são recebidos pelo cliente com openvpn --show-status client.log. Use dnsleak.com para confirmar que as consultas DNS saem pela VPN.

Certificado do cliente expirado: O Easy-RSA usa por padrão certificados de cliente com validade de 825 dias. Regere antes do vencimento com ./easyrsa renew client1 nopass e redistribua o arquivo .ovpn atualizado.

Resumo

  • Instale openvpn e easy-rsa, depois inicialize uma PKI com uma CA, certificado do servidor, parâmetros DH e ta.key
  • Escreva server.conf com cifra AES-256-GCM, reforço de autenticação TLS e a sub-rede VPN 10.8.0.0/24
  • Habilite o encaminhamento IP e adicione uma regra UFW MASQUERADE para que os clientes VPN acessem a internet
  • Use um script shell para incorporar certificados inline em perfis .ovpn autocontidos para os clientes
  • OpenVPN é a escolha certa para clientes legados e travessia de firewalls somente TCP; WireGuard vence em desempenho e simplicidade para implantações modernas
  • Revogue clientes instantaneamente via CRL do Easy-RSA sem redefinir segredos compartilhados
  • Monitore /var/log/openvpn/openvpn.log e use journalctl para diagnósticos no nível do serviço

Artigos Relacionados