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
- https://www.wireguard.com/
- https://wiki.archlinux.org/index.php/WireGuard
- https://blog.oxplot.com/wireguard-vpn-on-android/
- https://www.linode.com/docs/networking/vpn/set-up-wireguard-vpn-on-ubuntu/
- https://www.raspberrypi.org/forums/viewtopic.php?t=269480
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
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!
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!