Chegou o momento em que a VPN não é mais um tipo de ferramenta exótica para administradores de sistemas barbudos. Os usuários têm tarefas diferentes, mas o fato é que todos precisam de uma VPN.
O problema das soluções VPN atuais é que elas são difíceis de configurar corretamente, caras de manter e também possuem muitos códigos herdados de qualidade duvidosa.
Alguns anos atrás, o especialista canadense em segurança da informação Jason A. Donenfeld decidiu que tinha que suportar isso e começou a trabalhar no WireGuard . Agora o WireGuard está se preparando para ser incluído no kernel do Linux, e até recebeu elogios de Linus Torvalds e do Senado dos EUA .
As vantagens declaradas do WireGuard sobre outras soluções VPN:
- Fácil de usar.
- Utiliza criptografia moderna: estrutura de protocolo de ruído, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF, etc.
- Código legível compacto, mais fácil de investigar quanto a vulnerabilidades.
- Alto desempenho.
- Especificação clara e detalhada.
É encontrada uma bala de prata? É hora de cavar no OpenVPN e IPSec? Decidi lidar com isso e, ao mesmo tempo, criei um script para instalar automaticamente um servidor VPN pessoal .
Princípios de trabalho
Os princípios de operação podem ser descritos da seguinte maneira:
- Uma interface WireGuard é criada, é atribuída uma chave privada e um endereço IP. As configurações de outros pares são carregadas: suas chaves públicas, endereços IP etc.
- Todos os pacotes IP que chegam à interface WireGuard são encapsulados em UDP e entregues com segurança a outros pares.
- Os clientes definem o endereço IP público do servidor nas configurações. O servidor reconhece automaticamente os endereços externos dos clientes quando dados autenticados corretamente vêm deles.
- O servidor pode alterar o endereço IP público sem interromper o trabalho. Ao mesmo tempo, ele enviará um alerta aos clientes conectados e eles atualizarão sua configuração em tempo real.
- O conceito de roteamento Cryptokey é usado . O WireGuard recebe e envia pacotes com base na chave pública do par. Quando o servidor descriptografa um pacote autenticado corretamente, seu campo src é verificado. Se corresponder à
allowed-ips
autenticado, o pacote será recebido pela interface do WireGuard. Ao enviar um pacote de saída, ocorre o procedimento correspondente: o campo dst do pacote é obtido e o par correspondente é selecionado com base nele, o pacote é assinado com sua própria chave, criptografado com a chave do par e enviado para o terminal remoto.
Toda a lógica central do WireGuard ocupa menos de 4 mil linhas de código, enquanto o OpenVPN e o IPSec têm centenas de milhares de linhas. Para oferecer suporte a algoritmos criptográficos modernos, propõe-se incluir a nova API criptográfica Zinc no kernel do Linux. No momento, há uma discussão de quão boa é essa ideia.
Desempenho
A vantagem máxima de desempenho (comparada ao OpenVPN e IPSec) será notável nos sistemas Linux, pois o WireGuard é implementado como um módulo do kernel. Além disso, são suportados macOS, Android, iOS, FreeBSD e OpenBSD, mas o WireGuard é executado no espaço do usuário com todas as implicações de desempenho resultantes. O Windows promete adicionar suporte em um futuro próximo.
Resultados de referência do site oficial :

Minha experiência de uso
Não sou especialista em configuração de VPN. Uma vez eu configurei o OpenVPN com alças e ficou muito triste, mas o IPSec nem tentou. Muitas decisões precisam ser tomadas; é muito fácil dar um tiro no próprio pé. Portanto, sempre usei scripts prontos para configurar o servidor.
Portanto, o WireGuard, do meu ponto de vista, geralmente é ideal para o usuário. Todas as decisões de baixo nível são tomadas na especificação, portanto, o processo de preparação de uma infraestrutura VPN típica leva apenas alguns minutos. É quase impossível acumular na configuração.
O processo de instalação é descrito em detalhes no site oficial. Gostaria de mencionar um excelente suporte ao OpenWRT .
As chaves de criptografia são geradas pelo utilitário wg
:
SERVER_PRIVKEY=$( wg genkey ) SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey ) CLIENT_PRIVKEY=$( wg genkey ) CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )
Em seguida, você precisa criar o servidor config /etc/wireguard/wg0.conf
com o seguinte conteúdo:
[Interface] Address = 10.9.0.1/24 PrivateKey = $SERVER_PRIVKEY [Peer] PublicKey = $CLIENT_PUBKEY AllowedIPs = 10.9.0.2/32
e eleve o túnel com o script wg-quick
:
sudo wg-quick up /etc/wireguard/wg0.conf
Em sistemas com systemd, você pode usar o sudo systemctl start wg-quick@wg0.service
.
Na máquina cliente, crie a configuração /etc/wireguard/wg0.conf
:
[Interface] PrivateKey = $CLIENT_PRIVKEY Address = 10.9.0.2/24 [Peer] PublicKey = $SERVER_PUBKEY AllowedIPs = 0.0.0.0/0 Endpoint = 1.2.3.4:51820 # IP PersistentKeepalive = 25
E levante o túnel da mesma maneira:
sudo wg-quick up /etc/wireguard/wg0.conf
Resta configurar o NAT no servidor para que os clientes possam acessar a Internet, e pronto!
Essa facilidade de uso e compactação da base de código foram alcançadas devido à rejeição da funcionalidade de distribuição de chaves. Não existe um sistema de certificação complicado e todo esse horror corporativo: chaves curtas de criptografia são distribuídas aproximadamente como chaves SSH. Mas, em conexão com isso, surge um problema: o WireGuard não será tão fácil de implementar em algumas redes existentes.
Entre as deficiências, vale ressaltar que o WireGuard não funcionará por meio de um proxy HTTP, pois existe apenas o protocolo UDP como transporte. A questão é: é possível ofuscar o protocolo? Obviamente, essa não é uma tarefa direta da VPN, mas para o OpenVPN, por exemplo, existem maneiras de se disfarçar de HTTPS, que ajuda os residentes de países totalitários a usarem totalmente a Internet.
Conclusões
Resumindo, este é um projeto muito interessante e promissor, agora você pode usá-lo em servidores pessoais. Qual é o lucro? Alto desempenho em sistemas Linux, facilidade de configuração e suporte, base de código compacta e legível. No entanto, ainda é muito cedo para transferir uma infraestrutura complexa para o WireGuard, vale a pena esperar pela inclusão no kernel do Linux.
Para economizar meu (e seu) tempo, desenvolvi o instalador automático do WireGuard . Com isso, você pode criar uma VPN pessoal para você e seus amigos sem nem mesmo entender nada.