Como Expor Serviços da Rede Local à Internet com Cloudflare Tunnel — Guia Passo a Passo

Cloudflare Tunnel · Zero Trust · Redes · Segurança · Linux · Windows

O Cloudflare Tunnel permite expor serviços da rede local à Internet de forma segura — sem abrir portas no router, sem expor o IP público da empresa, e com SSL automático incluído. O serviço é gratuito para uso individual e de PME, e resolve o problema do acesso remoto a serviços internos quando não há VPN configurada, o IP é dinâmico, ou a ligação está por detrás de CGNAT.

Este guia mostra como configurar o Cloudflare Tunnel do zero — criar o túnel, instalar o cloudflared no servidor interno, mapear subdomínios para serviços locais, e torná-los acessíveis de qualquer lugar com HTTPS.

ℹ Casos de uso típicos em PME e homelab

  • Acesso remoto ao Zabbix, Grafana, Portainer ou outro painel interno
  • Expor um servidor web ou aplicação interna sem VPN
  • Acesso SSH a servidores internos de qualquer rede
  • Partilhar temporariamente uma demo ou ambiente de desenvolvimento
  • Alternativa a VPN quando o ISP usa CGNAT (sem IP público directo)

1. Como Funciona o Cloudflare Tunnel

A diferença fundamental face ao método tradicional (port forwarding no router) é a direcção da ligação — o túnel é sempre iniciado de dentro para fora:

Port Forwarding tradicional Cloudflare Tunnel
Portas abertas no router ✗ Sim — superfície de ataque exposta ✓ Não — zero portas abertas
IP público exposto ✗ Sim — visível e atacável ✓ Não — tráfego passa pela rede Cloudflare
SSL/HTTPS Manual — certificado próprio necessário ✓ Automático — certificado gerido pela Cloudflare
Protecção DDoS ✗ Não incluída ✓ Incluída — WAF + DDoS da rede Cloudflare
IP dinâmico / CGNAT ✗ Problemático — precisa de DDNS ✓ Funciona — o túnel é outbound-only
Custo Gratuito (mas sem protecção) ✓ Gratuito para uso pessoal e PME (plano Free)

O daemon cloudflared instalado no servidor interno estabelece uma ligação outbound persistente para a rede Cloudflare. Quando um utilizador externo acede a app.empresa.pt, a Cloudflare encaminha o pedido através desse túnel para o serviço interno — sem nunca tocar no router.

2. Pré-requisitos

Requisito Detalhe
Conta Cloudflare Gratuita em cloudflare.com — o plano Free é suficiente para a maioria dos casos
Domínio próprio Ex: empresa.pt — os nameservers devem apontar para a Cloudflare. O domínio pode ser registado em qualquer registar (DNS.PT, GoDaddy, Namecheap, etc.)
Servidor na rede local Linux (Debian/Ubuntu/RHEL/Fedora), Windows, ou qualquer máquina onde instalar o cloudflared
Serviço a expor Qualquer serviço com endereço IP:porta interno — ex: 192.168.1.10:80, localhost:8080
Acesso à Internet outbound O servidor precisa de acesso outbound na porta 7844 (QUIC) ou 443 (HTTPS) para a rede Cloudflare. Não é necessária nenhuma porta inbound.

3. Criar o Túnel no Dashboard Cloudflare

  1. Aceder a one.dash.cloudflare.com e iniciar sessão
  2. No menu esquerdo: Networks → Tunnels
  3. Clicar em Create a Tunnel
  4. Seleccionar Cloudflared como tipo de conector
  5. Dar um nome descritivo ao túnel (ex: servidor-empresa ou homelab-prod)
  6. Clicar em Save Tunnel
  7. A página seguinte mostra o comando de instalação do cloudflared com o token do túnel já incluído — copiar este comando

⚠ O token do túnel é como uma password: O comando de instalação inclui um token único que autentica o servidor junto da Cloudflare. Não partilhar nem commitar este token em repositórios públicos.

4. Instalar o cloudflared em Linux

Debian / Ubuntu

# Adicionar repositório Cloudflare e instalar cloudflared
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

echo “deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main” | \
sudo tee /etc/apt/sources.list.d/cloudflared.list

sudo apt update && sudo apt install cloudflared -y

