WIREGUARD VPN TUNNEL Client 10.0.0.2/32 Private Key wg0 interface Encrypted Tunnel UDP port 51820 VPN Server 10.0.0.1/24 IP Forwarding NAT / iptables Internet Public Web All traffic between client and server is encrypted via WireGuard tunnel

O WireGuard é um protocolo VPN moderno e de alto desempenho que rapidamente se tornou a escolha preferida de administradores de sistemas e profissionais de segurança. Integrado diretamente ao kernel Linux desde a versão 5.6, o WireGuard oferece uma configuração dramaticamente mais simples, menor superfície de ataque e desempenho superior em comparação com soluções VPN tradicionais como OpenVPN e IPsec/IKEv2.

Este guia o conduz pela configuração de um servidor VPN WireGuard no Ubuntu, configuração de clientes para Linux, Windows, macOS e dispositivos móveis, e proteção de toda a configuração com regras de firewall adequadas.

Pré-requisitos

Antes de começar, certifique-se de que você tem:

  • Um servidor Ubuntu (22.04 ou 24.04) com um endereço IP público
  • Acesso root ou sudo ao servidor
  • Acesso ao terminal via SSH
  • Um dispositivo cliente (Linux, Windows, macOS, iOS ou Android)
  • Compreensão básica de conceitos de rede (endereços IP, sub-redes, portas)

Por Que WireGuard em Vez de OpenVPN ou IPsec?

Antes de mergulhar na configuração, aqui está o motivo pelo qual o WireGuard se tornou o protocolo VPN preferido:

RecursoWireGuardOpenVPNIPsec/IKEv2
Tamanho do código~4.000 linhas~100.000+ linhas~400.000+ linhas
CriptografiaModerna (ChaCha20, Curve25519)Configurável (pode ser mal configurada)Configurável
DesempenhoPróximo da velocidade do caboBom, mas maior overheadBom
ConfiguraçãoSimples, mínimaArquivos XML/conf complexosMuito complexa
Integração ao kernelIntegrado ao kernel LinuxEspaço de usuárioKernel (varia)
Suporte a roamingExcelente (sem interrupção)Reconexão necessáriaDepende do protocolo
Velocidade de conexãoQuase instantâneaSegundos para estabelecerSegundos para estabelecer

O pequeno código-fonte do WireGuard torna significativamente mais fácil auditar vulnerabilidades de segurança. Seu uso de primitivas criptográficas modernas significa que não há vulnerabilidades de negociação de cifra, e sua implementação no espaço do kernel entrega throughput que a abordagem de espaço de usuário do OpenVPN não consegue igualar.

Passo 1: Instalar o WireGuard

O WireGuard está disponível nos repositórios padrão do Ubuntu. Instale-o junto com as ferramentas necessárias:

sudo apt update
sudo apt install -y wireguard wireguard-tools

Verifique a instalação:

wg --version

Certifique-se de que o módulo do kernel WireGuard está carregado:

sudo modprobe wireguard
lsmod | grep wireguard

Passo 2: Gerar Chaves do Servidor

O WireGuard usa criptografia de chave pública. Cada peer (servidor e cliente) precisa do seu próprio par de chaves pública e privada.

Crie um diretório para as chaves com permissões restritivas e gere o par de chaves do servidor:

wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

Restrinja as permissões do arquivo de chave privada:

sudo chmod 600 /etc/wireguard/server_private.key

Visualize as chaves (você precisará delas para configuração):

sudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key

Aviso de Segurança: A chave privada nunca deve ser compartilhada ou transmitida por canais inseguros. Trate-a como uma senha. Se comprometida, gere um novo par de chaves imediatamente.

Passo 3: Configurar o Servidor WireGuard

Crie o arquivo de configuração da interface WireGuard:

sudo nano /etc/wireguard/wg0.conf

Adicione a seguinte configuração, substituindo os valores de espaço reservado:

[Interface]
# A chave privada do servidor (de server_private.key)
PrivateKey = <SERVER_PRIVATE_KEY>

# Sub-rede VPN - o servidor recebe .1
Address = 10.0.0.1/24

# Porta UDP na qual o WireGuard vai escutar
ListenPort = 51820

# Regras NAT - aplicadas quando a interface sobe/desce
# Substitua eth0 pelo nome real da sua interface de rede
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT

# Configurações de peers serão adicionadas abaixo

Dica: Para encontrar o nome da interface de rede principal do seu servidor, execute ip route show default. A interface é listada após dev, tipicamente eth0, ens3, enp0s3 ou similar.

