Neste artigo
1. O que é o WireGuard ·
2. Instalar WireGuard ·
3. Gerar Chaves ·
4. Servidor e Cliente ·
5. VPN Site-to-Site ·
6. WireGuard vs OpenVPN ·
7. Erros Comuns e Checklist
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
.confpor 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-toolsinstalado 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.confcom permissões 600 - ✅ Porta UDP 51820 aberta no firewall do servidor
- ✅
PersistentKeepalive = 25em peers atrás de NAT - ✅
PostUp/PostDowncom MASQUERADE configurado no servidor - ✅
AllowedIPscorrecto:0.0.0.0/0para full tunnel, sub-rede para split tunnel - ✅
sudo wg-quick up wg0sem erros no servidor e cliente - ✅
sudo wg showmostra handshake recente (há menos de 3 minutos) - ✅
sudo systemctl enable wg-quick@wg0para 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