CGNAT e operadores que o fazem como a DIGI – Como fazer self-hosting sem pagar mais?

Olá a todos,

Vamos começar este post com uma dose de  honestidade: quem é é leitor do blog (mesmo não praticante) que não teve o desejo de criar o seu próprio servidor em casa, seja para um site pessoal, uma cloud privada, ou até uma VPN?
Aquele sonho molhado dos nerds de poder ser o dono e senhor da nossa própria infraestrutura? Sem depender de serviços de terceiros, apenas para bater de frente com um dos maiores obstáculos para qualquer entusiasta de self-hosting em Portugal: o CGNAT.

Se já passaram por isto, sabem do que estou a falar. Se ainda não, a partir de agora, vamos explorar como podemos ultrapassar este problema e continuar a usufruir da maravilha que é o self-hosting — desta vez com a ajuda do nosso amigo Cloudflared Tunnel.

Getting Cloudflare Tunnels to connect to the Cloudflare Network with QUIC

O que é o CGNAT e por que é que nos atrapalha?

Antes de mergulharmos na solução, vamos clarificar o problema. CGNAT (Carrier Grade Network Address Translation) é uma técnica utilizada pelos ISPs (os nossos queridos (!) fornecedores de Internet) para mitigar a escassez de endereços IPv4. Como? Eles basicamente partilham um único endereço IP público por vários clientes ao mesmo tempo, o que faz com que a nossa ligação passe por uma “camada extra” de tradução de endereços.

Agora, se por acaso estavam a pensar que isso não é grande coisa, o problema é que, ao estarmos por detrás de um CGNAT, ficamos impossibilitados de expor diretamente os nossos serviços para a Internet. Isto quer dizer que, para aceder ao nosso servidor self-hosted, não podemos simplesmente abrir portas no nosso router e apontar o nosso domínio para o nosso IP. O CGNAT não vai deixar. Ou seja, não há self-hosting de jogos, serviços como webservices, ou até VPN.

E agora, o que fazemos?

A velha e a nova escola de ultrapassar o CGNAT

Para quem já andava neste mundo do self-hosting há uns tempos, uma solução recorrente era simplesmente ligar para o nosso ISP e pedir um IP público dedicado. No entanto, isso nem sempre é uma opção simples. Na DIGI por exemplo embora a oferta existe, ainda não está disponível para Portugal.
Alguns ISPs cobram por este serviço, e nem todos o oferecem. Além disso, a implementação de IPv6, que poderia ser a solução natural para este problema, ainda está longe de ser uma realidade generalizada.Outra alternativa era subscrever uma vps barata algures no LEB e usar os ip’s dela como nat direto para os nossos serviços através de um tunel cliente de vpn desde o nosso homelab.
Também poderemos utilizar ipv6, mas existe ainda por ai muito boa rede sem acesso ipv6, seja porque ainda ninguém se deu ao trabalho, ou simplesmente porque está barrada.

Mas… e se houvesse uma forma mais simples? É aqui que entra o Cloudflare Tunnel (anteriormente conhecido como Argo Tunnel).

Como o Cloudflare Tunnel nos pode salvar o dia?

O Cloudflare Tunnel é a solução que nos permite expor os nossos serviços self-hosted para a Internet, mesmo quando estamos por detrás de um CGNAT, sem a necessidade de um IP público fixo.

Como é que isto funciona na prática?

Basicamente, o Cloudflare Tunnel cria uma ligação segura entre o nosso servidor local e a Cloudflare. A partir daí, a Cloudflare atua como um “reverse-proxy” que redireciona o tráfego para o nosso servidor, tornando-o acessível a partir de qualquer lugar da Internet. E o melhor de tudo: não precisamos de mexer no nosso router, abrir portas ou depender de IPs públicos.
Nota porem que isto aplica-se em dois casos: Aplicações não UDP, e aplicações ou que os wrapper já tenham sido escritos pela Cloudflare/ que os protocolos sejam passiveis de serem wrapped em pacotes http. Sei por experiência que existem alguns serviços a correr em TCP wrapper que não correm bem.

Vantagens principais do Cloudflare Tunnel:

  • Bypass completo ao CGNAT: Como o tráfego é iniciado a partir do nosso servidor (ligação de dentro para fora), o CGNAT não interfere.
  • Segurança: O tráfego entre o nosso servidor e a Cloudflare é encriptado, o que garante que os nossos dados estão protegidos, embora a CF possa em alguns casos se comparar a um MITM.
  • Configuração simples: Não precisamos de ser experts em redes para configurar um Cloudflare Tunnel. Eles têm uma documentação muito bem feita e fácil de seguir.
  • Domínio gratuito: Podemos associar o nosso servidor a um subdomínio gerido pela Cloudflare, sem custos adicionais.

Vamos pôr mãos à obra: Então como configuramos o Cloudflare Tunnel?

Agora que sabemos como o Cloudflare Tunnel pode resolver os nossos problemas com CGNAT, como configurar tudo isto no nosso servidor? O processo é bastante simples, inclusivé já o abordamos no inicio deste ano e iremos mais uma vez fazer isto juntos.

1. Criar uma conta Cloudflare

