Ubuntu WireGuard

Uma VPN (Virtual Private Network, rede privada virtual) cria um "cabo virtual" criptografado entre duas máquinas pela internet. O WireGuard é a VPN mais simples do Linux: faz parte do kernel, usa poucas linhas de configuração e é muito rápido. Nesta aula você vai ligar o notebook da Ana ao servidor dela.

Você vai aprender
  • Como funciona a troca de chaves pública e privada do WireGuard.
  • O que significa cada linha do wg0.conf, no servidor e no cliente.
  • Como subir, testar e ligar a VPN no boot com wg-quick e systemd.
  • Como ler o wg show e diagnosticar uma VPN que não conecta.

Antes do comando: o desenho da VPN

Hoje o notebook só fala com o servidor pela internet aberta. Com a VPN, os dois ganham uma rede particular nova, 10.8.0.0/24, que só eles enxergam:

MáquinaEndereço na internetEndereço na VPNPapel
servidor203.0.113.10 (público, fixo)10.8.0.1Espera conexões na porta UDP 51820
notebookmuda (casa, café, 4G)10.8.0.2Inicia a conexão

No WireGuard não há usuário e senha. Cada máquina tem um par de chaves:

  • Chave privada: fica só na própria máquina, nunca é copiada. É como a chave da sua casa.
  • Chave pública: é calculada a partir da privada e pode ser mostrada a qualquer um. É como o seu endereço.

O servidor guarda a chave pública do notebook, e o notebook guarda a pública do servidor. Cada lado só aceita quem ele conhece. No WireGuard, cada "outro lado" se chama peer (par).


Passo 1: instalar

Rode nas duas máquinas:

$ sudo apt install wireguard
[sudo: authenticate] Senha:
Instalando:
  wireguard

Instalando dependências:
  wireguard-tools
…

O módulo do WireGuard já vem no kernel do Ubuntu. O pacote traz as ferramentas wg (configurar e ver o estado) e wg-quick (subir e descer a VPN a partir de um arquivo).


Passo 2: gerar as chaves

wg genkey
Gera uma chave privada nova e a escreve na tela.
| tee privada.key
Grava a chave no arquivo privada.key e repassa adiante.
| wg pubkey
Lê a chave privada e calcula a pública correspondente.
> publica.key
Grava a chave pública em publica.key.

Faça no servidor, como root, dentro de /etc/wireguard. O umask 077 garante que só o root consiga ler os arquivos criados (veja chown, chgrp, umask):

$ sudo -i
#> cd /etc/wireguard
#> umask 077
#> wg genkey | tee privada.key | wg pubkey > publica.key
#> ls -l
total 8
-rw------- 1 root root 45 Oct 15 10:40 privada.key     « só o root lê
-rw------- 1 root root 45 Oct 15 10:40 publica.key
#> cat publica.key
qL3vKpXo5nTw8mE2YfR1bJ0cHs7aUdZ6gN4iWkVtM0E=

Repita o mesmo no notebook. Depois anote as duas chaves públicas; você vai precisar delas no outro lado. As chaves desta aula são exemplos: as suas serão diferentes.

A chave privada é segredo

Nunca cole a privada.key em chat, e-mail ou repositório. Quem tiver a chave privada do notebook se passa por ele na VPN.


Passo 3: o arquivo do servidor

O wg-quick lê /etc/wireguard/NOME.conf. O nome do arquivo vira o nome da interface de rede, aqui wg0.

[Interface]
# Endereço do servidor dentro da VPN
Address = 10.8.0.1/24
# Porta UDP em que o servidor espera conexões
ListenPort = 51820
# Conteúdo de /etc/wireguard/privada.key DO SERVIDOR
PrivateKey = 8C4lYpZqv3Ku2xJwTnR0aHs9eDfGb1mLcV6oNiQk3Ws=

[Peer]
# Notebook da Ana: a chave PÚBLICA dele
PublicKey = Hm2sY7wQ0vLxN5pT3kR8dJ1aF6cZbE9uG4iVoKqWnXs=
# Que endereços da VPN pertencem a este peer
AllowedIPs = 10.8.0.2/32

Passo 4: o arquivo do notebook

