Configurando uma VPN simples com WireGuard e Raspberry Pi como servidor

Como WireGuard se tornará parte do futuro do núcleo Linux 5.6, decidi ver a melhor forma de integrar essa VPN com meu roteador LTE/ponto de acesso no Raspberry Pi.

Hardware

  • Raspberry Pi 3 com módulo LTE e endereço IP público. Aqui será o servidor VPN (daqui em diante chamado de edgewalker)
  • Telefone Android que deve usar a VPN para todas as comunicações
  • Laptop Linux que deve usar a VPN apenas dentro da rede

Cada dispositivo que se conecta à VPN deve ter a capacidade de se conectar a todos os outros dispositivos. Por exemplo, o telefone deve conseguir se conectar ao servidor web no laptop, se ambos os dispositivos fizerem parte da rede VPN. Se a configuração for simples o suficiente, podemos considerar conectar também o desktop (via Ethernet).

Considerando que conexões com fio e sem fio estão se tornando cada vez menos seguras ao longo do tempo (ataques direcionados, ataque KRACK contra WPA2 e ataque Dragonblood contra WPA3), estou seriamente considerando usar WireGuard para todos os meus dispositivos, não importa em que ambiente eles operem.

Instalação de software

WireGuard fornece pacotes pré-compilados para a maioria das distribuições Linux, Windows e macOS. Aplicativos para Android e iOS estão disponíveis através das lojas de aplicativos.

Estou com a última versão do Fedora Linux 31, e antes da instalação, não me dei ao trabalho de ler o guia. Apenas encontrei os pacotes wireguard-tools, instalei-os e depois não conseguia entender por que nada estava funcionando. Pesquisas posteriores mostraram que não tinha o pacote wireguard-dkms (com driver de rede), e ele não estava no repositório da minha distribuição.

Se eu tivesse lido as instruções, teria feito os passos corretos:

$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools

No Raspberry Pi eu tenho a distribuição Raspbian Buster instalada, onde já existe o pacote wireguard, instalando-o:

$ sudo apt install wireguard

No telefone Android, instalei o aplicativo WireGuard VPN da loja oficial do Google App Store.

Instalação de chaves

Para autenticação de nós, Wireguard utiliza um esquema simples de chave privada/pública para autenticar nós da VPN. Você pode facilmente criar chaves VPN usando o seguinte comando:

$ wg genkey | tee wg-laptop-private.key |  wg pubkey > wg-laptop-public.key
$ wg genkey | tee wg-server-private.key |  wg pubkey > wg-server-public.key
$ wg genkey | tee wg-mobile-private.key |  wg pubkey > wg-mobile-public.key

Isso nos dá três pares de chaves (seis arquivos). Não vamos fazer referência aos arquivos nas configurações, mas vamos copiar o conteúdo aqui: cada chave é uma linha em base64.

Criando o arquivo de configuração para o servidor VPN (Raspberry Pi)

A configuração é bastante simples, eu criei o seguinte arquivo /etc/wireguard/wg0.conf:

[Interface]
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = 
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wwan0 -j MASQUERADE

[Peer]
# laptop
PublicKey = 
AllowedIPs = 10.200.200.2/32

[Peer]
# celular
PublicKey = 
AllowedIPs = 10.200.200.3/32

Algumas observações:

  • As linhas dos arquivos de chave precisam ser inseridas nos lugares apropriados
  • Minha rede VPN utiliza uma faixa interna 10.200.200.0/24
  • Para os comandos PostUp/PostDown eu indiquei a interface de rede externa wwan0, você pode ter outra (por exemplo, eth0)

A rede VPN pode ser ativada facilmente com o seguinte comando:

$ sudo wg-quick up wg0

Um pequeno detalhe: eu usei dnsmasq atrelado à interface de rede br0, eu também adicionei dispositivos wg0 à lista de dispositivos permitidos. No dnsmasq, isso é feito adicionando uma nova linha com a interface de rede no arquivo de configuração /etc/dnsmasq.conf, por exemplo:

interface=br0
interface=wg0

Além disso, eu adicionei uma regra do iptables para permitir o tráfego na porta UDP de escuta (51280):

$ sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT

Agora, com tudo funcionando, podemos configurar a inicialização automática do túnel VPN:

$ sudo systemctl enable wg-quick@wg0.service

Configuração do cliente no laptop

No laptop, criamos o arquivo de configuração /etc/wireguard/wg0.conf com as mesmas configurações:

[Interface]
Address = 10.200.200.2/24
PrivateKey = 

[Peer]
PublicKey = 
AllowedIPs = 10.200.200.0/24
Endpoint = edgewalker:51820

Notas:

  • No lugar de edgewalker, você deve indicar o IP público ou o host do servidor VPN
  • Instalando AllowedIPs para 10.200.200.0/24, usamos VPN apenas para acessar a rede interna. O tráfego para todos os outros IPs/servidores continuará a ser transmitido pelos canais "normais" abertos. Também será utilizado um servidor DNS pré-configurado no laptop.

Para testes e inicialização automática, usamos os mesmos comandos wg-quick e systemd:

$ sudo wg-quick up wg0
$ sudo systemctl enable wg-quick@wg0.service

Configuração do cliente no telefone Android

Para o telefone Android, criamos um arquivo de configuração muito semelhante (vamos chamá-lo de mobile.conf):

[Interface]
Address = 10.200.200.3/24
PrivateKey = 
DNS = 10.200.200.1
        
[Peer]
PublicKey = 
AllowedIPs = 0.0.0.0/0
Endpoint = edgewalker:51820

Ao contrário da configuração no notebook, o telefone deve utilizar nosso servidor VPN como servidor DNS (linha DNS), e também deve permitir que todo o tráfego passe pelo túnel VPN (AllowedIPs = 0.0.0.0/0).

Em vez de copiar o arquivo para o dispositivo móvel, podemos convertê-lo em um código QR:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf

O código QR aparecerá no console como ASCII. Ele pode ser escaneado pelo aplicativo Android VPN e configurará automaticamente o túnel VPN.

Saída

A configuração do WireGuard é simplesmente mágica em comparação com o OpenVPN.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster