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)
Neste artigo
- Como funciona o Cloudflare Tunnel
- Pré-requisitos
- Criar o túnel no dashboard Cloudflare
- Instalar o cloudflared em Linux
- Instalar o cloudflared em Windows
- Instalar o cloudflared com Docker
- Configurar hostnames públicos — mapear serviços
- Correr o cloudflared como serviço do sistema
- Acesso SSH através do túnel
- Segurança e boas práticas
- Resolução de problemas comuns
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
- Aceder a one.dash.cloudflare.com e iniciar sessão
- No menu esquerdo: Networks → Tunnels
- Clicar em Create a Tunnel
- Seleccionar Cloudflared como tipo de conector
- Dar um nome descritivo ao túnel (ex: servidor-empresa ou homelab-prod)
- Clicar em Save Tunnel
- A página seguinte mostra o comando de instalação do
cloudflaredcom 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
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
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)
# 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
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.
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
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
- No dashboard: Networks → Tunnels → [nome do túnel] → Configure
- Separador Public Hostname → clicar Add a public hostname
- 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.
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)
Host ssh.empresa.pt
ProxyCommand cloudflared access ssh –hostname %h
User admin
IdentityFile ~/.ssh/id_rsa
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 |
# 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
Artigos relacionados no kbase.pt
