Nos últimos dias de agosto de 2024, as buscas no Google pelo termo "VPN" aumentaram repentinamente no Brasil (e caíram alguns dias depois). O motivo foi o bloqueio do X.com em todo o país após não atender à exigências do STF. Este post não trata sobre este bloqueio, mas sobre o uso de VPN.
Quando você se conecta através de uma VPN, todas as solicitações do seu computador não vão diretamente ao destino, elas são criptografadas e enviadas a um servidor intermediário; em seguida, a solicitação é enviada pelo servidor intermediário para o destino final como se fosse originada por ele.
Dessa forma, o endereço de seu computador não fica visível para o site de destino, mas sim o do servidor intermediário. Isso ajuda no anonimato e também evita que você seja alvo de bloqueios ou direcionamento geográfico ao usar um servidor de VPN em outro país (há websites com regras para bloquear solicitações vindas de determinados países).
Também é útil ao conectar através de redes não confiáveis, como em aeroportos, restaurantes e espaços públicos. O administrador da rede não sabe identificar qual o destino da sua solicitação, dado que não vê um endereço conhecido como o de redes sociais e bancos, mas o IP do servidor de VPN.
Além de opções pagas famosas, existem provedores de VPN gratuitos, mas o uso é desencorajado dado que podem estar analisando suas solicitações a fim de tornar o serviço rentável de outra forma.
Também é possível com pouquíssimas etapas configurar um servidor de VPN por conta própria e é o foco deste post. Isso pode até ser mais viável economicamente e dar garantias de que não há ninguém no meio do caminho observando suas solicitações.
Primeiros passos
Há algumas etapas para colocá-lo em funcionamento:
- Você precisa de um servidor: Cloud, VPS ou uma máquina com IP público;
- realizar alguns passos para configurar o servidor e instalar o Wireguard;
- configurar seu dispositivo local (computador ou smartphone) para usar o servidor remoto como proxy.
Obtendo um servidor
Não vou me aprofundar nesse assunto, pois tomaria muito espaço deste post e não é o foco central. Mas em poucas palavras, você pode obter um servidor usando níveis gratuitos no Google ou na Oracle, por exemplo, ou de outros provedores como AWS, Azure, DigitalOcean, Vultr...
É claro que você ainda pode ser rastreado porque os intervalos de IP da nuvem são publicamente conhecidos. Mas como presumo que você está prestes a usar VPNs por bons motivos (privacidade), isso não será um problema.
Você ainda tem opções de hospedagem VPS seguras e voltadas para a privacidade que permitem, por exemplo, o pagamento usando criptomoedas sem a necessidade de uma identificação. Basta uma breve pesquisa e encontrará algumas opções.
Configuração do servidor
Neste tutorial, será explicado o uso do https://www.wireguard.com/, um projeto de VPN com código aberto. Estou seguindo com ele por sua simplicidade e maior performance se comparado ao OpenVPN, uma outra alternativa de código aberto.
Configuração base
As etapas começam com a instalação do wireguard
:
sudo apt-get update -y
sudo apt-get install wireguard -y
Depois disso, você terá acesso ao comando wg
. Ele será usado primeiro para gerar um par de chaves (pública e privada), responsáveis pela autenticação e autorização da conexão entre o servidor e os clientes:
WG_PRIV_KEY=$(wg genkey)
WG_PUB_KEY=$(echo $WG_PRIV_KEY | wg pubkey)
echo $WG_PRIV_KEY
echo $WG_PUB_KEY
Como os dois comandos acima apenas exibem o valor das chaves na tela, eu as coloco em uma variável para permitir a próxima etapa, em que as salvo em arquivos para evitar a perda:
sudo mkdir /etc/wireguard
echo $WG_PRIV_KEY | sudo tee /etc/wireguard/wg0-private.key
echo $WG_PUB_KEY | sudo tee /etc/wireguard/wg0-public.key
Usei o prefixo 'wg0' no arquivo, pois ele será o nome de uma rede que será criada nas próximas etapas. Com o Wireguard, você poderá criar várias redes privadas em um único servidor.
Configuração da interface de rede
Na próxima etapa, você habilita o encaminhamento de IP no servidor. Isso é necessário quando um servidor está atuando como roteador ou Network Address Translation (NAT) e permite que o servidor encaminhe pacotes para outros destinos.
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
Agora, é necessário configurar a rede privada, que será denominada wg0
. Você vai criar um arquivo chamado /etc/wireguard/wg0.conf
e, dentro dele, precisará fazer uma referência ao nome da interface de rede principal, portanto, a primeira etapa é encontrar esse nome:
ip route show default | awk '/default/ {print $5}'
Mantenha o resultado da linha acima em mãos e você vai substituir no texto abaixo onde estiver escrito [NAME]
. Além disso, mantenha em mãos o valor da $WG_PRIV_KEY
(o mesmo de /etc/wireguard/wg0-private.key
), que você deverá colocar no lugar de [PRIVATE_KEY]
(lembre de remover os colchetes também).
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [PRIVATE_KEY]
ListenPort = 51820
SaveConfig = true
Address = 10.5.0.0/29
PostUp = ufw route allow in on wg0 out on [NAME]
PreDown = ufw route delete allow in on wg0 out on [NAME]
PostUp = iptables -t nat -I POSTROUTING -o [NAME] -j MASQUERADE -s 10.5.0.0/29
PreDown = iptables -t nat -D POSTROUTING -o [NAME] -j MASQUERADE -s 10.5.0.0/29
Vamos entender o que cada linha significa:
PrivateKey
: é a chave privada do servidor e nunca deve ser compartilhada (apenas a chave pública será trocada para conectar os nós);ListenPort
: essa configuração é usada somente em servidores do Wireguard e especifica a porta pública para conexões VPN e não existirá na configuração do cliente. Cada nova rede precisa de uma porta diferente. Mais adiante será necessário fazer a abertura desta porta no firewall e deve ser aberta no firewall do seu host também;Address
: esta opção especifica o intervalo de sub-rede para os nós da rede sendo criada. Quando definido como10.5.0.0/29
, o sufixo/29
especifica a menor rede multi-host possível, que permite ter até 6 nós clientes, ou seja:10.5.0.0
é o endereço de rede,10.5.0.1
o primeiro endereço utilizável por um cliente,10.5.0.6
o último endereço utilizável e10.5.0.7
é o endereço de broadcast. Você pode ter outros sufixos para permitir mais clientes. Se você não conhece a notação CIDR, visite esta página: https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing;PostUp
ePreDown
: podem aparecer várias vezes em um arquivo de configuração e são usados para executar scripts depois que a rede sobe e antes de ser desligada. As opçõesPreUp
ePostDown
também existem, mas não são usadas aqui. Os scripts que estão nelas são para:- permitir que o tráfego vindo da rede
wg0
seja roteado para a rede principal do seu sistema; - diz ao iptables para modificar os pacotes depois que o roteamento é definido e estão prestes a deixar a interface (através da opção POSTROUTING) e mascara os pacotes (MASQUERADE) para fazer com que pareçam ter sido gerados por esta rede (substitui o IP da rede privada pelo da pública);
- permitir que o tráfego vindo da rede
Com o servidor totalmente configurado, basta abrir a porta ListenPort
na configuração do firewall e iniciar o serviço relativo à rede wg0
:
sudo apt-get install ufw -y
sudo ufw allow 51820/udp
sudo ufw enable
sudo ufw reload
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
sudo systemctl status [email protected]
Configurando seu dispositivo local
Com o servidor funcionando, é necessário agora configurar o cliente. O processo é muito parecido com o passo do servidor e não será reescrito aqui, basicamente, repita o que está em Configuração do servidor
> Configuração base
.
A configuração é um pouco parecida, mas tem algumas diferenças. Tenha em mãos a chave pública do servidor (que está no arquivo /etc/wireguard/wg0-public.key
do servidor) para substituir o valor [SERVER_PUB_KEY]
, o IP público do servidor para substituir o [SERVER_PUBLIC_IP]
, e a chave privada do cliente (está no arquivo /etc/wireguard/wg0-private.key
no seu computador local depois de você repetir a "Configuração base" nele) para substituir o valor [CLIENT_PRIVATE_KEY]
. Tome cuidado para não misturar qual é a chave do servidor e a do cliente e vamos escrever o arquivo de configuração:
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [CLIENT_PRIVATE_KEY]
Address = 10.5.0.1/32
[Peer]
PublicKey = [SERVER_PUB_KEY]
AllowedIPs = 0.0.0.0/0
Endpoint = [SERVER_PUBLIC_IP]:51820
Explicando aqui as opções que são diferentes da versão no servidor:
Address
: um IP específico dentro do intervalo configurado no servidor que será assumido por este cliente. O/32
significa que é um único endereço, não uma faixa como na configuração do servidor. O10.5.0.1
é o primeiro endereço utilizável, podendo ter outros clientes (outro computador ou celular) utilizando até o endereço10.5.0.6
, como explicado anteriormente;PublicKey
: é a chave pública do servidor. Novamente, cuidado para não confundir as chaves;AllowedIPs
: informa à rede quais endereços IP devem ser redirecionar o tráfego para a VPN (rede wg0). Especificando0.0.0.0/0
, tudo passará pela VPN. Esta opção poderia ser diferente, como se você quisesse fazer proxy do tráfego apenas para alguns sites (mas especificando o IP, como1.1.1.1.1, 2.2.2.2.2
...);Endpoint
: o endereço público do servidor e a porta.
Finalizando o servidor
A última configuração é para fazer com que o servidor permita o cliente se conectar, tornando-os pares. Será necessário ter em mãos a chave pública gerada no cliente e o IP escolhido em sua configuração.
Desta vez, vou usar o comando wg
em vez de editar o arquivo de configuração (que também funcionaria):
sudo wg set wg0 peer [CLIENT-PUB-KEY] allowed-ips 10.5.0.1/32
Com isso feito, ao rodar o comando sudo wg
deve ser possível ver estatísticas relacionadas ao novo cliente (como a quantidade de pacotes trocados).
Finalizando o cliente
Após tudo configurado, o último passo é habilitar o Wireguard no cliente, assim como já foi feito no servidor. Porém, no cliente eu prefiro usar o comando wg-quick
em vez de subir como um daemon usando o systemctl
, como no servidor (mas que também pode ser feito no cliente).
sudo wg-quick up wg0
Para verificar se tudo está correto, faça curl abaixo a partir do cliente e verifique se o IP retornado é o mesmo do servidor (e não o IP do cliente):
curl -4 ifconfig.me/ip
Considerações Finais
- Tenha em mente que os provedores Cloud e VPS, assim como os provedores de VPN, podem observar o tráfego de saída de seu servidor e conseguir associar à sua conta;
- A depender do seu uso, como por exemplo para assistir filmes, o uso de banda do seu servidor pode exceder os limites do provedor ou implicar em custos. Tomando como exemplo a Google Cloud, onde usei o free-tier para este tutorial, oferece 200GiB (https://cloud.google.com/vpc/network-pricing#standard-pricing), o que pode ser pouco.
Em resumo, há um trabalho um pouco extenso para encontrar a opção que melhor equilibre privacidade e preço.
Próximos passos
Se quiser saber mais sobre o Wireguard, recomendo este link (uma documentação não oficial): https://github.com/pirate/wireguard-docs.
Embora tenha mostrado como configurar o Wireguard apenas para proxy, você também pode usá-lo para conectar dois ou mais clientes em uma rede privada. Isso é comumente usado por empresas para restringir o acesso a seus sistemas internos apenas para aqueles que estão dentro de uma rede e pode ser usado, por exemplo, para acessar um computador em casa (sem endereço público) de qualquer lugar.