O WireGuard é hoje a VPN mais leve e rápida disponível no kernel Linux. Desde a versão 5.6 (março de 2020), o WireGuard está integrado diretamente no kernel, eliminando a necessidade de módulos externos. Para PME que precisam de ligar filiais, trabalhadores remotos ou infraestrutura cloud, o WireGuard oferece throughput superior ao OpenVPN com menos 4.000 linhas de código — contra as mais de 100.000 do OpenVPN.

Este guia mostra como instalar, configurar e pôr em produção o WireGuard em servidores Linux Debian/Ubuntu e RHEL/Fedora, com configuração de servidor, cliente, site-to-site e uma comparação directa com OpenVPN.

1. O que é o WireGuard e Porque Está no Kernel Linux

O WireGuard é um protocolo VPN de camada 3 que usa criptografia moderna: Curve25519 para troca de chaves, ChaCha20 para cifragem simétrica, Poly1305 para autenticação e BLAKE2s para hashing. A principal vantagem de estar no kernel (a partir do Linux 5.6) é a performance: os pacotes não atravessam o espaço de utilizador (userspace), reduzindo a latência e o overhead de CPU.

Antes do kernel 5.6, era necessário instalar o módulo wireguard-dkms via DKMS. Hoje, qualquer distribuição com kernel ≥5.6 já inclui o suporte nativo — basta instalar as ferramentas de utilizador (wireguard-tools).

Nota: Para verificar a versão do kernel, execute uname -r. Se o resultado for 5.6 ou superior, o WireGuard já está no kernel. Distribuições como Debian 12, Ubuntu 22.04+ e RHEL 9 já incluem kernel compatível.

Principais características

  • Configuração simples: um ficheiro .conf por interface, sem certificados TLS.
  • Roaming transparente: o cliente muda de IP (Wi-Fi para 4G) sem perder a túnel.
  • Atribuição de IP por interface: cada peer tem um IP privado estático no túnel.
  • UDP apenas: usa uma única porta UDP, facilitando firewalls e NAT.
  • Sem gestão de sessões: não há handshakes periódicos pesados — o WireGuard envia pacotes silenciosos só quando há tráfego.

2. Instalar o WireGuard em Debian/Ubuntu e RHEL/Fedora

A instalação divide-se em duas partes: o módulo do kernel (já incluído em kernel ≥5.6) e as ferramentas de utilizador (wg e wg-quick).

Debian 12 / Ubuntu 22.04+

sudo apt update
sudo apt install wireguard wireguard-tools

RHEL 9 / Fedora 38+

sudo dnf install wireguard-tools

Nota: Em RHEL 8 com kernel <5.6, instalar também sudo dnf install kmod-wireguard do repositório EPEL. Em Debian com kernel antigo, usar sudo apt install wireguard-dkms.

Habilitar IP forwarding no servidor

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

3. Gerar Chaves com wg genkey e wg pubkey

O WireGuard usa um par de chaves por peer: uma chave privada e uma chave pública. A chave privada fica no ficheiro de configuração do próprio peer; a chave pública é partilhada com o peer remoto.

Gerar par de chaves do servidor

wg genkey | tee servidor-priv.key | wg pubkey > servidor-pub.key
chmod 600 servidor-priv.key

Gerar par de chaves do cliente

wg genkey | tee cliente-priv.key | wg pubkey > cliente-pub.key
chmod 600 cliente-priv.key

Aviso: As chaves privadas (-priv.key) nunca devem ser enviadas por email ou chat. Partilhar apenas as chaves públicas (-pub.key) com o peer remoto. Guardar as chaves privadas com permissões 600.

4. Configurar Servidor e Cliente com wg-quick

O wg-quick é um script que automatiza a criação de interfaces, rotas e regras de firewall. Os ficheiros de configuração ficam em /etc/wireguard/<nome>.conf.

Configuração do servidor (wg0.conf)

[Interface]
PrivateKey = <CHAVE_PRIVADA_SERVIDOR>
Address = 10.0.0.1/24
ListenPort = 51820

# NAT para clientes acederem à Internet
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Cliente 1
PublicKey = <CHAVE_PUBLICA_CLIENTE>
AllowedIPs = 10.0.0.2/32

Configuração do cliente (wg0.conf)

[Interface]
PrivateKey = <CHAVE_PRIVADA_CLIENTE>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <CHAVE_PUBLICA_SERVIDOR>
Endpoint = ip.do.servidor:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Iniciar o túnel

# No servidor
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

# No cliente
sudo wg-quick up wg0

Nota: AllowedIPs = 0.0.0.0/0 no cliente encaminha todo o tráfego pelo túnel (full tunnel). Para split tunnel, usar apenas a sub-rede do escritório, ex: AllowedIPs = 192.168.10.0/24.

Verificar o estado do túnel

sudo wg show

O comando wg show mostra a interface, a porta de escuta, as chaves públicas dos peers, o tráfego transferido (rx/tx) e o último handshake. Um handshake recente (há menos de 3 minutos) indica que o túnel está funcional.

5. VPN Site-to-Site Entre Escritórios

Numa configuração site-to-site, dois routers/servidores Linux ligam as redes locais de dois escritórios. Cada lado é simultaneamente servidor e cliente — ambos têm ListenPort e configuram o peer com Endpoint.

Escritório A (rede local 192.168.10.0/24)

[Interface]
PrivateKey = <CHAVE_PRIV_A>
Address = 10.10.0.1/30
ListenPort = 51820

[Peer]
PublicKey = <CHAVE_PUB_B>
Endpoint = ip.escritorio.b:51820
AllowedIPs = 10.10.0.2/32, 192.168.20.0/24
PersistentKeepalive = 25

Escritório B (rede local 192.168.20.0/24)

[Interface]
PrivateKey = <CHAVE_PRIV_B>
Address = 10.10.0.2/30
ListenPort = 51820

[Peer]
PublicKey = <CHAVE_PUB_A>
Endpoint = ip.escritorio.a:51820
AllowedIPs = 10.10.0.1/32, 192.168.10.0/24
PersistentKeepalive = 25

Nota: No site-to-site, AllowedIPs inclui tanto o IP do túnel do peer como a rede local remota. O PersistentKeepalive = 25 mantém o túnel activo através de NAT. Usar /30 para a rede do túnel (apenas 2 hosts necessários).

6. WireGuard vs OpenVPN — Comparação Técnica

O OpenVPN tem sido o padrão de VPN para PME durante duas décadas, mas o WireGuard supera-o em performance, simplicidade e consumo de recursos. A tabela abaixo resume as diferenças principais para uma PME escolher.

Critério WireGuard OpenVPN
Linhas de código ~4.000 ~100.000
Criptografia ChaCha20 + Poly1305 AES-256-GCM (negociável)
Modo de operação Kernel space Userspace (tun/tap)
Throughput típico 2-3 Gbps 200-400 Mbps
Latência Baixa (kernel directo) Moderada (userspace)
Configuração 1 ficheiro .conf por peer Certificados + ficheiros .ovpn
Porta de escuta UDP (1 porta) TCP ou UDP
Roaming de cliente Sim, transparente Sim, mas com reconexão
Gestão de chaves Chaves estáticas (sem PKI) PKI com certificados X.509
Consumo de RAM ~1 MB por peer ~3-5 MB por peer

Quando escolher OpenVPN: se a PME precisa de compatibilidade com clientes Windows sem instalar software adicional (OpenVPN tem GUI madura), auditoria de certificados PKI, ou TCP em redes que bloqueiam UDP.

7. Erros Comuns e Checklist de Produção

Erros Comuns

Problema Causa Solução
Sem handshake (wg show vazio) Chaves trocadas (priv/pub) ou Endpoint incorrecto Verificar PublicKey do peer corresponde à chave pública real; confirmar IP e porta do Endpoint
Handshake OK mas sem Internet IP forwarding desactivado ou NAT mal configurado Confirmar net.ipv4.ip_forward=1 e regras PostUp/PostDown com MASQUERADE
Interface wg0 não arranca Ficheiro .conf com permissões erradas ou sintaxe inválida chmod 600 /etc/wireguard/wg0.conf; validar sintaxe com wg-quick strip wg0
Tráfego lento ou intermitente MTU incorrecto ou PersistentKeepalive em falta Adicionar MTU = 1280 no [Interface]; garantir PersistentKeepalive = 25 atrás de NAT
Cliente não acede rede local do escritório AllowedIPs não inclui a sub-rede remota Adicionar a sub-rede do escritório em AllowedIPs do cliente, ex: 192.168.10.0/24
Porta UDP bloqueada Firewall do servidor ou router não abre a porta 51820 sudo ufw allow 51820/udp ou regra equivalente no firewall
Túnel cai ao mudar de rede Falta PersistentKeepalive ou roaming sem keepalive Adicionar PersistentKeepalive = 25 no [Peer] do cliente

Checklist de Produção

  • ✅ Kernel ≥5.6 confirmado com uname -r
  • wireguard-tools instalado no servidor e em todos os clientes
  • ✅ IP forwarding activado: net.ipv4.ip_forward=1
  • ✅ Chaves privadas com permissões 600 (chmod 600 *.key)
  • ✅ Chaves públicas partilhadas apenas por canal seguro
  • ✅ Ficheiro /etc/wireguard/wg0.conf com permissões 600
  • ✅ Porta UDP 51820 aberta no firewall do servidor
  • PersistentKeepalive = 25 em peers atrás de NAT
  • PostUp/PostDown com MASQUERADE configurado no servidor
  • AllowedIPs correcto: 0.0.0.0/0 para full tunnel, sub-rede para split tunnel
  • sudo wg-quick up wg0 sem erros no servidor e cliente
  • sudo wg show mostra handshake recente (há menos de 3 minutos)
  • sudo systemctl enable wg-quick@wg0 para arranque automático
  • ✅ Ping ao IP do túnel do peer responde (ping 10.0.0.1)
  • ✅ Cliente acede Internet e/ou rede local do escritório através do túnel