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.
- 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-quickesystemd. - Como ler o
wg showe 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áquina | Endereço na internet | Endereço na VPN | Papel |
|---|---|---|---|
| servidor | 203.0.113.10 (público, fixo) | 10.8.0.1 | Espera conexões na porta UDP 51820 |
| notebook | muda (casa, café, 4G) | 10.8.0.2 | Inicia 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.keye 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.
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
| Linha | O que faz |
|---|---|
Address | O IP desta máquina dentro da VPN. |
ListenPort | Porta UDP de escuta. Necessária no lado que recebe conexões. |
PrivateKey | A chave privada desta máquina. |
PublicKey (no [Peer]) | A chave pública do outro lado. |
Endpoint | IP ou nome e porta do outro lado na internet. Só o cliente precisa. |
AllowedIPs | No servidor: que IPs da VPN são desse peer. No cliente: que destinos vão pelo túnel. |
PersistentKeepalive | Manté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
| Forma | Exemplo | Melhor quando… |
|---|---|---|
wg-quick | sudo wg-quick up wg0 | Testar e ligar ou desligar à mão. |
| systemd | sudo systemctl enable --now wg-quick@wg0 | Servidores e VPN que deve estar sempre ligada. |
| NetworkManager | nmcli connection import type wireguard file wg0.conf | Notebook com desktop: a VPN aparece no menu de rede. |
| Adicionar peer sem reiniciar | sudo wg set wg0 peer CHAVE allowed-ips 10.8.0.3/32 | Incluir 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
$ 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:
- No servidor, a porta está aberta?
sudo ufw status | grep 51820e o painel da nuvem. - O
Endpointdo notebook tem o IP e a porta certos? - As chaves estão trocadas? Em cada
[Peer]vai a chave pública do outro lado. Compare comsudo wg show wg0 public-keyem cada máquina.
$ 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.
$ 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 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
| Comando | O que faz |
|---|---|
wg genkey | Gera uma chave privada |
wg pubkey | Calcula a chave pública a partir da privada (lida da entrada) |
wg show | Estado de todas as interfaces e peers |
wg show wg0 public-key | Só a chave pública da interface |
wg set wg0 peer CHAVE allowed-ips IP/32 | Adiciona ou altera um peer na hora |
wg set wg0 peer CHAVE remove | Remove um peer |
wg-quick up|down wg0 | Liga ou desliga a partir do arquivo |
wg-quick save wg0 | Salva no arquivo a configuração em uso |
systemctl enable --now wg-quick@wg0 | Liga 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:
2. Ligar no boot
Complete para ativar a VPN wg0 agora e em todo boot:
3. Porta do firewall
Complete para liberar a porta padrão do WireGuard no ufw:
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.confvira a interfacewg0; proteja-o comchmod 600.wg-quick up wg0liga;systemctl enable --now wg-quick@wg0liga no boot.wg show→ "latest handshake" é a prova de que a VPN conectou.- Sem handshake: confira firewall (UDP 51820),
Endpointe chaves.