---
title: "Cloudflare Tunnel na VPS: publique apps sem abrir portas"
description: "Instale o cloudflared na VPS, crie o túnel pelo painel ou pela CLI, publique apps com HTTPS, feche as portas 80 e 443 e proteja painéis e SSH com Access."
url: "https://streethosting.com.br/guias/vps/cloudflare-tunnel-vps"
category: "vps"
slug: "cloudflare-tunnel-vps"
datePublished: "2026-09-28"
dateModified: "2026-09-28"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "cloudflare tunnel vps"
  - "cloudflared ubuntu"
  - "cloudflare tunnel config yml ingress"
  - "esconder ip da vps"
  - "cloudflare access ssh"
---

# Como publicar aplicações da VPS pelo Cloudflare Tunnel e fechar as portas web

Com o Cloudflare Tunnel, a VPS abre uma conexão de saída até a Cloudflare e os visitantes chegam por ela, sem porta 80 ou 443 aberta e sem o IP no DNS. Veja a instalação, as duas formas de criar o túnel e o que ele não resolve.

> **Resposta rápida**
>
> O **Cloudflare Tunnel na VPS** funciona assim: o cloudflared abre uma conexão de saída até a Cloudflare, e os visitantes do seu domínio chegam por ela. Você instala o cloudflared, cria o túnel pelo painel com um token ou pela CLI com um config.yml, aponta cada subdomínio para um serviço local e, depois de testar, fecha as portas 80 e 443 no firewall. Painéis e SSH ganham login pelo Cloudflare Access. O túnel serve para HTTP e HTTPS; servidor de jogo público em UDP continua dependendo do AntiDDoS do provedor.

## Como o túnel funciona

Numa VPS comum, o registro A do domínio aponta para o IP da máquina, e o Nginx escuta nas portas 80 e 443 à espera dos visitantes. Com o túnel, o caminho se inverte. O cloudflared roda na VPS e mantém conexões de saída com a rede da Cloudflare na porta 7844. O DNS do subdomínio vira um CNAME para o endereço do túnel, com proxy ativo, e quem acessa o site fala com a Cloudflare, que entrega a requisição pelo túnel ao serviço local.

Como a conexão parte da VPS, nenhuma porta de entrada precisa ficar aberta. Pelo mesmo motivo o túnel funciona em máquinas sem IP público, como um servidor em casa atrás de [CGNAT](https://streethosting.com.br/guias/infraestrutura/o-que-e-cgnat-servidor). Numa VPS o ganho é outro: tirar o IP do DNS e reduzir o que fica exposto.

| Aspecto | Nginx exposto direto | Cloudflare Tunnel |
| --- | --- | --- |
| Portas de entrada abertas | 80 e 443 | Nenhuma para a web |
| IP da VPS no DNS | Sim, no registro A | Não, CNAME para o túnel |
| Certificado público | Let's Encrypt na VPS | Na borda da Cloudflare |
| Protocolos para o público | Qualquer um | HTTP e HTTPS |
| Dependência externa | Nenhuma | Conta Cloudflare e cloudflared no ar |
| Requisito de DNS | Qualquer provedor | Domínio com nameservers da Cloudflare |

## Instalar o cloudflared

O requisito é ter o domínio adicionado a uma conta Cloudflare, com os nameservers apontando para ela. Na VPS com Ubuntu 24.04 ou 22.04, instale o cloudflared pelo repositório oficial, que mantém o pacote atualizado junto com o resto do sistema:

```
sudo mkdir -p --mode=0755 /usr/share/keyrings
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-get update && sudo apt-get install cloudflared
cloudflared --version
```

Antes de criar o túnel, confirme que a aplicação responde localmente. Se ela roda na porta 3000, `curl -I http://localhost:3000` precisa devolver um cabeçalho HTTP. Túnel apontando para serviço parado resulta em erro 502 na borda, e o problema parece ser da Cloudflare quando não é.

## Opção 1: túnel pelo painel com token

É o caminho mais rápido. O menu já mudou de lugar algumas vezes: hoje os túneis ficam em Networking, Tunnels no painel da Cloudflare, e em versões anteriores apareciam dentro do Zero Trust, em Networks.

1. Crie um túnel do tipo Cloudflared e dê um nome, como `minha-vps`.
2. Escolha Debian como sistema. O painel mostra um comando de instalação com um token longo que começa com eyJ.
3. Como o cloudflared já está instalado, rode só a parte final na VPS: `sudo cloudflared service install SEU_TOKEN`. O serviço systemd é criado e iniciado.
4. No painel, adicione uma rota de aplicação publicada, chamada de Public Hostname nas versões antigas: subdomínio app, domínio `seu-dominio.com.br`, tipo HTTP e URL localhost:3000.
5. O painel cria sozinho o CNAME no DNS. Abra o endereço no navegador e confira.

> **Atenção**
>
> O token é a credencial do túnel: qualquer pessoa com ele consegue rodar o seu túnel em outra máquina e receber o seu tráfego. Não cole em repositório nem em chat. Se vazar, gere um token novo no painel e reinstale o serviço com ele.

## Opção 2: túnel pela CLI com config.yml

Pela linha de comando, as rotas ficam num arquivo na própria VPS. É a melhor opção quando você quer versionar a configuração ou recriar o servidor do zero com o mesmo resultado.

```
cloudflared tunnel login                  # mostra uma URL; abra no seu navegador e escolha o domínio
cloudflared tunnel create minha-vps       # gera o UUID e o arquivo de credenciais em ~/.cloudflared
cloudflared tunnel list
cloudflared tunnel route dns minha-vps app.seu-dominio.com.br
cloudflared tunnel route dns minha-vps painel.seu-dominio.com.br
cloudflared tunnel route dns minha-vps ssh.seu-dominio.com.br
```

Se já existir um registro A com o mesmo nome, o route dns falha dizendo que o registro existe. Apague o registro antigo no painel de DNS e rode de novo. Depois, deixe credenciais e configuração em `/etc/cloudflared`, que é onde o serviço procura:

```
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/UUID_DO_TUNEL.json /etc/cloudflared/
sudo nano /etc/cloudflared/config.yml
```

```
tunnel: UUID_DO_TUNEL
credentials-file: /etc/cloudflared/UUID_DO_TUNEL.json

ingress:
  - hostname: app.seu-dominio.com.br
    service: http://localhost:3000
  - hostname: painel.seu-dominio.com.br
    service: http://localhost:9000
  - hostname: ssh.seu-dominio.com.br
    service: ssh://localhost:22
  - service: http_status:404
```

As regras são lidas de cima para baixo e a última, sem hostname, é obrigatória: ela responde 404 para qualquer nome que não bateu com as anteriores. Valide, teste em primeiro plano e só então instale o serviço:

```
sudo cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate
sudo cloudflared tunnel --config /etc/cloudflared/config.yml ingress rule https://app.seu-dominio.com.br
sudo cloudflared tunnel --config /etc/cloudflared/config.yml run     # Ctrl+C para parar

sudo cloudflared --config /etc/cloudflared/config.yml service install
sudo systemctl start cloudflared
sudo systemctl status cloudflared
```

> **Dica**
>
> A partir daí, o arquivo que vale é o de /etc/cloudflared. Depois de qualquer edição, rode `sudo systemctl restart cloudflared` e acompanhe com `journalctl -u cloudflared -f`.

## Fechar as portas 80 e 443

O túnel só entrega o benefício completo quando a VPS para de aceitar tráfego web direto. Senão, quem descobrir o IP continua acessando o site sem passar pela Cloudflare. Faça nesta ordem, com o site já funcionando pelo túnel.

### Serviços escutando só em localhost

Cada aplicação deve escutar em 127.0.0.1, e não em 0.0.0.0. No Docker, publique a porta presa ao localhost, porque portas publicadas pelo Docker passam por fora das regras do UFW. Confira o resultado com o ss:

```
# docker compose: ports com o localhost na frente
ports:
  - "127.0.0.1:3000:3000"

# o que está escutando e em qual endereço
sudo ss -tlnp
```

Se você mantém o Nginx entre o túnel e as aplicações, como no guia de [Nginx como reverse proxy](https://streethosting.com.br/guias/vps/configurar-nginx-reverse-proxy-vps), dois ajustes evitam dor de cabeça. Primeiro, remova o redirecionamento de HTTP para HTTPS do bloco que o túnel usa: o visitante já está em HTTPS na borda, e o redirecionamento gera o erro de redirecionamentos demais. Segundo, recupere o IP real do visitante, que chega no cabeçalho `CF-Connecting-IP`, senão todo acesso aparece no log como 127.0.0.1:

```
# dentro do bloco http ou server do Nginx
set_real_ip_from 127.0.0.1;
real_ip_header CF-Connecting-IP;
```

### Removendo as regras no UFW

```
sudo ufw status numbered
sudo ufw delete 3        # use o número da regra de 80, 443 ou Nginx Full
sudo ufw status numbered # confira de novo, os números mudam após cada delete
```

O cloudflared não precisa de regra nova, porque o UFW libera saída por padrão. A lógica de default deny está explicada no guia de [firewall UFW na VPS](https://streethosting.com.br/guias/vps/firewall-ufw-vps-ubuntu).

> **Atenção**
>
> Fechar a porta não apaga o passado. Se o IP esteve num registro A por meses, ele pode estar em bases de histórico de DNS. Revise também o MX e subdomínios esquecidos que ainda apontam direto para a VPS.

## Access para painéis e SSH

O túnel publica o painel, mas não decide quem entra. Para isso existe o Cloudflare Access, que coloca uma tela de login da Cloudflare na frente do subdomínio antes de qualquer requisição chegar à VPS. No Zero Trust, em Access, crie uma aplicação do tipo self hosted para `painel.seu-dominio.com.br` e uma política Allow com os emails autorizados. O login padrão envia um código por email, e dá para conectar Google ou GitHub como provedor de identidade. O plano gratuito atende equipes pequenas; confira o limite de usuários na página de planos da Cloudflare.

Para o SSH, a rota ssh://localhost:22 do config.yml já está pronta. No seu computador, instale o cloudflared e acrescente ao arquivo `~/.ssh/config`:

```
Host ssh.seu-dominio.com.br
  ProxyCommand cloudflared access ssh --hostname %h

# depois é só conectar como sempre
ssh usuario@ssh.seu-dominio.com.br
```

No Windows, troque cloudflared pelo caminho completo do cloudflared.exe. Com uma aplicação do Access para `ssh.seu-dominio.com.br`, o navegador pede login na primeira conexão.

> **Atenção**
>
> Só feche a porta 22 no UFW depois de entrar pelo túnel numa segunda sessão, e com o console do painel da VPS testado. Se o cloudflared parar, o SSH pelo túnel para junto. Um meio termo seguro é manter a 22 liberada apenas para o IP fixo do escritório, ou usar uma [VPN com WireGuard](https://streethosting.com.br/guias/vps/proteger-vps-wireguard-vpn) como caminho alternativo.

## O que o túnel não resolve

O túnel é excelente para web e ruim para quase todo o resto quando o público é aberto. SSH, RDP e TCP genérico funcionam, mas só com o cloudflared rodando no computador de quem conecta, o que serve para a sua equipe e não para visitantes.

| Uso | Funciona pelo túnel? | Observação |
| --- | --- | --- |
| Site, API, painel web, WebSocket | Sim | Caso de uso principal |
| SSH e RDP da equipe | Sim, com cloudflared no cliente | Proteja com Access |
| Banco de dados remoto | Sim, com cloudflared access tcp | Para uso interno; o ideal é não expor |
| Servidor de jogo público em UDP | Não | Jogador não instala cloudflared; depende do AntiDDoS do provedor |
| Email de entrada na porta 25 | Não | Servidores de email de fora conectam direto no IP |
| Upload muito grande | Com limite | O corpo da requisição segue o limite do plano da Cloudflare |

O limite de upload merece atenção: no plano gratuito, cada requisição aceita hoje até 100 MB, então sistemas que recebem arquivos grandes precisam de upload em partes ou de outro caminho. E o túnel não substitui atualização de sistema, senha forte e aplicação segura: ele esconde a porta, não corrige a vulnerabilidade de quem está atrás dela. Os limites da Cloudflare para jogos estão detalhados em [Cloudflare e proteção de servidor de jogos](https://streethosting.com.br/guias/infraestrutura/cloudflare-protecao-servidor-jogos).

## Qual VPS usar com o túnel

O cloudflared é leve: costuma ocupar poucas dezenas de MB de memória e quase nenhuma CPU. O dimensionamento da VPS continua sendo o das aplicações que ficam atrás dele. E o túnel não dispensa a proteção de rede do servidor: tudo que não passa por ele, como a porta de um jogo, continua chegando pelo IP. Nas [VPS da StreetHosting](https://streethosting.com.br/vps) o AntiDDoS está incluso, com datacenter em São Paulo, acesso root e ativação em até 60 segundos.

- **Um site ou painel pequeno:** [VPS Xeon](https://streethosting.com.br/vps/xeon) de R$ 23,00 por mês, com 2 vCPU, 2 GB de RAM e 20 GB NVMe.
- **Docker com algumas aplicações e banco:** VPS Xeon de R$ 40,00, com 3 vCPU, 4 GB e 40 GB NVMe, ou de R$ 74,00, com 6 vCPU, 8 GB e 80 GB.
- **Aplicação sensível a clock, como renderização no servidor:** VPS Ryzen 9 9950X com DDR5, de R$ 64,00 com 2 vCPU e 4 GB, ou R$ 114,00 com 4 vCPU e 8 GB.

<!-- -->

- [ ] Aplicação respondendo em localhost antes de criar o túnel
- [ ] Rotas testadas no navegador e com ingress rule
- [ ] Serviços escutando em 127.0.0.1 e portas do Docker presas ao localhost
- [ ] Regras de 80 e 443 removidas do UFW
- [ ] Registros A antigos e subdomínios esquecidos revisados
- [ ] Painel e SSH atrás do Access, com o console da VPS testado

## Perguntas frequentes

### Cloudflare Tunnel esconde o IP da minha VPS?

Esconde para o tráfego web que passa pelo túnel, porque o DNS aponta para a Cloudflare e não para o seu IP. O endereço ainda pode vazar por registros antigos, pelo MX de email ou por outros serviços expostos, então feche as portas web no firewall e revise o DNS depois de migrar.

### Preciso abrir alguma porta na VPS para o túnel funcionar?

Não precisa abrir porta de entrada. O cloudflared faz conexões de saída até a Cloudflare na porta 7844, por QUIC em UDP ou HTTP/2 em TCP. Como o UFW libera saída por padrão, normalmente nada precisa ser mudado no firewall.

### Dá para usar Cloudflare Tunnel com servidor de Minecraft ou outro jogo?

Não para o público. O túnel publica HTTP e HTTPS para qualquer visitante, mas SSH, RDP e TCP genérico só funcionam com o cloudflared instalado no computador de quem conecta, e jogadores não fazem isso. Servidor de jogo público depende da proteção AntiDDoS do provedor.

### É melhor criar o túnel pelo painel ou pela linha de comando?

Pelo painel é mais rápido: um token instala o serviço e as rotas ficam na conta da Cloudflare. Pela linha de comando, as rotas ficam num config.yml na VPS, que você pode versionar junto com o resto da configuração do servidor.

### Ainda preciso de Nginx e Let's Encrypt usando o túnel?

Não obrigatoriamente. O certificado público fica na borda da Cloudflare e o trecho até a VPS já viaja cifrado dentro do túnel. O Nginx continua útil quando você quer vários sites, cache local ou regras de proxy, mas ele passa a escutar só em localhost.

## Guias relacionados

- [Cloudflare e proteção de servidor de jogos: o que funciona](https://streethosting.com.br/guias/infraestrutura/cloudflare-protecao-servidor-jogos.md)
- [Como configurar o Nginx como reverse proxy na VPS](https://streethosting.com.br/guias/vps/configurar-nginx-reverse-proxy-vps.md)
- [UFW na VPS Ubuntu: regras de firewall sem perder o SSH](https://streethosting.com.br/guias/vps/firewall-ufw-vps-ubuntu.md)
- [Como criar uma VPN com WireGuard na VPS para acesso privado](https://streethosting.com.br/guias/vps/proteger-vps-wireguard-vpn.md)
- [O que é CGNAT e por que ele bloqueia seu servidor](https://streethosting.com.br/guias/infraestrutura/o-que-e-cgnat-servidor.md)

## Produtos citados

- https://streethosting.com.br/vps
- https://streethosting.com.br/vps/xeon

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Como publicar aplicações da VPS pelo Cloudflare Tunnel e fechar as portas web",
    "name": "Cloudflare Tunnel na VPS: publique apps sem abrir portas",
    "abstract": "Com o Cloudflare Tunnel, a VPS abre uma conexão de saída até a Cloudflare e os visitantes chegam por ela, sem porta 80 ou 443 aberta e sem o IP no DNS. Veja a instalação, as duas formas de criar o túnel e o que ele não resolve.",
    "description": "Instale o cloudflared na VPS, crie o túnel pelo painel ou pela CLI, publique apps com HTTPS, feche as portas 80 e 443 e proteja painéis e SSH com Access.",
    "datePublished": "2026-09-28",
    "dateModified": "2026-09-28",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/vps/cloudflare-tunnel-vps"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Cloudflare Tunnel esconde o IP da minha VPS?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Esconde para o tráfego web que passa pelo túnel, porque o DNS aponta para a Cloudflare e não para o seu IP. O endereço ainda pode vazar por registros antigos, pelo MX de email ou por outros serviços expostos, então feche as portas web no firewall e revise o DNS depois de migrar."
        }
      },
      {
        "@type": "Question",
        "name": "Preciso abrir alguma porta na VPS para o túnel funcionar?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não precisa abrir porta de entrada. O cloudflared faz conexões de saída até a Cloudflare na porta 7844, por QUIC em UDP ou HTTP/2 em TCP. Como o UFW libera saída por padrão, normalmente nada precisa ser mudado no firewall."
        }
      },
      {
        "@type": "Question",
        "name": "Dá para usar Cloudflare Tunnel com servidor de Minecraft ou outro jogo?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não para o público. O túnel publica HTTP e HTTPS para qualquer visitante, mas SSH, RDP e TCP genérico só funcionam com o cloudflared instalado no computador de quem conecta, e jogadores não fazem isso. Servidor de jogo público depende da proteção AntiDDoS do provedor."
        }
      },
      {
        "@type": "Question",
        "name": "É melhor criar o túnel pelo painel ou pela linha de comando?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Pelo painel é mais rápido: um token instala o serviço e as rotas ficam na conta da Cloudflare. Pela linha de comando, as rotas ficam num config.yml na VPS, que você pode versionar junto com o resto da configuração do servidor."
        }
      },
      {
        "@type": "Question",
        "name": "Ainda preciso de Nginx e Let's Encrypt usando o túnel?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não obrigatoriamente. O certificado público fica na borda da Cloudflare e o trecho até a VPS já viaja cifrado dentro do túnel. O Nginx continua útil quando você quer vários sites, cache local ou regras de proxy, mas ele passa a escutar só em localhost."
        }
      }
    ]
  }
]
```