Defina permissões restritivas no arquivo de configuração:

sudo chmod 600 /etc/wireguard/wg0.conf

Passo 4: Habilitar Encaminhamento de IP

Para que o servidor VPN roteie tráfego entre clientes e a internet, o encaminhamento de IP deve ser habilitado:

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

Verifique a configuração:

sysctl net.ipv4.ip_forward

A saída deve mostrar net.ipv4.ip_forward = 1.

Passo 5: Configurar o Firewall (UFW)

Se você está usando UFW (Uncomplicated Firewall), permita a porta do WireGuard e SSH:

# Permitir tráfego WireGuard
sudo ufw allow 51820/udp

# Garantir que SSH está permitido (para não se bloquear)
sudo ufw allow OpenSSH

# Habilitar UFW se ainda não estiver habilitado
sudo ufw enable

# Verificar as regras
sudo ufw status verbose

Você também precisa permitir tráfego encaminhado no UFW. Edite a configuração do UFW:

sudo nano /etc/ufw/before.rules

Adicione as seguintes linhas antes da seção *filter no topo do arquivo:

# Regras de tabela NAT para WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

Depois edite a política de encaminhamento padrão do UFW:

sudo nano /etc/default/ufw

Mude DEFAULT_FORWARD_POLICY de DROP para ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Recarregue o UFW:

sudo ufw reload

Passo 6: Gerar Chaves do Cliente e Adicionar um Peer

Para cada cliente que vai conectar à VPN, gere um par de chaves:

wg genkey | tee client1_private.key | wg pubkey > client1_public.key

Você também pode gerar uma chave pré-compartilhada para uma camada adicional de criptografia simétrica:

wg genpsk > client1_preshared.key

Agora adicione o cliente como peer na configuração do servidor. Edite /etc/wireguard/wg0.conf e adicione:

[Peer]
# Cliente 1
PublicKey = <CLIENT1_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
AllowedIPs = 10.0.0.2/32

O campo AllowedIPs especifica quais endereços IP este peer tem permissão para usar. Para um único cliente, use /32 (um único host).

Passo 7: Iniciar o Serviço WireGuard

Inicie a interface WireGuard e habilite-a para iniciar no boot:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Verifique se a interface está em execução:

sudo wg show

Você deve ver os detalhes da interface, a porta de escuta e os peers configurados. Para verificar o endereço IP da interface:

ip addr show wg0

Configuração do Cliente

Cliente Linux

Instale o WireGuard na máquina cliente:

sudo apt install -y wireguard

Crie o arquivo de configuração do cliente:

sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <CLIENT1_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Explicação da configuração:

  • Address: O IP do cliente dentro da sub-rede VPN
  • DNS: Servidores DNS a usar quando a VPN está ativa
  • Endpoint: O IP público do servidor e a porta do WireGuard
  • AllowedIPs: 0.0.0.0/0, ::/0 roteia TODO o tráfego pela VPN (túnel completo). Use 10.0.0.0/24 para split tunneling (apenas tráfego da sub-rede VPN passa pelo túnel)
  • PersistentKeepalive: Envia um pacote keepalive a cada 25 segundos, essencial para clientes atrás de NAT

Inicie a conexão VPN:

sudo wg-quick up wg0

Para desconectar:

sudo wg-quick down wg0

Para habilitar conexão automática no boot:

sudo systemctl enable wg-quick@wg0

Cliente Windows

  1. Baixe o cliente oficial WireGuard de wireguard.com/install
  2. Instale e abra a aplicação
  3. Clique em Add Tunnel e depois Add empty tunnel (ou importe um arquivo .conf)
  4. Cole a mesma configuração do cliente Linux acima
  5. Clique em Save e depois em Activate

Cliente macOS

  1. Instale o WireGuard da Mac App Store ou via Homebrew:
brew install wireguard-tools
  1. Para a aplicação GUI, baixe da Mac App Store
  2. Clique em Import tunnel(s) from file e selecione seu arquivo .conf, ou crie a configuração manualmente
  3. Ative o túnel pela aplicação ou ícone na barra de menu

Para uso via linha de comando no macOS:

sudo wg-quick up /path/to/wg0.conf

iOS e Android (Dispositivos Móveis)

  1. Instale o aplicativo WireGuard da App Store (iOS) ou Google Play Store (Android)
  2. Você pode inserir a configuração manualmente ou escanear um código QR

