Criando e gerenciando a própria VPN com Ad Block em todos os dispositivos

Introdução

Bom Dia Pessoal. Esse é o meu primeiro post aqui no fórum, assisti alguns vídeos de perguntas e respostas no canal recentemente e me senti inspirado pra compartilhar em forma de tutorial meu setup de networking. Eu diria que o nível desse tutorial é médio, mas se você ainda for iniciante pode ser um bom ponto de partida pra aprender mais. O recomendado é estar confortável com Linux via CLI e estar confortável com Docker e compose

Como eu sou um usuário novo eu não consigo colocar todos os links na postagem, mas fiz o possível pra vocês conseguirem acompanhar sem muita dificuldade de encontrar os recursos

Antes de começar, hoje em dia muitos provedores anunciam tunneling (mascarar seu IP em outra região ou país) como sendo VPNs. Tunneling é uma das possibilidades de VPNs e dependendo do seu setup vai ser possível utilizar tunneling, mas não é o foco desse tutorial. O foco principal aqui é ter seus dispositivos em uma LAN virtual e privada que você pode acessar de qualquer lugar, e por exemplo assistir os filmes do seu NAS mesmo quando tiver fora de casa!

Visão Geral

A minha ideia com esse tutorial é ajudar e motivar quem tem curiosidade ou vontade de ter a sua própria VPN e de quebra ter um Ad Block em todos os dispositivos conectados.

Pra essa VPN a stack de software que eu usei foi Docker + Headscale + Tailscale (wireguard) + Adguard Home. Vou explicar em mais detalhes o por que de cada peça.

Tailscale

Tailscale é uma solução comercial de VPNs que é construída em cima do Wireguard. Já o Wireguard é o principal protocolo de VPN e hoje em dia é o padrão da industria.

Agora por que utilizar o tailscale que é comercial e não o Wireguard? Apesar de ser a base, o wireguard é o protocolo “Cru” de VPNs e por padrão permite apenas conexão P2P, ou seja, Ao invés de conectar seu computador ou celular na “VPN” você teria que manualmente conectar todos os dispositivos a todos os outros manualmente, realizando a troca de chaves publicas e definição de IPs de peers, isso sem contar que o wireguard não tem servidor de DNS por padrão.

Caso você não tenha entendido muito bem os pontos do ultimo paragrafo, esse é o melhor argumento que eu posso dar pro tailscale: ele simplifica muito a parte de baixo nivel.

Outro ponto positivo é que apesar do tailscale ser software comercial, ele tem integração muito boa com alternativas Open Source, como por exemplo o Headscale e tem disponível aplicativos para Android e iOS, Linux, MacOs, Windows e provavelmente pra outros dispositivos que você precisar, além de ser possivel configurar um subnet router pra dispositivos que não suportam o app nativamente.

Headscale

O Tailscale é composto por 2 partes principais, o client (que roda em cada dispositivo) e o servidor de login. A versão comercial do tailscale usa o servidor de login próprio deles, mas existe uma outra alternativa: Headscale.

Headscale é uma implementação que permite você fazer Self Hosting da sua própria VPN sem muito esforço, configurar o Magic DNS e conectar todos os seus dispositivos entre si.

Adguard home

O adguard home é um servidor DNS + Adblock tudo em um. Diferente dos adblocks “tradicionais”, o adguard funciona a nível de DNS, ou seja, você não precisa instalar nada extra, funciona em todos os browsers e todos os dispositivos.

Apesar de funcionarem para a rede inteira, filtros a nível de DNS são menos granulares que ad blocks a nível de browser. Eu gosto de pensar como sendo camadas diferentes de proteção.

Mas como funciona o adblock de DNS? Quando você abre um site, o site tenta carregar o conteúdo de anuncio, por exemplo, g.ads.google. Quando seu browser tentar carregar o conteúdo do anuncio, primeiro ele vai perguntar pro servidor de DNS qual é o IP do site g.ads.google, e aí o nosso servidor de DNS vai filtrar esse domínio como sendo de anuncios e vai responder pro browser algo como 0.0.0.0 (IP buraco negro). Com isso o browser não vai conseguir carregar o conteúdo da página, ou seja, você nem gasta banda (ou dados móveis) pra carregar um anuncio.

Tutorial

Pré Requisitos