[Interface]
Address = 10.8.0.2/24
# Conteúdo de privada.key DO NOTEBOOK
PrivateKey = 2A9xQmTv7Lp0sKcWyR4nHd1eJg6bUoZ3fN8iVkEtM1Y=

[Peer]
# O servidor: a chave PÚBLICA dele
PublicKey = qL3vKpXo5nTw8mE2YfR1bJ0cHs7aUdZ6gN4iWkVtM0E=
# Onde encontrar o servidor na internet
Endpoint = 203.0.113.10:51820
# Que destinos devem passar pela VPN
AllowedIPs = 10.8.0.0/24
# Manda um "sinal de vida" a cada 25 s para atravessar o roteador de casa
PersistentKeepalive = 25
LinhaO que faz
AddressO IP desta máquina dentro da VPN.
ListenPortPorta UDP de escuta. Necessária no lado que recebe conexões.
PrivateKeyA chave privada desta máquina.
PublicKey (no [Peer])A chave pública do outro lado.
EndpointIP ou nome e porta do outro lado na internet. Só o cliente precisa.
AllowedIPsNo servidor: que IPs da VPN são desse peer. No cliente: que destinos vão pelo túnel.
PersistentKeepaliveMantém o caminho aberto quando o cliente está atrás de um roteador doméstico (NAT).

Proteja os dois arquivos, que contêm a chave privada:

$ sudo chmod 600 /etc/wireguard/wg0.conf

Passo 5: abrir a porta no firewall do servidor

$ sudo ufw allow 51820/udp
Regra adicionada
Regra adicionada (v6)

Se o servidor estiver numa nuvem, libere também a porta UDP 51820 no painel do provedor. Se você usa nftables, acrescente udp dport 51820 accept na cadeia input (veja nftables).


Passo 6: subir a VPN

