Executando verificação de segurança...
12

Por causa do banimento Twitter (X) fiz minha própria VPN com deploy na AWS com Terraform

Bom dia pessoal tudo tranquilo?

Então, hoje o Twitter (X) voltou a poder ser acessado no Brasil, mas os dias que ele esteve fora do ar me deram muitos aprendizados de como uma VPN funciona. Sei que para alguns já sabem, mas mesmo assim quero compartilhar a minha experiência e no final vou deixar o repositório que fiz com o deploy automático de sua vpn.

Primeiro eu nunca me interessei por vpn, acho que foi porque eu nunca precisei haha, mas essas recentes tretas que levaram ao banimento do Twitter foram o gatilho para eu querer aprender, e olha! O que eu descobri foi muito legal.

A experiência mais próxima que tive com algo semelhante a VPN foi ao acessar uma VPS EC2 em uma subnet privada, sem IP público. Para isso, eu precisava primeiro conectar a uma máquina na subnet pública e, a partir dela, acessar a VPS na subnet privada usando o IP privado desta.

Ou seja, é basicamente um túnel de conexões, e é exatamente isso que uma vpn faz, isso me deixou intrigado. Então pensei, “se isso aqui é exatamente o que uma vpn faz, então por que o povo contrata vpn?”

Aí veio a resposta: o túnel que eu estava criando não tinha criptografia para criptografar os pacotes que estavam sendo enviados entre as duas máquinas. Ou seja, ainda não era uma vpn convencional.

Depois de pesquisar bastante, vi que era justamente essa criptografia que fazia sua navegação ser privada e segura. Porém também descobri que não é recomendado você contratar vpns dessas empresas que vendem esse serviço, pois nada garante que sua atividade na internet realmente esteja sendo criptografada e não esteja sendo salva em algum banco de dados devido ao código dessas empresas não ser aberto

A própria NordVPN foi hackeada em 2018.

Então priorizei duas coisas: privacidade e segurança, por isso decidi criar minha própria VPN. Pesquisando, descobri que uma VPN funciona assim: o servidor VPN fica em uma VPS (ou qualquer máquina), e você a transforma em um NAT Gateway, que basicamente faz a VPS atuar como um roteador, como o de sua casa. Depois, você coloca uma chave privada no servidor e outra no seu celular (VPN client), e as chaves públicas são trocadas entre eles. Assim, só o dispositivo com a chave pública correspondente pode acessar a VPN e criptografar os dados enviados.

Depois vi que não preciso criar tudo na mão, existem duas principais soluções open-source pra isso, OpenVPN e Wireguard. Na primeira vez usei o OpenVPN, só que ele é tão chato de mexer que depois que consegui fazer funcionar, fui tentar fazer com o Wireguard, e é bem mais fácil, e foi o que decidi usar para facilitar a replicação.

A hospedagem da VPS que escolhi foi a AWS porque foi a última que usei em um freelancer, então fiz um script Terraform que já subia a Rede, junto com a Subnet pública, o Internet Gateway, o firewall (security group), e a VPS com um script bin/bash que quando inicializa a instância EC2 já faz todo o processo de instalação do Wireguard, seta as chaves públicas e privadas e no final tudo que você tem que fazer é entrar na sua conta da AWS pra pegar o ip público da VPS e colocar no aplicativo da Wireguard que você baixa e pronto é só usar sua própria VPN.

Toda pesquisa que fiz foi na gringa, não achava muita coisa sobre fazer isso na AWS em português, tinha visto que usar o Amazon Linux 2023 não dava certo. Porém eu queria usar ele porque a própria Amazon fala que o Amazon Linux 2023 é o mais recente e é totalmente otimizado para o ambiente cloud da Amazon. Então as configurações que usei fizeram isso dar certo.

Para quem quiser testar esse aqui é o repositório com a documentação que fiz para vocês, é só ler a documentação e instalar (fiz em inglês, mas acho que todo programador sabe inglês, qualquer coisa usa o Google Tradutor):
https://github.com/kimitrii/self-hosted-vpn

Disclaimer:
1 - Eu não quis usar uma web interface porque isso me obrigaria a ter que permitir conexões para requisições http e https vindas de qualquer lugar do mundo no servidor da vpn, e sem falar que eu teria que fazer um sistema de autenticação. Querendo reduzir o risco de falhas de segurança e hacker, resolvi deixar a entrada do firewall (security groups) apenas do tipo UDP porta 51820 que é o que o Wireguard aceita.

2 - Eu sei que já existem scripts que fazem instalações de vpn automáticas, porém eu li alguns e realmente não gostei do que vi, então resolvi eu mesmo fazer o meu por questão de segurança.

3 - O túnel entre você e a sua vpn realmente vai ser criptografado e seguro, porém a máquina que o vpn server está, acessará a internet como uma máquina normal, ou seja, é o ip público dela que vai aparecer nos sites que ela acessar, então será o dono dessa máquina que será rastreado irá se responsabilizar por acessar quaisquer conteúdos proibidos, se quiser privacidade de verdade use o Tor Browser, pois ele é que tem um sistema de ficar gerando ips públicos e trocando-os, o que torna impossível o rastreamento. Não estou incentivando ninguém a acessar nenhum conteúdo proibido, apenas explicando que vpn não é totalmente privado.

É isso galera! É um texto enorme, acho que ninguém vai ler, mas queria um lugar pra compartilhar o que aprendi semana passada.
Tmj!

Carregando publicação patrocinada...
1

Muito legal o projeto. Baita oportunidade para aprender e resolver problemas do mundo real.

Se me permite a pergunta, quanto está sendo o custo para manter a VPN?

1

Faz 2 dias que estou usando e até agora o custo foi de U$ 0,1. Como escolhi a instância t4g.nano, provavelmente o custo vai ficar entre U$ 3,00 mensais.

1

Muito legal o detalhamento do seu post!

E para quem deseja uma solução mais rápida e que já tenha uma VPS que usa para outra coisa, é possível direcionar o ssh para um socks e configurá-lo para utilizar a porta que vc definir.
O comando ssh é basicamente:

ssh usuario@ip_do_servidor -D 5000 -N

Feito isso ele vai direcionar o tráfego para a porta 5000, aí basta configurar o navegador para utilizar SOCKS proxy na porta 5000 (exemplo), no caso do mac, você pode fazer isso a nível do SO buscando por "proxies" nas configurações.
Qualquer site será acessado a partir do IP do seu servidor, sem mudar nada na infra dele.