# Verificar instalação
cloudflared –version

RHEL / Fedora / CentOS

# Descarregar e instalar o RPM mais recente
curl -fsSL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.rpm \
-o cloudflared.rpm

sudo dnf localinstall cloudflared.rpm -y # Fedora/RHEL 8+
# sudo yum localinstall cloudflared.rpm -y # CentOS 7

cloudflared –version

Ligar o servidor ao túnel (após instalação)

# Executar o comando copiado do dashboard Cloudflare (inclui o token do túnel)
# O dashboard gera automaticamente o comando completo — exemplo genérico:

sudo cloudflared service install eyJhIjoiXXX…token_do_dashboard…XXX

# Iniciar e activar o serviço
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

# Verificar estado — deve mostrar “active (running)”
sudo systemctl status cloudflared

5. Instalar o cloudflared em Windows

# Instalar via winget (Windows 10/11)
winget install –id Cloudflare.cloudflared

# Alternativa: descarregar o .exe directamente
# https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe

# Instalar como serviço Windows (PowerShell como Administrador)
# Usar o comando copiado do dashboard — exemplo genérico:
cloudflared.exe service install eyJhIjoiXXX…token_do_dashboard…XXX

# Iniciar o serviço
Start-Service -Name “Cloudflare Tunnel”

# Verificar estado
Get-Service -Name “Cloudflare Tunnel” | Select-Object Name, Status, StartType

ℹ Serviço Windows: Depois de instalado como serviço, o cloudflared inicia automaticamente com o Windows e mantém o túnel activo mesmo sem sessão aberta.

6. Instalar o cloudflared com Docker

Para ambientes que já usam Docker — opção mais limpa para evitar instalar binários directamente no sistema.

# Correr o cloudflared como container Docker
docker run -d \
–name cloudflared \
–restart unless-stopped \
cloudflare/cloudflared:latest tunnel \
–no-autoupdate run \
–token eyJhIjoiXXX…token_do_dashboard…XXX

# Verificar que o container está a correr
docker ps –filter “name=cloudflared”
docker logs cloudflared

# Alternativa com docker-compose — adicionar ao docker-compose.yml existente:

cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel –no-autoupdate run –token ${CLOUDFLARE_TUNNEL_TOKEN}
environment:
CLOUDFLARE_TUNNEL_TOKEN=eyJhIjoiXXX…token…XXX
# Guardar o token em ficheiro .env e não em docker-compose.yml directamente

7. Configurar Hostnames Públicos — Mapear Serviços

Com o túnel activo e o conector a mostrar estado Healthy no dashboard, o passo seguinte é mapear subdomínios públicos para os serviços internos.

Via dashboard Cloudflare

  1. No dashboard: Networks → Tunnels → [nome do túnel] → Configure
  2. Separador Public Hostname → clicar Add a public hostname
  3. Preencher os campos:
Campo O que introduzir Exemplo
Subdomain Prefixo do subdomínio público zabbix
Domain Domínio principal na Cloudflare empresa.pt
Type Protocolo do serviço interno HTTP ou HTTPS
URL IP:porta do serviço interno 192.168.1.10:80

Exemplos de mapeamentos comuns:

Subdomínio público Serviço interno Tipo URL interna
zabbix.empresa.pt Zabbix monitoring HTTP 192.168.1.10:80
grafana.empresa.pt Grafana dashboards HTTP localhost:3000
portainer.empresa.pt Portainer Docker UI HTTPS localhost:9443
nextcloud.empresa.pt Nextcloud HTTP 192.168.1.20:8080
ha.empresa.pt Home Assistant HTTP 192.168.1.50:8123

⚠ Serviços com HTTPS interno e certificado auto-assinado

Se o serviço interno usa HTTPS com certificado auto-assinado (ex: Portainer, Cockpit), seleccionar HTTPS como Type e activar “No TLS Verify” em Additional application settings → TLS. Assim o cloudflared aceita o certificado interno sem validação.

8. Correr o cloudflared como Serviço do Sistema

Para garantir que o túnel se mantém activo após reinícios e sem sessão aberta, o cloudflared deve correr como serviço do sistema.

