Artur Sousadev
Home Find me About Curriculum

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.