WireGuard: como funciona o protocolo que cria o túnel da FortiSafe
Equipe FortiSafe ·
O WireGuard é o protocolo que cria o túnel cifrado entre o aparelho e o servidor da VPN. A FortiSafe o escolheu por fatos verificáveis: o código é pequeno o bastante para ser auditado, a criptografia é atual, a segurança do protocolo foi verificada formalmente por pesquisadores e ele faz parte do kernel Linux desde 2020. Abaixo, como ele funciona por dentro.
Por que escolhemos o WireGuard
- Código pequeno: segundo o artigo técnico do autor, Jason A. Donenfeld, a implementação para Linux tem menos de 4.000 linhas, o que facilita auditar e verificar.
- Criptografia atual: Curve25519, ChaCha20-Poly1305, BLAKE2s e HKDF, detalhadas na tabela abaixo.
- Segurança verificada formalmente: o protocolo tem provas de segurança feitas em ferramentas como Tamarin e CryptoVerif, e a Curve25519 usada vem de implementações verificadas.
- Dentro do kernel Linux: o WireGuard entrou oficialmente no Linux 5.6, lançado em 29 de março de 2020.
- Simples de operar: cada ponta é identificada por uma chave pública curta, no estilo do OpenSSH, e o próprio protocolo cria e renova as sessões.
- O objetivo declarado pelo autor é substituir o IPsec na maioria dos usos e soluções como o OpenVPN, sendo mais seguro, mais rápido e mais fácil de usar.
Roteamento por chave criptográfica
O princípio do WireGuard é associar a chave pública de cada ponta aos endereços IP que ela pode usar dentro do túnel. O artigo técnico chama isso de cryptokey routing, roteamento por chave criptográfica.
Ao enviar um pacote, a interface procura qual chave corresponde ao IP de destino e cifra o pacote para essa chave. Ao receber, decifra e confere se o IP de origem de dentro do pacote é um dos permitidos para a chave que o cifrou. Se não for, o pacote é descartado.
Na prática, saber de onde um pacote veio dentro do túnel é o mesmo que saber qual chave o cifrou.
O handshake: uma ida e uma volta
- O WireGuard usa o padrão Noise_IK do Noise Protocol Framework, e tudo trafega em UDP.
- Primeira mensagem, de quem inicia: uma chave pública temporária (efêmera), a chave pública fixa de quem inicia, cifrada, e um carimbo de tempo TAI64N, também cifrado, que impede reaproveitar uma mensagem gravada.
- Segunda mensagem, de quem responde: a chave efêmera dele e uma prova cifrada de que as duas pontas chegaram ao mesmo estado.
- As duas pontas derivam as chaves da sessão com HKDF. Quem responde só começa a enviar dados depois de receber o primeiro pacote cifrado com a sessão nova, o que confirma as chaves.
- Somando os campos descritos no protocolo, a mensagem de início tem 148 bytes e a de resposta, 92.
- Propriedades da troca de chaves listadas na página oficial: sigilo futuro perfeito (perfect forward secrecy), ocultação de identidade, proteção contra reenvio de mensagens gravadas e contra personificação com chave comprometida.
A criptografia do WireGuard
| Peça | Para que serve | Especificação |
|---|---|---|
| Curve25519 | Troca de chaves Diffie-Hellman (ECDH) entre as pontas | Chaves de 32 bytes |
| ChaCha20-Poly1305 | Cifrar e autenticar cada pacote | Construção AEAD da RFC 7539 |
| XChaCha20-Poly1305 | Cifrar o cookie da proteção contra sobrecarga | Nonce aleatório de 24 bytes |
| BLAKE2s | Hash e autenticação com chave (MAC) | RFC 7693 |
| HKDF | Derivar as chaves da sessão | RFC 5869 |
| SipHash24 | Chaves das tabelas internas de busca | — |
| Noise_IKpsk2 | Estrutura do handshake | Noise Protocol Framework |
Chaves que mudam o tempo todo
Uma sessão nova é criada mais ou menos a cada 2 minutos, por temporizadores, e não por pedido de quem usa. Quem obtiver as chaves de uma sessão não consegue decifrar as anteriores.
Se nenhuma sessão nova for criada em três vezes o tempo máximo de uma sessão, 9 minutos, as chaves temporárias e as da sessão são apagadas da memória.
Os temporizadores do protocolo
| Constante | Valor | O que faz |
|---|---|---|
| Rekey-After-Time | 120 segundos | Idade da sessão a partir da qual quem a iniciou pede uma nova |
| Reject-After-Time | 180 segundos | Sessão mais velha que isso não envia nem recebe dados |
| Rekey-Attempt-Time | 90 segundos | Por quanto tempo se tenta um novo handshake antes de desistir |
| Rekey-Timeout | 5 segundos | Intervalo mínimo entre duas mensagens de início de handshake |
| Keepalive-Timeout | 10 segundos | Quem recebeu dados e não tem nada a responder envia um pacote vazio depois desse tempo |
| Rekey-After-Messages | 2⁶⁰ mensagens | Quantidade de pacotes depois da qual se pede uma sessão nova |
| Reject-After-Messages | 2⁶⁴ − 2¹³ − 1 mensagens | Limite de pacotes de uma sessão |
Silêncio e proteção contra sobrecarga
O WireGuard não responde a mensagens que não se autenticam. Quem varre a internet sem conhecer a chave pública do servidor não recebe resposta nenhuma.
Toda mensagem de handshake leva um código de autenticação, o mac1, calculado com a chave pública do servidor. Sob carga, o servidor pode responder com um cookie em vez de processar o handshake: o cookie é ligado ao IP de quem pediu, vem de um segredo que muda a cada dois minutos e viaja cifrado com XChaCha20-Poly1305.
Quem inicia repete a mensagem com um segundo código, o mac2, feito com esse cookie. Isso prova que ele controla aquele IP antes de o servidor gastar processamento com a troca de chaves.
Mudar de rede sem cair
Cada ponta guarda o endereço de onde veio o último pacote autenticado corretamente e responde para ele. Se o celular sai do Wi-Fi e entra no 4G, o servidor passa a responder para o endereço novo assim que recebe o primeiro pacote válido.
Como as sessões são criadas e renovadas pelos temporizadores, não há conexão para abrir ou fechar: a interface fica pronta, e o protocolo cuida do resto.
Segurança verificada formalmente
- Tamarin, verificação simbólica de Jason Donenfeld e Kevin Milner: correção, acordo de chaves forte e autenticidade, resistência a personificação com chave comprometida e a ataque de chave compartilhada desconhecida, sigilo das chaves, sigilo futuro, unicidade da sessão e ocultação de identidade.
- CryptoVerif, prova computacional de Benjamin Lipp que cobre também os pacotes de dados: sigilo das mensagens, sigilo futuro, autenticação mútua e resistência a reenvio da primeira mensagem, entre outras.
- Modelo eCK, prova computacional de Benjamin Dowling e Kenneth G. Paterson, feita sobre uma variante equivalente do protocolo.
- ProVerif, pelo projeto Noise Explorer, de Nadim Kobeissi e Karthikeyan Bhargavan, sobre o padrão IK do Noise.
- Curve25519 com implementações verificadas: HACL*, em 64 bits, e Fiat-Crypto, em 32 bits.
Do artigo ao kernel Linux
O WireGuard foi apresentado em artigo no NDSS 2017, o simpósio de segurança de redes e sistemas distribuídos. A revisão mais recente do artigo técnico é de 1º de junho de 2020.
O Linux 5.6, lançado em 29 de março de 2020, trouxe o WireGuard dentro do kernel. O site oficial oferece aplicativos para Linux, Windows, macOS, iOS e Android.
É o protocolo usado pela FortiSafe.
Fontes
Páginas consultadas em 14 de setembro de 2026.
- WireGuard — protocolo e criptografia (em inglês) — Primitivas criptográficas, handshake, propriedades da troca de chaves e campos das mensagens; os tamanhos em bytes foram somados pela equipe FortiSafe.
- WireGuard — artigo técnico de Jason A. Donenfeld (em inglês) — Roteamento por chave, mudança de rede, cookies, temporizadores e tamanho do código; revisão de 1º de junho de 2020.
- WireGuard — verificação formal (em inglês) — Provas em Tamarin, CryptoVerif, eCK e ProVerif e implementações verificadas da Curve25519.
- Kernel Newbies — Linux 5.6 (em inglês) — Lançamento em 29 de março de 2020, com o WireGuard no kernel.
- WireGuard — site oficial — Sistemas com aplicativo oficial.