# Linux — verificar e gerir o serviço systemd
sudo systemctl status cloudflared # Ver estado
sudo systemctl restart cloudflared # Reiniciar
sudo journalctl -u cloudflared -f # Ver logs em tempo real
sudo journalctl -u cloudflared –since “1 hour ago” # Logs da última hora

# Verificar que o túnel aparece como Healthy no dashboard após arranque do serviço
# Cloudflare → Zero Trust → Networks → Tunnels → [nome] → Status: Healthy

9. Acesso SSH Através do Túnel

Para acesso SSH a um servidor interno via Cloudflare Tunnel, o processo é ligeiramente diferente — o cloudflared precisa de estar instalado também no cliente (máquina de onde se vai ligar).

Configuração no servidor (destino)

No dashboard Cloudflare, ao configurar o hostname público para SSH, seleccionar SSH como Type e apontar para localhost:22 (ou o porto SSH do servidor).

Configuração no cliente (origem)

# Editar ~/.ssh/config para configurar o proxy via cloudflared
Host ssh.empresa.pt
ProxyCommand cloudflared access ssh –hostname %h
User admin
IdentityFile ~/.ssh/id_rsa
# Ligar ao servidor via SSH através do túnel — igual ao SSH normal
ssh [email protected]

# Na primeira ligação, o cloudflared abre o browser para autenticação
# (se o acesso estiver protegido com Cloudflare Access/Zero Trust)
# Após autenticação, o terminal SSH abre normalmente

10. Segurança e Boas Práticas

O Cloudflare Tunnel elimina a exposição directa do IP, mas não substitui boas práticas de segurança nas aplicações expostas. Estas medidas adicionais são recomendadas:

Medida Como implementar
Cloudflare Access (Zero Trust) Adicionar uma política de acesso em Zero Trust → Access → Applications — requer autenticação (Google, GitHub, OTP) antes de aceder ao serviço. Gratuito para até 50 utilizadores.
WAF e regras de firewall No dashboard Cloudflare: Security → WAF → activar regras geridas. Bloquear países ou IPs desnecessários em Security → Firewall Rules.
Não expor painéis de administração desnecessários Expor apenas o que é necessário. Um painel de monitorização ou Portainer acessível externamente deve sempre ter autenticação forte na própria aplicação + Cloudflare Access.
Manter o cloudflared actualizado A Cloudflare suporta versões do cloudflared até 1 ano após o lançamento. Actualizar regularmente: sudo apt upgrade cloudflared ou docker pull cloudflare/cloudflared:latest.
Token do túnel em variável de ambiente Nunca commitar o token do túnel em código ou ficheiros de configuração versionados. Guardar em variável de ambiente ou secret manager.

11. Resolução de Problemas Comuns

Problema Causa provável Solução
Túnel aparece como “Unhealthy” no dashboard O serviço cloudflared não está a correr ou perdeu conectividade sudo systemctl restart cloudflared; verificar logs com journalctl -u cloudflared -f
Erro 502 Bad Gateway ao aceder ao serviço O serviço interno não está a correr ou o endereço IP:porta está errado Verificar se o serviço está activo e acessível localmente: curl http://localhost:PORTA
Erro de certificado SSL no browser Serviço interno com HTTPS e certificado auto-assinado sem “No TLS Verify” activo No dashboard: editar o hostname → Additional settings → TLS → activar “No TLS Verify”
cloudflared não consegue ligar à Cloudflare Firewall a bloquear a porta 7844 (QUIC) e 443 (fallback) Verificar que o servidor tem acesso outbound nas portas 443 e 7844; cloudflared tunnel info
Loop de redirect ou página em branco Aplicação interna a redirigir para HTTPS quando o cloudflared está a usar HTTP Mudar o Type do hostname de HTTP para HTTPS; ou desactivar o redirect HTTPS na aplicação interna
# Comandos úteis para diagnóstico do cloudflared

# Ver informação do túnel activo
cloudflared tunnel info

# Listar todos os túneis da conta
cloudflared tunnel list

# Ver logs em tempo real (Linux)
sudo journalctl -u cloudflared -f

# Testar ligação à rede Cloudflare
Test-NetConnection -ComputerName “region1.v2.argotunnel.com” -Port 7844 # PowerShell
nc -zv region1.v2.argotunnel.com 7844 # Linux

# Verificar versão instalada e disponibilidade de update
cloudflared –version
cloudflared update

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário