Wireguard é uma VPN que foi recentemente adicionada ao Kernel oficial do Linux. É extremamente rápida, simples e com excelente criptografia, além de ser multi-plataforma.

Tem vários tutoriais por aí, mas talvez por ainda ser bem nova tive dificuldade de achar todos os passos necessários num só local.

Terminei agora a pouco a minha configuração usando meu novo router/access point baseado num Raspberry Pi 3B+ que comprei esses dias. Pastei umas boas horas, então vão aqui algumas dicas e links que me foram úteis

Instalação num Raspberry Pi

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
# echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | tee -a /etc/apt/sources.list.d/debian-backport.list
# apt update
# apt install wireguard

Configuração do servidor (Pi)

Crie o par de chaves

# umask 077
# mkdir -p /etc/wireguard/keys
# cd /etc/wireguard/keys
# wg genkey > privatekey
# wg pubkey < privatekey > publickey

Crie o arquivo de configuração

Vamos assumir que você queira usar a subnet 192.168.10.0/24 para a VPN. Crie a parte inicial da sua configuração no arquivo /etc/wireguard/wg0.conf

[Interface]
Address = 192.168.10.1/24
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -t nat -I POSTROUTING -o eth1-j MASQUERADE;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth1-j MASQUERADE;
ListenPort = 443
PrivateKey = chave-privada-gerada-acima

O arquivo acima também assume que sua interface de rede interna é eth1

Configuração do cliente (Android)

No meu caso eu quero conectar via Android. Para isso precisamos gerar um arquivo de configuração para ele e depois atualizar o nosso servidor.

Par de chaves pro Android

wg genkey | (
read chave
echo "android-chave-privada: $chave"
echo "android-chave-publica:  $(echo "$chave" | wg pubkey)"
)
android-chave-privada: IAI9CR7AxKNMrI3rrWdxQBPvkSaftVcvfyyUNmUH32k=
android-chave-publica:  PgGwU4b9CdxJ20d/7QmCu1nwp7OtQAaPzH0w7q/Dl1U=

Arquivo de configuração Android

Pode ser criado em qualquer lugar. Uma vez gerado o QR Code (abaixo) você não precisa mais desse arquivo. Vamos chamar de android.conf

[Interface]
Address = 192.168.10.3/24
PrivateKey = IAI9CR7AxKNMrI3rrWdxQBPvkSaftVcvfyyUNmUH32k=
DNS = 192.168.10.1

[Peer]
PublicKey = tAJ7LYRVB4QbLA0lJvEXrVDoCENdxlfolqYGeJPmnCQ=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 200.200.200.200:2345

Explicando:

  • Interface é o que diz respeito ao Android Address é o IP que o Android vai receber

  • Private Key é a chave do Android gerada acima

  • DNS é o IP VPN do Raspberry Pi

Coisas a manter em mente:

  • Seu servidor de DNS tem que estar configurado para responder queries fora da rede local
  • Seu Pi tem que ter IP público ou ter a porta 2345 UDP exposta na Internet

Arquivo de configuração Pi

Agora podemos atualizar a configuração do Pi

[Interface]
Address = 192.168.10.1/24
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -t nat -I POSTROUTING -o eth1-j MASQUERADE;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth1-j MASQUERADE;
ListenPort = 443
PrivateKey = chave-privada-gerada-acima

[Peer]
# Android
PublicKey = PgGwU4b9CdxJ20d/7QmCu1nwp7OtQAaPzH0w7q/Dl1U=
AllowedIPs = 192.168.10.3

Pronto. Vamos iniciar a interface no Pi:

# wg-quick up wg0

Instalando App no Android

Instale o cliente oficial via Google Play.

Feito isso gere o QR code à partir do arquivo android.conf criado acima:

$ qrencode -t utf8 < android.conf

Agora basta escanear o código e conectar na VPN.

Finalizando

Não vamos esquecer de configurar o wireguard para reiniciar caso o Pi reboote:

# systemctl enable wg-quick@wg0

Referências