Gerando um Código QR para Mobile

Este é o método mais conveniente para configuração mobile. No servidor, instale o qrencode:

sudo apt install -y qrencode

Crie um arquivo de configuração temporário para o cliente:

cat << 'EOF' > /tmp/client1-mobile.conf
[Interface]
PrivateKey = <CLIENT1_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

Gere e exiba o código QR no terminal:

qrencode -t ansiutf8 < /tmp/client1-mobile.conf

Abra o aplicativo WireGuard no seu celular, toque no botão +, selecione Create from QR code e escaneie o código exibido no seu terminal.

Dica de Segurança: Exclua o arquivo de configuração temporário imediatamente após escanear:

rm -f /tmp/client1-mobile.conf

Testando a Conexão VPN

Após conectar um cliente, verifique se a VPN está funcionando corretamente.

No cliente, verifique seu IP VPN e IP público:

# Verificar a interface WireGuard
sudo wg show

# Verificar se você tem o IP VPN
ip addr show wg0

# Verificar seu IP público (deve mostrar o IP do servidor se usando túnel completo)
curl -s https://ifconfig.me

# Testar conectividade com o IP VPN do servidor
ping 10.0.0.1

No servidor, verifique se o peer está conectado:

sudo wg show

Você deve ver um timestamp de latest handshake e dados de transfer para o peer conectado. Se esses valores estiverem atualizando, o túnel está ativo e transmitindo tráfego.

Adicionando Mais Clientes

Para adicionar clientes adicionais, repita o processo de geração de chaves com chaves e endereços IP únicos:

# Gerar chaves para o cliente 2
wg genkey | tee client2_private.key | wg pubkey > client2_public.key
wg genpsk > client2_preshared.key

Adicione o novo peer à configuração do servidor. Você pode fazer isso sem reiniciar o serviço:

sudo wg set wg0 peer <CLIENT2_PUBLIC_KEY> preshared-key client2_preshared.key allowed-ips 10.0.0.3/32

Para tornar a mudança persistente, também adicione o bloco [Peer] ao /etc/wireguard/wg0.conf.

Solução de Problemas

Handshake Não é Completado

Se sudo wg show nunca mostra um latest handshake para um peer:

  1. Verifique as regras de firewall: Certifique-se de que a porta UDP 51820 está aberta no servidor
  2. Verifique as chaves: A seção de peer do servidor deve ter a chave pública do cliente, e vice-versa
  3. Verifique o endpoint: O cliente deve conseguir alcançar o IP público do servidor na porta 51820
  4. Teste conectividade UDP: nc -u -z <SERVER_IP> 51820

Tráfego Não Está Roteando Pela VPN

Se o handshake é completado mas o tráfego de internet não flui pela VPN:

  1. Verifique se o encaminhamento de IP está habilitado: sysctl net.ipv4.ip_forward
  2. Verifique as regras NAT: sudo iptables -t nat -L POSTROUTING
  3. Verifique se a interface de rede correta nas regras PostUp/PostDown corresponde à interface real do seu servidor

Vazamentos de DNS

Se as consultas DNS não estão passando pela VPN:

  1. Certifique-se de que a linha DNS está presente na configuração do cliente
  2. Em clientes Linux, pode ser necessário configurar o systemd-resolved:
sudo resolvectl dns wg0 1.1.1.1 8.8.8.8

Conexão Cai Atrás de NAT

Se a conexão VPN cai após um período de inatividade, certifique-se de que PersistentKeepalive = 25 está definido na seção [Peer] do cliente. Isso envia um pacote keepalive a cada 25 segundos para manter o mapeamento NAT.

Revogando um Cliente

Para remover o acesso de um cliente, exclua o peer do servidor:

sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> remove

Também remova o bloco [Peer] correspondente do /etc/wireguard/wg0.conf para tornar a mudança persistente.

Conclusão

O WireGuard fornece uma solução VPN rápida, moderna e segura que é notavelmente fácil de configurar em comparação com seus predecessores. Com sua integração em nível de kernel, configuração mínima e criptografia de última geração, é uma excelente escolha tanto para uso pessoal quanto para implantações empresariais.

Para uma configuração de servidor mais segura, considere também revisar sua configuração SSH. Consulte nossos guias sobre como adicionar chaves SSH e gerenciar conexões SSH. Para configurações avançadas de rede no Ubuntu, consulte nosso artigo sobre atribuição de múltiplos endereços IP a uma única interface.