Esses são os pré requisitos que você precisa ter configurado antes de começar. Como configurar esses pré requisitos foge do escopo desse tutorial.

  • IP público (esse é o mais dificil)
  • Computador disponível 24/7
  • Docker disponível 24/7
  • Domínio configurado apontando pro IP público

Sobre o IP publico, pode ser tanto IPv4 quanto IPv6. IPv6 é mais de boa, por que dependendo do seu provedor você já tem um IPv6 roteável, mas se você usar IPv6 todos os seus dispositivos precisam utilizar redes que suportam IPv6, ou seja, se sua rede de casa suportar mas o seu provedor de celular não, não vai funcionar

IPv4 já é mais complicado por que você vai precisar abrir o bolso. A minha recomendação é pegar uma VPS no Digital Ocean ou no Magalu Cloud por que eles vem com IPv4 público já. Além disso com uma VPS você ja tem um computador rodando 24/7 pra instalar o Docker e as outras dependencias.

É importante apontar um domínio pra esse IP público por questão de certificados. Aqui de exemplo vou usar o dominio vpn.meudominio.com

Eu particularmente fui pra rota da VPS. Eu ja uso a minha VPS pra outras coisas então pra mim o valor sai de graça. Com a VPS você também pode fazer tunneling, então como a minha máquina está em NYC, you consigo acessar pelo tunel como se tivesse lá nos EUA

Uma das minhas preocupações em usar um VPS é a banda de transferência disponível. De maneira simples, quando você esta usando tunneling pela VPS você vai usar o limite de transferência da VPS agora se você tiver fazendo a comunicação entre duas maquinas dentro da VPN (por exemplo celular e computador) essa conexão vai ser P2P e não vai consumir o limite da VPS que é bem legal na minha opinião.

Por fim, o docker não precisa rodar no mesmo computador que tem o IP publico, no meu caso eu rodo o docker no meu homelab.

Setup do Headscale

Importante: O Headscale precisa ser instalado e rodar no computador que tiver um IP publico!

Instalação

Como a minha VPS é Ubuntu, o primeiro passo é baixar o .deb pra fazer a instalação, você pode fazer o download diretamente do github do Headscale, ou então dependendo da distro (como o Arch) já está disponível nos repositórios oficiais.

Uma vez que você tenha o arquivo, pode instalar com sudo apt install ./headscale.deb.

é simples assim.

Configuração

O arquivo de configuração do Headscale é /etc/headscale/config.yaml. Abra esse arquivo com seu editor de preferência

A primeira parte que precisamos alterar é o server_url, ele precisa apontar pro dominio que você configurou anteriormente, então nesse caso:

server_url: https://vpn.meudominio.com:443/

Depois disso podemos configurar o listen_address. Por padrão o valor é 127.0.0.1:8080. Perceba que o IP está 127.0.0.1, ou seja, é acessível apenas dentro da máquina. Se você não especificar 127.0.0.1 ou então utilizar 0.0.0.0, e não tiver um firewall bloqueando essa porta seu servidor ficará acessível sem criptografia na internet publica, o que não é legal.

Como eu ja tenho outra aplicação rodando na porta 8080 e 8081, eu mudei meu address pra:

listen_address: 127.0.0.1:8082

O próximo passo é fazer a configuração do TLS. Caso você ja tenha gerado certificados para o seu dominio, você pode definir os certificados utilizando:

tls_cert_path: /caminho/certificado
tls_key_path: /caminho/chave

Se você não tiver certificados gerados, você tem duas opções:

Reverse Proxy

Eu particularmente uso reverse proxy, ou seja, eu tenho um servidor que recebe os requests e cuida do TLS/SSL automaticamente e depois encaminha o request para o servidor. Como eu tenho vários dominios que acessam o mesmo servidor essa é a melhor opção pra mim. Porém configurar um reverse proxy fica fora do escopo desse tutorial. Se quiser uma recomendação utilize o Caddy.

Caso você use o reverse_proxy, o endereço que você precisa apontar o dominio é o mesmo configurado no listen_address. Nesse meu exemplo a configuração do caddy é:

