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 ufwse 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
| Recurso | OpenVPN | WireGuard |
|---|---|---|
| Protocolo | TLS sobre UDP/TCP | Somente UDP (protocolo WireGuard) |
| Flexibilidade de porta | UDP 1194 ou TCP 443 | Somente UDP (padrão 51820) |
| Suporte a clientes | Todas as plataformas + dispositivos legados | Plataformas modernas (Linux 5.6+, iOS, Android, Windows) |
| Complexidade de configuração | Alta (PKI, múltiplos arquivos) | Baixa (par de chaves, configuração única) |
| Throughput | Bom | Excelente (espaço de kernel) |
| Travessia de firewall | Excelente (modo TCP 443) | Limitado (somente UDP) |
| Histórico de auditoria | Extenso (desde 2001) | Enxuto, formalmente verificado |
| Suporte site-to-site | Nativo | Nativo |
| IPs dinâmicos | Via flag --float | Roaming automático |
| Melhor para | Ampla compatibilidade, clientes legados, redes somente TCP | Alto 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
openvpneeasy-rsa, depois inicialize uma PKI com uma CA, certificado do servidor, parâmetros DH eta.key - Escreva
server.confcom cifra AES-256-GCM, reforço de autenticação TLS e a sub-rede VPN10.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
.ovpnautocontidos 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.loge usejournalctlpara diagnósticos no nível do serviço