Criando uma VPN própria com WireGuard
Primeiro, o que uma VPN com WireGuard vai fazer basicamente?
Criar uma interface de rede virtual no servidor e no cliente, usando chaves criptografadas para trocar pacotes de forma segura, sem a necessidade de certificados complexos como no OpenVPN.
Como funciona?
O WireGuard cria uma interface de rede virtual (wg0, por exemplo). Tudo que é roteado para essa interface é automaticamente criptografado, encapsulado e enviado para o peer remoto.
Cada lado possui:
- Uma chave privada (nunca compartilhada).
- Uma chave pública (compartilhada com o outro lado).
- Um conjunto de IPs virtuais permitidos (
AllowedIPs).
Configuração do servidor
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
# Endereço virtual do cliente (nó que vai utilizar a VPN)
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
Configuração do cliente (meu PC)
[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841
# Endereço público do servidor
[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0
Cenário inicial
(IDA)
O servidor recebe um pacote no nó gN6..., descriptografa e autentica.
Se o IP de origem do pacote estiver dentro do AllowedIPs, o pacote é aceito. Caso contrário, é descartado.
(VOLTA)
Quando a interface do servidor precisa enviar um pacote para um nó, ele verifica sua lista de peers. Se existir um peer correspondente ao IP de destino, o pacote é criptografado usando a chave pública desse peer e enviado para o endpoint configurado.
No cliente, como o AllowedIPs está configurado como 0.0.0.0/0, qualquer pacote gerado pela máquina será roteado pela VPN.
Indo para a prática
Temos basicamente duas formas de configurar o WireGuard:
Usando diretamente o comando wg, configurando tudo manualmente.
Usando wg-quick, que lê configurações de um arquivo .conf.
Não vou entrar em muitos detalhes da primeira abordagem, mas a lógica é exatamente a mesma, apenas configura diretamente via cli.
# Cria a interface WireGuard
ip link add wg0 type wireguard
# Define o IP virtual da interface
ip addr add 10.64.0.1/24 dev wg0
# Define a chave privada da interface
wg set wg0 private-key ./private.key
# Sobe a interface
ip link set wg0 up
# Adiciona um peer manualmente
wg set wg0 peer <PUBLIC_KEY_DO_PEER> \
allowed-ips 10.64.0.2/32 \
endpoint 203.0.113.10:51820
Usando wg-quick e arquivos .conf
Pessoalmente, considero mais simples usar o wg-quick com arquivos de configuração.
Gerando chaves
wg genkey > private.key
wg pubkey < private.key > public.key
Depois, basta criar um arquivo [interface].conf dentro de /etc/wireguard/.
Exemplo de .conf no servidor
[Interface]
Address = # Seu endereço IP virtual
ListenPort = # Porta do WireGuard
PrivateKey = # Chave privada do servidor
# Regras de firewall / NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; \
iptables -t nat -A POSTROUTING -o [interface_de_rede] -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; \
iptables -t nat -D POSTROUTING -o [interface_de_rede] -j MASQUERADE
[Peer]
PublicKey = # Chave pública do cliente
AllowedIPs = # IP virtual do cliente
Dependendo do ambiente (principalmente em VPS e cloud), apenas subir o WireGuard não é suficiente. Algumas configurações extras podem ser necessárias para que o tráfego realmente atravesse o servidor:
Habilitar IP Forwarding, para que a máquina possa rotear pacotes entre interfaces.
Liberar a porta do WireGuard no firewall da própria máquina (iptables / ufw).
Liberar a porta no firewall da cloud / VPS (Security Groups, Firewall Rules, etc).
Garantir que a interface de saída correta esteja sendo usada no NAT.
Isso ficaria por sua conta. Para habilitar o roteamento de pacotes no Linux,
Edite /etc/sysctl.conf e adicione ou descomente:
net.ipv4.ip_forward=1
Depois execute:
sudo sysctl -p
Exemplo de .conf no cliente
[Interface]
Address = # Seu endereço IP virtual
PrivateKey = # Chave privada do cliente
[Peer]
PublicKey = # Chave pública do servidor
Endpoint = # IP público do servidor (não o IP virtual)
# Roteia todo o tráfego pela VPN
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 15
Ao rodar:
wg-quick up wg0
em ambos os lados, a VPN já estará funcionando.
Para adicionar novos peers, basta incluir novas entradas [Peer] no arquivo do servidor.
Se tudo estiver correto, ao acessar sites que mostram seu IP público, será exibido o IP da VPS. Isso não substitui uma VPN comercial robusta, mas já fornece uma base funcional e excelente para aprendizado.
Automatizando o processo
Para facilitar a criação e manutenção dessas configurações, desenvolvi um pequeno script em Bash que automatiza:
Criação de configurações de servidor
Criação de configurações de cliente
Geração automática de chaves
Adição de novos peers de forma interativa
Configuração opcional de IP forwarding
O projeto está disponível no GitHub e serve como um MVP educacional para estudar:
Linux networking, WireGuard, Bash scripting, Automação de infraestrutura, Conceitos básicos de segurança e roteamento
A ideia não é substituir uma ferramenta profissionais, mas sim aprender na prática como tudo funciona por baixo dos panos.