vpn.meudominio.com {
	handle_path /stats/* {
		reverse_proxy localhost:9090
	}
        # Config relevante
	reverse_proxy localhost:8082
}

Let’s Encrypt

Esse método é o mais adequado pra quem for rodar apenas a VPN no servidor/IP publico. Se você quiser um quick start, definitivamente vá pelo let’s encrypt. Você precisa configurar apenas 2 campos:

acme_email: seu@email
tls_letsencrypt_hostname: vpn.meudominio.com

Criando um usuário

Apos terminar essa configuração inicial, inicie o headscale utilizando sudo systemctl enable --now headscale
Apesar do Headscale suportar vários usuários, vamos configurar apenas um para essa VPN. Use o comando headscale users create <nome>.

Por enquanto é isso no Headscale, mas a gente vai voltar mais tarde pra configurar o DNS.

Setup do Tailscale

Agora é a hora de conectar seus dispositivos no tailscale. Eu vou utilizar todos os exemplos na CLI mas é possível utiliza a interface gráfica se for do seu agrado.

O primeiro dispositivo que eu vou conectar é a própria VPS, utilizando o comando

tailscale up --login-server vpn.meudominio.com

O resultado desse comando vai ser um URL. Abra esse URL no seu navegador, deve aparecer um comando para terminar a conexão, como por exemplo:

headscale nodes register --user <USER> --key <YOUR_MACHINE_KEY>

Subsitua User pelo usuário que você criou e a Machine Key ja deve vir automaticamente no comando

Execute esse comando no terminal da sua VPS e sucesso, você conectou seu primeiro dispositivo no tailscale.

Você vai precisar repetir esse processo para todos os dispositivos que você vai conectar, mas apesar de ser trabalhoso não é difícil, lembre disso:

  1. Mudar o servidor de login e tentar conectar
  2. Abrir o browser e copiar o comando
  3. Executar o comando no server

Por enquanto você só precisa conectar 3 dispositivos pra seguir: A VPS, a maquina com Docker e o computador que você estiver usando

Depois de conectar os dispositivos, você pode usar o comando tailscale status pra ver quais dispositivos estão conectados, por exemplo:

$ tailscale status
[IP]  main                  yerik  linux    -                                                                                                                                                                             
[IP]  homelab               yerik  linux    active; direct 
[IP]  vps                   yerik  linux    idle; offers exit node                                                               

Na minha configuração ja aparece o exit node (tunneling) mas vamos configurar isso depois

Adguard Home

Configurar o adguard home é bem simples também.

Primeiro acesse o computador que tem o Docker executando via SSH. Primeiro vamos criar uma pasta para guardar o docker compose e as configurações:

mkdir adguardhome && cd adguardhome
mkdir confdir
mkdir workdir

Crie um arquivo docker-compose.yml e coloque o conteúdo

services:
    adguardhome:
        image: adguard/adguardhome:latest
        container_name: adguardhome
        restart: unless-stopped
        ports:
            - 53:53/tcp
            - 53:53/udp
            - 3006:3000/tcp
        volumes:
            - ./workdir:/opt/adguardhome/work
            - ./confdir:/opt/adguardhome/conf

Eu utilizei a porta 3006 ao invés da 3000 padrão por conta do reverse proxy e já ter outros Apps na 3000. A partir de agora os IPs podem ser diferentes dependendo da ordem que você adicionou dispositivos no headscale

Inicie o Adguard com o comando docker compose up -d

agora pra configurar o adguard home precisamos pegar o IP dessa maquina usando:

$ tailscale ip
100.64.0.6

Abra seu navegador (em algum dispositivo que ja esteja na vpn) e acesse o url (http://)100.64.0.6:3006

Aqui de importante você só precisa configurar o Admin Web Interface, na opção Listen Interface mude a porta para 3000 (para funcionar com o arquivo compose). Depois disso pode ir fazendo o setup e clicando sempre em next. As opções default ja funcionam muito bem.

Headscale parte 2

Essa é a ultima parte desse tutorial, vamos configurar o MagicDNS e correr pro abraço.

Acesse a sua VPS novamente e abra o arquivo /etc/headscale/config.yaml. Vou apresentar uma configuração básica com os comentários removidos, mas eu sugiro deixar os comentário no arquivo pra seu Eu futuro entender o que está acontecendo na config

dns_config:
  override_local_dns: true
  nameservers:
    - 100.64.0.6
    - 1.1.1.1
  domains: []
  magic_dns: true
  base_domain: casa

O que essa config faz é:

  1. Habilitar o DNS override (seus dispositivos vão usar esse DNS ao invés do padrão)
  2. Definir os nameservers. Aqui vamos usar o mesmo IP do servidor que você configurou o Adguard home. A segunda opção (1.1.1.1) é o fallback se seu Adguard home não estiver online
  3. Ativar o MagicDNS
  4. Definir um base domain

No base domain eu sugiro você usar um nome que não seja ccTLD ou gTLD, em outras palavras, evite usar com, io, dev, tech, etc pra não dar conflito com dominios na internet publica não sendo acessiveis no DNS.

Após essa configuração reinicie o headscale com systemctl restart headscale e a mágica vai funcionar. Ao acessar sites cheios de anúncios (como sites de noticia) os anúncios não vão carregar (pode levar um tempo dependendo do cache de DNS no seu sistema).

Além disso você pode acessar seus computadores usando os dominios magic DNS. No meu caso eu posso acessar meu homelab pelo dominio homelab.casa

Alguns browsers por padrão pesquisam ao invés de tentar acessar o dominio. Nesse caso você pode forçar o browser a acessar utilizando o prefixo http:// antes do homelab.casa

Parabéns, você tem uma VPN configurada com Adblock de DNS em todos os seus dispositivos. Agora é apenas uma questão de conectar eles na VPN seguindo os passos anteriores e ser feliz.

Bonus: Tunneling

Claro que um dos usos mais interessantes pra VPN é poder mascarar seu IP original por outro e acessar conteúdos como se estivesse em outro lugar.

Sabe aquela “feature” da netflix que não permite assistir o conteúdo que você paga por estar fora de casa? Você pode fazer um tunel de outros dispositivos para um computador em casa (como homelab) e aí assistir de qualquer lugar como se tivesse em casa

No tailscale isso é chamado de exit node e pra configurar precisamos de dois passos bem simples.

Acesse o PC que você quer usar como ponto de saída (no meu caso a VPS em NYC) e utilize os comandos:

sudo tailscale set --advertise-exit-node
sudo tailscale up --login-server vpn.meudominio.com

O comando tailscale up precisa ser exatamente o mesmo que você usou inicialmente para conectar esse dispositivo. É importante dar esse comando para que o headscale fique sabendo que podemos usar esse dispositivo como porta de saída.

Agora a segunda parte é habilitar a rota do exit node no headscale. Descubra quais os IDs das rotas utilizando

$ headscale routes list
ID | Machine | Prefix    | Advertised | Enabled | Primary
1  | vps     | 0.0.0.0/0 | true       | true    | -
2  | vps     | ::/0      | true       | true    | -

Provavelmente a coluna enabled vai estar false, mas eu ja tenho configurado. E a coluna machine é o nome que você vai precisar usar na hora de habilitar o tunneling

Com os IDs em mão utilize o comando headscale routes enable -r ID passando o ID de cada rota.

Com isso seu headscale e seu exit node já estão configurados para tunneling.

Para ativar a opção tunneling no PC, faça o seguinte:

Acesse o WhatsMyIP e anote seu IP

no dispositivo rode sudo tailscale set --exit-node=vps trocando vps pelo nome da sua maquina.

Tente acessar o WhatsMyIP novamente e veja que o IP mudou

Se a maquina que você usou de saída tem o mesmo IP da maquina que você está testando, você não vai ver diferença no IP, mas se vc tiver usando uma VPS você vai ver o IP mudando

Para desligar o tunneling sudo tailscale set --exit-node=.

Conclusão

Esse processo é relativamente longo e tem vários passos que precisam ser feitos para chegar no resultado final, mas depois que você configurar uma vez a manutenção é bem baixa.

Espero que vocês consigam tirar algum valor desse tutorial, seja curiosidade, aprendizado ou um resultado prático no dia a dia com menos anúncios e uma VPN “de graça”.

Depois me contem que coisas interessantes vocês fizeram com as VPNs (eu uso pra self host de uma porrada de coisa) e se puderem deixar um feedback também do tutorial se foi muito complicado de seguir ou se eu esqueci de algum passo importante.

Valeu galera e happy computing.

2 curtidas

Muito bom, achei bem completo.

1 curtida