Primeiro, se ainda não teem  uma conta na Cloudflare], é necessário  criar uma. É gratuito e rápido. Basta irmos ao site, inscreverem-se e confirmar o vosso email.

2. Criar um domínio (ou subdomínio)

Uma vez que já estamos registados, podemos criar um domínio novo no Cloudflare ou utilizar um que já tenhamos. Se não teem um domínio próprio, não se preocupem — a Cloudflare também nos permite criar subdomínios de um domínio que eles próprios gerem. Como muita gente não tem o seu próprio domínio, iremos utilizar a opção do domínio da cloudflare para este exemplo.

3. Instalar o Cloudflare Tunnel no servidor

Agora a parte que todos nós adoramos: descarregar stress no terminal! Se temos um servidor Linux ou até um Raspberry Pi onde estamos a fazer o nosso selfhosting, nada é mais fácil:

Em primeiro lugar, iremos instalar o `cloudflared`, que é o cliente que nos vai permitir criar o túnel:

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

– Depois, vamos autenticar o cloudflared`com a nossa conta do Cloudflare criada no ponto 1.

cloudflared login

Isto irá abrir uma página no nosso browser onde precisam de dar autorização ao `cloudflared` para aceder à vossa conta.
Nota que caso estejam a fazer esta operação num servidor headless, o mesmo dará um URL para fazerem copy/paste no vosso browser e completar o processo de autenticação.

4. Criar o túnel

Depois de autenticados, podemos criar então o nosso túnel. Vamos chamar-lhe, por exemplo, “tunnel-of-love“:

cloudflared tunnel create tunnel-of-love

Este comando vai gerar um ID único para o nosso túnel. Não se esqueças de o guardar, porque vamos precisar dele mais à frente.

5. Configurar o túnel para o nosso serviço

Agora que o túnel está criado, precisamos de o apontar para o nosso serviço local – o que temos a correr no nosso servidor. Vamos supor que temos um servidor web a correr na porta 80. Criamos a configuração com o seguinte comando:

cloudflared tunnel route dns tunnel-of-love 10.0.10.1

E por fim, para fazer o túnel funcionar, corremos o seguinte comando:

cloudflared tunnel run tunnel-of-love

E pronto! O nosso servidor local já está acessível a partir do domínio que configuraste, sem precisarmos de nos preocupar com o CGNAT!

6. Caveats:

Por certo que já repararam que não defini portas, protocolos ou afins. Isto prende-se que o facto que o CGNAT que a cloudflare nos disponibiliza é APENAS para TCP. Ou seja UDP não funciona precisamente porque como o reverse-proxy que a Cloudflare é, ainda não consegue gerir ligações UDP.

Para configurações mais agressivas e complexas a própria cloudflare recomenda utilizarem o ficheiro de configuração config.yml:

tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json

ingress:
- hostname: gitlab.widgetcorp.tech
service: http://localhost:80
- hostname: gitlab-ssh.widgetcorp.tech
service: ssh://localhost:22
- service: http_status:404

Esta documentação está muito bem conseguida e pode ser lida aqui.

Será que devemos usar sempre o Cloudflare Tunnel?

Agora que vimos como o Cloudflare Tunnel nos facilita e muinto a vida, fica a questão: será que devemos utilizá-lo para todos os nossos projetos de selfhosting? A resposta, como em quase tudo na vida, é: depende.

Se estamos a fazer selfhosting de pequenos projetos, sites pessoais, ou até uma cloud privada, o Cloudflare Tunnel é uma solução excelente, especialmente pela facilidade e pela segurança que nos oferece. No entanto, se estamos a falar de projetos que requerem uma latência mínima (como um servidor de jogos, por exemplo), ou se queremos evitar que o nosso tráfego passe pelos servidores da Cloudflare, então talvez devamos considerar alternativas, como um IP fixo público ou um VPS, sendo o ip publico exportado por wireguard para o nosso host local – irei fazer um post sobre isto mais tarde.

Mas para o utilizador comum, que só quer ultrapassar o CGNAT e ter o controlo sobre os seus próprios serviços em casa, o Cloudflare Tunnel é uma solução ideal.
Com o Cloudflare Tunnel, conseguimos contornar o CGNAT de forma simples e eficaz, sem precisarmos de gastar uma fortuna em IPs públicos ou serviços complicados. Podemos manter o nosso self-hosting vivo e, ao mesmo tempo, proteger os nossos dados e serviços enquanto mais uma vez metemos o dedo de fora a operadores que cartelizam o custo dos servicos de ISP em Portugal.

Como no fundo, o que queremos é ter o controlo sobre as nossas próprias infraestruturas, e o Cloudflare Tunnel permite-nos fazer exatamente isso. Se ainda não experimentaram, vale mesmo a pena dar uma oportunidade. No fim do dia, irão ver que o self-hosting é uma experiência que vale cada segundo!

E pronto, chegamos ao fim de mais um post semanal. Espero que tenham gostado, e se tiverem notado algo incorrecto sabem onde me encontrar.
Partilhem connosco as vossas experiências — juntos, continuamos a aprender e a evoluir como uma comunidade de entusiastas de self-hosting!

Abraço.
Nuno