sudo
Criar interfaces de rede exige root.
wg-quick
Lê o arquivo de configuração e monta tudo.
up
Liga. O contrário é down.
wg0
O nome da configuração, ou seja, /etc/wireguard/wg0.conf.
$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard                   « cria a interface
[#] wg setconf wg0 /dev/fd/63                        « aplica chaves e peers
[#] ip -4 address add 10.8.0.1/24 dev wg0            « dá o IP da VPN
[#] ip link set mtu 1420 up dev wg0                  « liga a interface

Cada linha [#] é um comando que o wg-quick rodou por você. Faça o mesmo no notebook e teste:

$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
$ ping -c 3 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=38.2 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=37.9 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=38.4 ms

--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
$ ssh ana@10.8.0.1                                   « SSH pelo túnel

Ver o estado: wg show

$ sudo wg show
interface: wg0
  public key: qL3vKpXo5nTw8mE2YfR1bJ0cHs7aUdZ6gN4iWkVtM0E=
  private key: (hidden)                              « nunca é exibida
  listening port: 51820

peer: Hm2sY7wQ0vLxN5pT3kR8dJ1aF6cZbE9uG4iVoKqWnXs=
  endpoint: 198.51.100.23:48712                      « de onde o notebook está vindo
  allowed ips: 10.8.0.2/32
  latest handshake: 14 seconds ago                   « a prova de que conectou
  transfer: 18.43 KiB received, 12.07 KiB sent

A linha mais importante é latest handshake ("último aperto de mão"). Se ela não aparece, os dois lados nunca conseguiram conversar. Os números de transfer mostram quanto tráfego já passou pelo túnel.


Passo 7: ligar no boot

O wg-quick up vale até reiniciar. Para a VPN subir sozinha, use o serviço wg-quick@ do systemd. O que vem depois do @ é o nome da configuração:

$ sudo wg-quick down wg0
[#] ip link delete dev wg0
$ sudo systemctl enable --now wg-quick@wg0
Created symlink '/etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service' → '/usr/lib/systemd/system/wg-quick@.service'.
$ systemctl is-active wg-quick@wg0
active

Derrubamos antes a VPN que estava de pé, porque o serviço não sobe uma interface que já existe.


Formas diferentes de fazer

FormaExemploMelhor quando…
wg-quicksudo wg-quick up wg0Testar e ligar ou desligar à mão.
systemdsudo systemctl enable --now wg-quick@wg0Servidores e VPN que deve estar sempre ligada.
NetworkManagernmcli connection import type wireguard file wg0.confNotebook com desktop: a VPN aparece no menu de rede.
Adicionar peer sem reiniciarsudo wg set wg0 peer CHAVE allowed-ips 10.8.0.3/32Incluir mais um cliente com a VPN ligada (lembre de salvar no arquivo também).

Variação: mandar toda a internet do notebook pela VPN

Com AllowedIPs = 0.0.0.0/0 no notebook, todo o tráfego vai pelo servidor, como numa VPN comercial. O servidor precisa então repassar pacotes (forward) e mascarar o endereço (NAT). Isso exige ligar net.ipv4.ip_forward=1 e regras de NAT no servidor; teste antes com a VPN simples desta aula funcionando.


Quando não funciona

Não aparece "latest handshake"
$ sudo wg show
interface: wg0
  public key: qL3vKpXo5nTw8mE2YfR1bJ0cHs7aUdZ6gN4iWkVtM0E=
  private key: (hidden)
  listening port: 51820

peer: Hm2sY7wQ0vLxN5pT3kR8dJ1aF6cZbE9uG4iVoKqWnXs=
  allowed ips: 10.8.0.2/32                           « sem endpoint e sem handshake

O que aconteceu: os pacotes do notebook não chegam ao servidor, ou chegam com a chave errada.

Como confirmar e resolver:

  1. No servidor, a porta está aberta? sudo ufw status | grep 51820 e o painel da nuvem.
  2. O Endpoint do notebook tem o IP e a porta certos?
  3. As chaves estão trocadas? Em cada [Peer] vai a chave pública do outro lado. Compare com sudo wg show wg0 public-key em cada máquina.
"already exists"
$ sudo wg-quick up wg0
wg-quick: `wg0' already exists

O que aconteceu: a VPN já está ligada, à mão ou pelo serviço.

Como resolver: para recarregar, use sudo wg-quick down wg0 && sudo wg-quick up wg0, ou sudo systemctl restart wg-quick@wg0 se ela foi ligada pelo systemd.

Aviso "world accessible"
$ sudo wg-quick up wg0
Warning: `/etc/wireguard/wg0.conf' is world accessible

O que aconteceu: qualquer usuário da máquina consegue ler o arquivo, inclusive a chave privada.

Como resolver: sudo chmod 600 /etc/wireguard/wg0.conf.

O handshake acontece, mas o ping não volta

O que aconteceu: quase sempre é o AllowedIPs. No servidor ele precisa conter o IP do notebook na VPN (10.8.0.2/32); no notebook, o destino que você quer alcançar (10.8.0.0/24).

Como resolver: confira as duas pontas com sudo wg show e veja as rotas com ip route | grep wg0.


Referência

ComandoO que faz
wg genkeyGera uma chave privada
wg pubkeyCalcula a chave pública a partir da privada (lida da entrada)
wg showEstado de todas as interfaces e peers
wg show wg0 public-keySó a chave pública da interface
wg set wg0 peer CHAVE allowed-ips IP/32Adiciona ou altera um peer na hora
wg set wg0 peer CHAVE removeRemove um peer
wg-quick up|down wg0Liga ou desliga a partir do arquivo
wg-quick save wg0Salva no arquivo a configuração em uso
systemctl enable --now wg-quick@wg0Liga agora e em todo boot

Exercícios

1. Gerar o par de chaves

Complete para gerar a chave privada, guardá-la e calcular a pública:

wg genkey | tee privada.key | wg > publica.key

2. Ligar no boot

Complete para ativar a VPN wg0 agora e em todo boot:

sudo systemctl enable --now

3. Porta do firewall

Complete para liberar a porta padrão do WireGuard no ufw:

sudo ufw allow

4. No [Peer] do arquivo do servidor, qual chave vai em PublicKey?

5. O wg show não mostra "latest handshake". O que isso indica?


Resumo

  • Cada máquina tem um par de chaves; em [Peer] vai a chave pública do outro lado.
  • /etc/wireguard/wg0.conf vira a interface wg0; proteja-o com chmod 600.
  • wg-quick up wg0 liga; systemctl enable --now wg-quick@wg0 liga no boot.
  • wg show → "latest handshake" é a prova de que a VPN conectou.
  • Sem handshake: confira firewall (UDP 51820), Endpoint e chaves.