Wireguard

By | April 19, 2020

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
  • Peer é o que diz respeito ao Pi
    • PublicKey é a chave pública do Pi
    • AllowedIPs deixando com 0.0.0.0/0 faz com que todo o tráfego seja via VPN
    • Endpoint é o IP público do seu 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

No tag for this post.

3 thoughts on “Wireguard

  1. Wanderson

    Olá Eri!
    Parabéns pelo tutorial!
    Fiz toda a configuração mas meu android só conecta no WireGuard quando está na minha rede interna. Com a internet da operadora de celular não conecta de jeito nenhum. Já tentei de tudo.
    Tem alguma dica do que pode estar errado?
    Obrigado!
    Wanderson

  2. Eri Post author

    Algumas ideias pra testar:
    – Você consegue acessar se estiver numa rede wireless externa?
    – Você consegue acessar de uma instância externa (tipo sobe uma VM no GCP ou no AWS)
    – Se você colocar um tcpdump na interface externa do seu servidor você vê tráfego chegando lá?
    – E se colocar o tcpdump na wg0?

    Acho que com isso mais ou menos dá pra achar onde está a raiz do problema. Boa sorte!

  3. Wanderson

    Obrigado pela resposta!
    – Ainda não consegui testar de uma rede externa sem ser a do próprio celular (culpa da quarentena).
    – Usando o tcpdump na wg0 eu vejo as requisições normalmente quando o celular está na rede interna, mas quando estou na internet do celular não chega requisição nenhuma. A porta está liberada no router.
    Falta conhecimento para usar a ferramenta tcpdump…
    Acredito que pode ser algum detalhe nessas linhas de código que acrescentei em /etc/wireguard/wg0.conf

    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

    Antes de incluir essas linhas, não funcionava nem na rede interna.
    Vou continuar as tentativas por aqui.
    Valeu!

Comments are closed.