Tutorials

Tutorial Cloudflare Tunnel: Aplikasi Lokal ke Internet

M
MUGHU
36 menit baca
Tutorial Cloudflare Tunnel: Aplikasi Lokal ke Internet
Daftar isi

Pernahkah kamu ingin menampilkan aplikasi yang berjalan di laptop ke internet, tapi terhenti karena ribetnya konfigurasi port forwarding, IP publik, atau firewall? Nah, di sinilah Cloudflare Tunnel jadi penyelamat. Bayangkan kamu punya aplikasi React jalan di localhost:3000, dan kamu ingin klien di Jakarta bisa langsung akses lewat https://app.domainkamu.com — tanpa beli VPS, tanpa buka port router, tanpa expose IP rumah. Itulah inti dari Cloudflare Tunnel: sebuah koneksi outbound terenkripsi yang menghubungkan infrastruktur lokal kamu ke jaringan global Cloudflare, dengan otomatis dapat SSL, DDoS protection, dan CDN.

Dalam tutorial ini, MUGHU akan ajak Teman-Teman melalui proses lengkap — dari instalasi, konfigurasi, sampai menjalankan tunnel sebagai service yang persisten. Kita akan bahas juga skenario lanjutan seperti wildcard hostname, multiple services, SSH access, dan perbandingan dengan alternatif seperti Tailscale. Semua disertai penjelasan kenapa setiap step penting, bukan sekadar "ketik ini, lalu itu".


Apa Itu Cloudflare Tunnel dan Kenapa Kamu Perlu Peduli

Cloudflare Tunnel (dulu dikenal sebagai Argo Tunnel) adalah solusi reverse connectivity dari Cloudflare. Cara kerjanya berbeda dari hosting tradisional. Alih-alih membuka port inbound di server kamu dan biarkan traffic internet langsung menghantam server, cloudflared — sebuah daemon ringan — justru menghubungkan diri keluar menuju jaringan Cloudflare.

Cloudflare Tunnel menghubungkan infrastruktur kamu ke Cloudflare melalui koneksi outbound-only yang terenkripsi dengan post-quantum cryptography. Tidak perlu IP publik, tidak perlu buka port inbound.

Alurnya kira-kira kayak gini:

CODE
[Pengguna Internet] → [Cloudflare Edge] → [cloudflared di server kamu] → [Aplikasi lokal]

Semua traffic melewati Cloudflare dulu, jadi kamu otomatis dapat:

  • SSL/TLS otomatis — tidak perlu urus Let's Encrypt manual

  • DDoS protection bawaan dari Cloudflare

  • WAF dan Bot Management tersedia

  • IP origin tersembunyi — server kamu tidak bisa di-scan langsung dari internet

  • Tidak perlu port forwarding di router

Saya pertama kali pakai Cloudflare Tunnel pas mau share dashboard monitoring ke tim yang kerja remote. Dulu saya selalu pakai ngrok, tapi versi gratisnya domainnya berubah-ubah tiap restart. Cloudflare Tunnel gratis untuk pakai personal, dan domainnya tetap karena pakai domain sendiri. Beda jauh.


Sebelum Mulai: Apa Saja yang Perlu Disiapkan

Sebelum kita masuk ke teknis, pastikan hal-hal berikut sudah siap ya, Teman-Teman:

  • Akun Cloudflare — daftar gratis di cloudflare.com

  • Domain yang sudah dikelola Cloudflare — artinya nameserver domain kamu sudah diarahkan ke Cloudflare. Kalau belum, kamu perlu ubah nameserver di registrar domain kamu (misal Namecheap, GoDaddy, atau Niagahoster)

  • Server atau komputer yang selalu aktif — bisa laptop, Raspberry Pi, VPS, atau server rumah. Yang penting punya koneksi internet dan bisa jalan cloudflared

  • Aplikasi lokal yang berjalan — misal React dev server di port 3000, Express API di port 8080, atau Home Assistant di port 8123

  • Akses terminal/command line — kita akan banyak ketik command, jadi siapkan terminal yang nyaman

Kalau kamu belum punya domain, tenang — kita bisa pakai Quick Tunnel dulu untuk testing tanpa domain sendiri. Tapi untuk production, domain sendiri sangat disarankan.


Cara Kerja Cloudflare Tunnel: Konsep yang Perlu Dipahami

Sebelum loncat ke instalasi, saya mau jelaskan beberapa konsep penting biar kamu nggak bingung nanti.

Tunnel

Tunnel adalah objek persisten yang diidentifikasi dengan UUID. Anggap saja ini seperti "pipa" yang menghubungkan server kamu ke Cloudflare. Satu tunnel bisa menjalankan banyak cloudflared process (disebut connector) sekaligus. Setiap connector mengirim traffic ke Cloudflare data center terdekat, jadi kalau satu connector mati, yang lain bisa ambil alih.

Ingress Rules

Ingress rules adalah aturan routing di dalam tunnel. Di sinilah kamu mendefinisikan: "kalau ada request ke app.domainkamu.com, teruskan ke http://localhost:3000". Anggap kayak meja resepsionis — setiap tamu yang datang diarahkan ke ruangan yang sesuai.

Credentials File

Saat kamu buat tunnel, Cloudflare menghasilkan file credentials berformat JSON yang berisi UUID tunnel dan secret key. File ini wajib ada karena cloudflared pakai itu untuk autentikasi ke Cloudflare. Kalau file ini hilang, tunnel nggak bisa jalan.

Outbound-Only Connection

Ini kunci utama kenapa Cloudflare Tunnel aman. cloudflared hanya butuh koneksi keluar ke Cloudflare di port 7844. Kebanyakan firewall default-nya mengizinkan outbound traffic, jadi kamu nggak perlu konfigurasi firewall khusus. Tidak ada port inbound yang dibuka, yang berarti server kamu praktis tidak terlihat dari internet.


Step 1: Install cloudflared di Server Kamu

cloudflared adalah daemon yang akan jadi jembatan antara server kamu dan Cloudflare. Instalasinya berbeda tergantung sistem operasi. Kita bahas satu-satu.

macOS (via Homebrew)

Homebrew Package Manager Ends Support for macOS 12

BASH
brew install cloudflare/cloudflare/cloudflared

Verifikasi instalasi:

BASH
cloudflared --version

Output yang diharapkan:

CODE
cloudflared version 2025.10.0

Linux (Debian/Ubuntu)

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

Linux (RHEL/CentOS)

BASH
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -i cloudflared-linux-x86_64.rpm

Windows

Download file .exe dari halaman releases GitHub cloudflared, lalu taruh di direktori yang ada di PATH, misal C:\Windows\System32.

Verifikasi:

POWERSHELL
cloudflared.exe --version

Docker (Alternatif Cross-Platform)

Kalau kamu lebih suka Docker, ini cara paling gampang dan konsisten lintas platform:

BASH
docker run -d --name cloudflared cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TUNNEL_TOKEN>

Kenapa saya merekomendasikan Docker? Karena nggak peduli kamu jalan di Ubuntu, Debian, atau Raspberry Pi OS, command-nya sama persis. Tinggal ganti token saja.


Step 2: Autentikasi cloudflared dengan Akun Cloudflare

Setelah cloudflared terpasang, langkah berikutnya adalah autentikasi.

BASH
cloudflared tunnel login

Command ini otomatis membuka browser. Login ke akun Cloudflare kamu, lalu pilih domain yang mau dipakai bersama tunnel ini.

Kenapa step ini penting? Karena tanpa autentikasi, cloudflared nggak tahu akun Cloudflare mana yang harus dituju. Proses ini menghasilkan file cert.pem di direktori ~/.cloudflared/ yang berisi sertifikat untuk mengelola tunnel di domain kamu.

Output yang diharapkan di terminal:

CODE
You've successfully logged in.
If you wish to copy your credentials to a server, they are stored in:
/Users/kamu/.cloudflared/cert.pem

Kalau browser tidak otomatis terbuka, terminal akan menampilkan URL yang bisa kamu copy-paste manual ke browser.


Step 3: Buat Tunnel Baru

Sekarang saatnya bikin tunnel-nya.

BASH
cloudflared tunnel create tunnel-saya

Ganti tunnel-saya dengan nama yang deskriptif. Misal homelab, dev-server, atau blog-tunnel. Nama ini cuma buat kamu, bukan domain publik.

Output yang diharapkan:

CODE
Tunnel credentials written to /Users/kamu/.cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json
Created tunnel tunnel-saya with id a7b3c4d5-e6f7-8901-2345-6789abcdef01

Catat UUID tunnel ini — kamu akan butuh di step konfigurasi. File credentials JSON juga wajib dijaga keamanannya. Jangan commit ke Git repo publik atau share di group chat.

Cek apakah tunnel berhasil dibuat:

BASH
cloudflared tunnel list

Output:

CODE
ID                                   NAME         CREATED              CONNECTIONS
a7b3c4d5-e6f7-8901-2345-6789abcdef01 tunnel-saya  2026-07-13 09:00:00 0

Kolom CONNECTIONS masih 0 karena tunnel belum dijalankan. Itu normal.


Step 4: Buat File Konfigurasi config.yml

Di sinilah kamu mendefinisikan cara traffic dialihkan. Buat file ~/.cloudflared/config.yml:

YAML
tunnel: a7b3c4d5-e6f7-8901-2345-6789abcdef01
credentials-file: /Users/kamu/.cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json

ingress:
  - hostname: app.domainkamu.com
    service: http://localhost:3000
  - service: http_status:404

Ganti:

  • a7b3c4d5-... dengan UUID tunnel kamu

  • Path credentials-file dengan lokasi file JSON kamu

  • app.domainkamu.com dengan subdomain yang kamu mau

  • localhost:3000 dengan port aplikasi lokal kamu

Kenapa ada baris terakhir - service: http_status:404? Ini adalah catch-all rule yang wajib ada. Tanpa ini, request ke hostname yang tidak terdaftar akan error atau malah diteruskan ke service yang salah. Cloudflare secara eksplisitit mensyaratkan setiap config file punya catch-all rule di akhir.

Validasi konfigurasi:

BASH
cloudflared tunnel ingress validate

Output yang diharapkan:

CODE
Validating rules from /Users/kamu/.cloudflared/config.yml
OK

Kalau ada error, terminal akan kasih tahu baris mana yang bermasalah. Periksa indentasi YAML — YAML sensitif terhadap spasi.


Step 5: Konfigurasi DNS Record

Sekarang kita perlu hubungkan domain ke tunnel. Ada dua cara: via CLI atau via dashboard Cloudflare.

Via CLI (Lebih Cepat)

BASH
cloudflared tunnel route dns tunnel-saya app.domainkamu.com

Output:

CODE
Created CNAME route for app.domainkamu.com

Command ini otomatis bikin CNAME record di DNS Cloudflare yang mengarah ke <TUNNEL_ID>.cfargotunnel.com.

Via Dashboard Cloudflare

  1. Login ke dashboard Cloudflare

  2. Pilih domain kamu

  3. Klik DNS di sidebar

  4. Tambah record:

    • Type: CNAME

    • Name: app

    • Target: a7b3c4d5-e6f7-8901-2345-6789abcdef01.cfargotunnel.com

    • Proxy status: Proxied (orange cloud)

Kenapa DNS penting? Karena tanpa CNAME record, ketika seseorang mengakses app.domainkamu.com, browser mereka tidak tahu harus mengarah ke mana. CNAME record inilah yang memberitahu DNS global: "arahkan traffic ini ke tunnel Cloudflare".


Step 6: Jalankan Tunnel

Saatnya menyalakan mesinnya:

BASH
cloudflared tunnel run tunnel-saya

Output yang diharapkan:

CODE
2026-07-13T09:30:15Z INF Starting tunnel tunnelID=a7b3c4d5-e6f7-8901-2345-6789abcdef01
2026-07-13T09:30:16Z INF Connection registered connIndex=0 location=SIN
2026-07-13T09:30:17Z INF Connection registered connIndex=1 location=HKG
2026-07-13T09:30:18Z INF Connection registered connIndex=2 location=CGK
2026-07-13T09:30:19Z INF Connection registered connIndex=3 location=BKK

Kalau kamu lihat empat Connection registered, selamat! Tunnel kamu sudah aktif dan terhubung ke empat Cloudflare data center. Lokasi seperti SIN (Singapore), HKG (Hong Kong), CGK (Jakarta), atau BKK (Bangkok) tergantung lokasi geografis server kamu.

Sekarang coba akses https://app.domainkamu.com di browser. Aplikasi lokal kamu sudah live di internet dengan HTTPS otomatis!

Tapi tunggu — terminal ini harus tetap terbuka. Kalau kamu tutup, tunnel mati. Di step lanjutan kita akan bahas cara bikin service yang persisten.


Quick Tunnel: Testing Tanpa Domain

Sebelum kita masuk lebih dalam, MUGHU mau kasih tahu trik buat testing cepat. Kalau kamu belum punya domain atau cuma mau coba-coba, Cloudflare punya fitur Quick Tunnel:

BASH
cloudflared tunnel --url http://localhost:3000

Output:

CODE
Your quick Tunnel has been created! Visit it at:
https://random-kata-angka.trycloudflare.com

Cloudflare akan generate subdomain acak di trycloudflare.com. Cocok untuk:

  • Demo cepat ke klien

  • Debug webhook dari Stripe, GitHub, atau Twilio

  • Share progress sementara ke rekan tim

Tapi ingat, Quick Tunnel nggak untuk production. Domainnya berubah tiap kali kamu restart, ada batas concurrent request, dan beberapa fitur long-lived connection nggak didukung.


Step 7: Menjalankan Tunnel sebagai Service Persisten

Nah, ini bagian yang penting. Kamu nggak mau kan terminal terbuka 24/7? Mari kita bikin tunnel jalan otomatis sebagai system service.

Linux (systemd)

BASH
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

Cek status:

BASH
sudo systemctl status cloudflared

Output yang diharapkan:

CODE
● cloudflared.service - cloudflared
   Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled)
   Active: active (running)

Lihat log real-time:

BASH
sudo journalctl -u cloudflared -f

macOS (launchd)

BASH
sudo cloudflared service install

Ini bikin file plist di /Library/LaunchDaemons/com.cloudflare.cloudflared.plist. Tapi ada satu masalah yang sering muncul: file plist yang di-generate kadang nggak menyertakan argumen tunnel run, jadi service jalan tapi tunnel nggak aktif.

Cek dan edit file plist:

BASH
sudo nano /Library/LaunchDaemons/com.cloudflare.cloudflared.plist

Cari bagian <array> di dalam ProgramArguments. Pastikan ada:

XML
<array>
    <string>/usr/local/bin/cloudflared</string>
    <string>tunnel</string>
    <string>run</string>
</array>

Kalau hanya ada cloudflared tanpa tunnel dan run, tambahkan dua baris itu.

Start dan stop service:

BASH
sudo launchctl start com.cloudflare.cloudflared
sudo launchctl stop com.cloudflare.cloudflared

Windows

Jalankan sebagai Administrator:

POWERSHELL
cloudflared service install
sc start cloudflared

Docker (dengan Restart Policy)

BASH
docker run -d --name cloudflared --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TUNNEL_TOKEN>

Flag --restart unless-stopped bikin container auto-restart kalau crash atau server reboot.


Multiple Services: Satu Tunnel, Banyak Aplikasi

Salah satu keunggulan Cloudflare Tunnel adalah satu tunnel bisa handle banyak service sekaligus. Anggap satu tunnel = satu pintu masuk, tapi di dalamnya ada banyak ruangan.

Edit ~/.cloudflared/config.yml:

YAML
tunnel: a7b3c4d5-e6f7-8901-2345-6789abcdef01
credentials-file: /Users/kamu/.cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json

ingress:
  # Frontend React
  - hostname: app.domainkamu.com
    service: http://localhost:3000

  # Backend API Express
  - hostname: api.domainkamu.com
    service: http://localhost:8080

  # Database admin (pgAdmin)
  - hostname: db.domainkamu.com
    service: http://localhost:5050

  # Storybook
  - hostname: storybook.domainkamu.com
    service: http://localhost:6006

  # Catch-all (wajib)
  - service: http_status:404

Lalu tambahkan DNS record untuk setiap subdomain:

BASH
cloudflared tunnel route dns tunnel-saya app.domainkamu.com
cloudflared tunnel route dns tunnel-saya api.domainkamu.com
cloudflared tunnel route dns tunnel-saya db.domainkamu.com
cloudflared tunnel route dns tunnel-saya storybook.domainkamu.com

Restart tunnel:

BASH
sudo systemctl restart cloudflared

Sekarang kamu punya empat subdomain, semuanya melewati satu tunnel, masing-masing mengarah ke service berbeda di server lokal. Praktis banget buat development environment yang lengkap.


Wildcard Hostname: Akses Semua Subdomain Sekaligus

Kalau kamu punya banyak project dan nggak mau bikin DNS record satu-satu, wildcard adalah solusinya. Dengan wildcard, *.domainkamu.com akan otomatis diteruskan ke server lokal kamu.

Edit config.yml:

YAML
tunnel: a7b3c4d5-e6f7-8901-2345-6789abcdef01
credentials-file: /Users/kamu/.cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json

ingress:
  - hostname: "*.domainkamu.com"
    service: http://127.0.0.1:80
  - service: http_status:404

Lalu di DNS Cloudflare, tambahkan CNAME record:

  • Type: CNAME

  • Name: *

  • Target: a7b3c4d5-e6f7-8901-2345-6789abcdef01.cfargotunnel.com

Sekarang project1.domainkamu.com, project2.domainkamu.com, client-a.domainkamu.com — semuanya otomatis diteruskan ke port 80 di server kamu. Nginx atau web server lokal bisa handle routing berdasarkan server_name.

Contoh konfigurasi Nginx:

NGINX
server {
    listen 80;
    server_name project1.domainkamu.com;
    root /var/www/project1;
}

server {
    listen 80;
    server_name project2.domainkamu.com;
    root /var/www/project2;
}

Dengan begini, kamu nggak perlu update DNS atau config tunnel tiap kali bikin project baru. Cukup tambah server block di Nginx, dan subdomain baru langsung berfungsi.

Untuk wildcard bertingkat (misal *.sub.domainkamu.com), Cloudflare memerlukan Edge Certificate yang mendukung wildcard. Cek di dashboard Cloudflare > SSL/TLS > Edge Certificates.


Path-Based Routing: Satu Domain, Banyak Endpoint

Kadang kamu mau satu domain saja, tapi path berbeda mengarah ke service berbeda. Cloudflare Tunnel juga mendukung ini:

YAML
tunnel: a7b3c4d5-e6f7-8901-2345-6789abcdef01
credentials-file: /Users/kamu/.cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json

ingress:
  - hostname: domainkamu.com
    path: /api/*
    service: http://localhost:8080

  - hostname: domainkamu.com
    path: /admin/*
    service: http://localhost:5000

  - hostname: domainkamu.com
    service: http://localhost:3000

  - service: http_status:404

Hasil routing:

  • https://domainkamu.com/ → Frontend (port 3000)

  • https://domainkamu.com/api/users → API (port 8080)

  • https://domainkamu.com/admin/dashboard → Admin panel (port 5000)

Cocok untuk arsitektur microservices yang share satu domain.


SSH Access via Cloudflare Tunnel

Cloudflare Tunnel nggak cuma untuk HTTP. Kamu juga bisa expose SSH tanpa buka port 22 ke internet. Ini sangat berguna untuk server di belakang NAT atau firewall.

Tambah Hostname SSH di config.yml

YAML
ingress:
  - hostname: app.domainkamu.com
    service: http://localhost:3000
  - hostname: ssh.domainkamu.com
    service: ssh://localhost:22
  - service: http_status:404

Tambah DNS record:

BASH
cloudflared tunnel route dns tunnel-saya ssh.domainkamu.com

Konfigurasi SSH Client

Di komputer kamu (bukan server, tapi laptop yang dipakai untuk SSH), install cloudflared juga. Lalu edit ~/.ssh/config:

CODE
Host ssh.domainkamu.com
    ProxyCommand cloudflared access ssh --hostname %h

Sekarang kamu bisa SSH:

BASH
ssh [email protected]

Kenapa ini lebih aman dari buka port 22? Karena port SSH kamu nggak terbuka ke internet. Semua koneksi melewati Cloudflare, dan kamu bisa tambah access policy untuk membatasi siapa saja yang boleh SSH.


Setup via Dashboard Cloudflare (Tanpa Config File)

Kalau kamu kurang suka edit YAML manual, Cloudflare menyediakan UI berbasis web untuk konfigurasi tunnel. Ini cara yang lebih ramah untuk yang baru pertama kali.

  1. Login ke Cloudflare Zero Trust Dashboard

  2. Navigasi ke Networks → Tunnels → Create Tunnel

  3. Pilih Cloudflare Tunnel dan beri nama

  4. Pilih environment (Linux, Windows, macOS, Docker)

  5. Copy command yang di-generate dan jalankan di server

  6. Tunggu sampai connector status Connected

  7. Klik Next dan tambah Public Hostname:

    • Subdomain: app

    • Domain: pilih dari dropdown

    • Type: HTTP

    • URL: localhost:3000

  8. Klik Save

Kelebihan pakai dashboard: DNS record dibuat otomatis, nggak perlu edit YAML, dan kamu bisa lihat status connector real-time. Kekurangannya: kurang fleksibel untuk konfigurasi advanced seperti path-based routing atau custom headers.


Cloudflare Tunnel vs Alternatif: Tailscale, ngrok, dan Port Forwarding

Teman-Teman mungkin bertanya: "kenapa nggak pakai Tailscale atau ngrok saja?" Jawabannya tergantung use case. Mari kita bandingkan.

Kriteria

Cloudflare Tunnel

Tailscale

ngrok

Port Forwarding

Biaya

Gratis (personal)

Gratis (personal)

Gratis (terbatas)

Gratis

Domain custom

Ya, pakai domain sendiri

Nggak (IP private)

Berbayar

Ya

SSL otomatis

Ya

Ya (mesh)

Ya

Manual (Let's Encrypt)

DDoS protection

Ya (Cloudflare)

Tidak

Tidak

Tergantung ISP

NAT traversal

Ya (outbound only)

Ya (p2p/relay)

Ya

Tidak

Buka port inbound

Tidak

Tidak

Tidak

Ya

IP publik terlihat

Tidak

Tidak

Tidak

Ya

Latency

Sedang (via Cloudflare)

Rendah (p2p)

Sedang

Rendah

Access policy

Ya (Zero Trust)

Ya (ACL)

Berbayar

Tidak

Cocok untuk

Expose web service ke publik

VPN mesh private

Testing cepat

Server dengan IP publik

Rekomendasi berdasarkan use case:

  • Mau share web app ke publik dengan domain sendiri? Cloudflare Tunnel

  • Mau akses private network antar device? Tailscale

  • Butuh URL publik cepat untuk testing webhook? ngrok atau Quick Tunnel

  • Punya VPS dengan IP publik dan mau kontrol penuh? Port forwarding + reverse proxy

Saya pribadi pakai keduanya: Cloudflare Tunnel untuk expose web service ke publik, dan Tailscale untuk akses private antar device. Mereka saling melengkapi, bukan saling menggantikan.


Studi Kasus: Home Lab dengan Cloudflare Tunnel

Mari kita lihat penerapan nyata. Saya punya setup home lab di rumah dengan beberapa service berjalan di Raspberry Pi:

  • Home Assistant di port 8123

  • Plex Media Server di port 32400

  • Pi-hole di port 80

  • Grafana di port 3000

  • SSH di port 22

Latar Belakang

Saya mau akses semua service ini dari mana saja — kantor, kafe, atau saat traveling. Tapi ISP rumah nggak kasih IP publik (CGNAT), jadi port forwarding nggak mungkin.

Tantangan

  • IP rumah di belakang CGNAT, tidak ada IP publik

  • Router ISP nggak bisa dikonfigurasi

  • Butuh HTTPS untuk setiap service

  • Mau akses dari mobile dan desktop

  • Ngga mau buka VPN tiap kali akses

Pendekatan

Saya pasang cloudflared di Raspberry Pi sebagai Docker container, buat satu tunnel, dan route semua subdomain ke service masing-masing.

Implementasi

config.yml:

YAML
tunnel: a7b3c4d5-e6f7-8901-2345-6789abcdef01
credentials-file: /etc/cloudflared/a7b3c4d5-e6f7-8901-2345-6789abcdef01.json

ingress:
  - hostname: home.domainkamu.com
    service: http://localhost:8123
  - hostname: plex.domainkamu.com
    service: http://localhost:32400
  - hostname: pihole.domainkamu.com
    service: http://localhost:80
  - hostname: grafana.domainkamu.com
    service: http://localhost:3000
  - hostname: ssh.domainkamu.com
    service: ssh://localhost:22
  - service: http_status:404

Jalankan sebagai Docker container:

BASH
docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  --network host \
  -v /etc/cloudflared:/etc/cloudflared \
  cloudflare/cloudflared:latest tunnel --no-autoupdate run tunnel-saya

Hasil

  • Semua service accessible dari mana saja dengan HTTPS otomatis

  • Tidak ada port inbound terbuka di router

  • IP rumah tersembunyi

  • Akses dari mobile app Home Assistant pakai https://home.domainkamu.com

  • SSH ke Raspberry Pi dari mana saja via ssh [email protected]

  • DDoS protection aktif untuk semua service

Setup ini sudah jalan selama 8 bulan tanpa downtime. Satu-satunya maintenance adalah update cloudflared image Docker sesekali.


Konfigurasi untuk WordPress dan Laravel

Kalau kamu pakai Cloudflare Tunnel untuk development WordPress atau Laravel, ada beberapa tweak yang perlu dilakukan.

WordPress

Edit wp-config.php:

PHP
define('WP_HOME', 'https://app.domainkamu.com');
define('WP_SITEURL', 'https://app.domainkamu.com');

Tanpa ini, WordPress akan generate URL pakai http://localhost, yang akan broken saat diakses dari internet.

Laravel

Edit .env:

ENV
APP_URL=https://app.domainkamu.com

Lalu, kalau app kamu perlu force HTTPS (karena Cloudflare terminate SSL di edge, request ke origin bisa jadi HTTP), edit AppServiceProvider:

PHP
use Illuminate\Support\Facades\URL;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        if (config('app.env') === 'local') {
            URL::forceScheme('https');
        }
    }
}

Kenapa perlu forceScheme? Karena Cloudflare menerima request HTTPS dari user, tapi meneruskan ke origin sebagai HTTP (kecuali kamu set SSL mode ke "Full"). Tanpa force HTTPS, app kamu bisa generate mixed-content warning atau redirect loop.


Custom Headers dan Origin Request

Cloudflare Tunnel mendukung custom headers dan pengaturan origin request yang fleksibel:

YAML
ingress:
  - hostname: app.domainkamu.com
    service: http://localhost:3000
    originRequest:
      httpHostHeader: localhost
      connectTimeout: 30s
      noTLSVerify: true
      customHeaders:
        X-Custom-Header: "nilai-custom"
  • httpHostHeader: Override Host header yang dikirim ke origin. Berguna kalau origin expect Host tertentu.

  • connectTimeout: Waktu maksimum untuk koneksi ke origin. Default 10 detik.

  • noTLSVerify: Skip verifikasi sertifikat TLS origin. Hanya pakai kalau origin pakai self-signed cert.

  • customHeaders: Tambah header custom ke request ke origin.


Troubleshooting: Error Umum dan Cara Mengatasi

Tunnel Tidak Mau Start

Gejala: Error saat menjalankan cloudflared tunnel run

Kemungkinan penyebab dan solusi:

  1. Config file tidak ditemukan:
CODE
bash
   ls ~/.cloudflared/

Pastikan config.yml dan file credentials JSON ada.

  1. Indentasi YAML salah:
CODE
bash
   cloudflared tunnel ingress validate

YAML sangat sensitif terhadap spasi. Gunakan spasi, bukan tab.

  1. UUID tunnel salah di config: Cek UUID:
CODE
bash
   cloudflared tunnel list

Pastikan UUID di config.yml sama dengan yang di list.

Domain Tidak Resolve

Gejala: Akses https://app.domainkamu.com muncul error "DNS_PROBE_FINISHED_NXDOMAIN"

Solusi:

Cek DNS record:

BASH
dig app.domainkamu.com

Atau:

BASH
nslookup app.domainkamu.com

Kalau tidak ada hasil, berarti CNAME record belum dibuat atau belum propagate. Tunggu 1-5 menit, lalu coba lagi.

Kalau DNS sudah resolve tapi halaman nggak muncul, cek SSL mode di Cloudflare dashboard:

  • SSL/TLS → Overview → Set ke "Full" atau "Full (strict)"

  • Mode "Flexible" bisa bikin redirect loop

Connection Timeout

Gejala: Tunnel aktif, domain resolve, tapi request timeout.

Solusi:

  1. Pastikan aplikasi lokal berjalan:
CODE
bash
   curl http://localhost:3000

Kalau ini juga timeout, berarti aplikasinya yang bermasalah, bukan tunnel.

  1. Cek port conflict:
CODE
bash
   lsof -i :3000    # macOS/Linux
   netstat -ano | findstr :3000    # Windows
  1. Tingkatkan timeout di config:
CODE
yaml
   originRequest:
     connectTimeout: 60s

Sertifikat SSL Error

Gejala: Browser warning "NET::ERR_CERT_AUTHORITY_INVALID"

Solusi:

Tunggu 5-10 menit setelah pertama kali setup. Cloudflare butuh waktu untuk provision sertifikat Edge. Kalau masih error setelah 10 menit:

  1. Cek SSL mode di dashboard → set ke "Full"

  2. Kalau origin pakai self-signed cert, tambahkan di config:

CODE
yaml
   originRequest:
     noTLSVerify: true

Tunnel Sering Disconnect

Gejala: Tunnel connect lalu disconnect berulang-ulang.

Solusi:

  1. Cek log dengan debug level:
CODE
bash
   cloudflared tunnel run tunnel-saya --loglevel debug
  1. Pastikan koneksi internet stabil. cloudflared butuh koneksi outbound ke port 7844. Kalau firewall membatasi, coba:
CODE
bash
   # Test koneksi ke Cloudflare
   curl -v https://api.cloudflare.com
  1. Update cloudflared:
CODE
bash
   cloudflared update
  1. Tambah grace period di config:
CODE
yaml
   grace-period: 30s

Connector Status Tidak Connected di Dashboard

Gejala: cloudflared jalan di terminal tapi dashboard tetap "Disconnected"

Solusi:

Kalau kamu pakai token-based setup (dari dashboard), pastikan command yang kamu copy dari dashboard dijalankan persis. Kalau pakai config file, pastikan cert.pem ada dan valid:

BASH
ls ~/.cloudflared/cert.pem

Coba re-login:

BASH
cloudflared tunnel login

Cloudflare Zero Trust: Access Policy untuk Keamanan Tambahan

Cloudflare Tunnel sendiri sudah aman dari sisi koneksi. Tapi kalau kamu expose service seperti admin panel, database, atau NAS, kamu perlu lapisan keamanan tambahan. Di sinilah Cloudflare Access berperan.

Dengan Access, kamu bisa batasi siapa saja yang boleh akses service kamu. Misal: hanya email tertentu, hanya yang login via GitHub, atau hanya yang terhubung via WARP client.

Setup Access Policy

  1. Di Zero Trust dashboard, buka Access → Applications → Add Application → Self-hosted

  2. Masukkan public hostname, misal grafana.domainkamu.com

  3. Buat policy:

  4. Save

Sekarang setiap kali seseorang akses grafana.domainkamu.com, mereka akan diarahkan ke halaman login Cloudflare dulu. Setelah autentikasi, baru diarahkan ke Grafana.

Bypass Login saat Terhubung WARP

Kalau kamu nggak mau login tiap kali (karena kamu sudah terdaftar di Zero Trust via WARP client), tambah policy kedua:

  • Action: Bypass

  • Include: Gateway = Connected

Dua policy ini bekerja bersamaan: kalau WARP connected, skip login. Kalau tidak, minta login dengan email yang terdaftar.


Tips dan Best Practices

Dari pengalaman saya pakai Cloudflare Tunnel selama berbulan-bulan, berikut beberapa tips yang benar-benar berguna:

Jaga token dan credentials file dengan aman. Siapa pun yang punya tunnel token bisa attach cloudflared mereka ke tunnel kamu. Jangan commit ke public repo, jangan share screenshot yang menampilkan token.

Gunakan nama tunnel yang deskriptif. prod-web-server jauh lebih jelas daripada tunnel1 saat kamu punya banyak tunnel.

Enable logging untuk debugging:

YAML
loglevel: info
logfile: /var/log/cloudflared.log

Update cloudflared secara berkala:

BASH
cloudflared update

Update biasanya berisi security fix dan peningkatan stabilitas koneksi.

Tambah basic auth di Nginx untuk layer keamanan ekstra. Cloudflare Tunnel aman, tapi defense in depth nggak pernah salah:

NGINX
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

Pakai Docker untuk konsistensi. Kalau kamu jalan cloudflared di banyak server, Docker image memastikan versi dan konfigurasi sama di mana-mana.

Backup config file. Simpan config.yml di version control (tapi hapus credentials file dari repo!). Kalau server crash, kamu tinggal restore config dan jalan lagi.


Manajemen Tunnel: Command yang Berguna

Beberapa command yang sering saya pakai untuk manage tunnel:

Lihat semua tunnel:

BASH
cloudflared tunnel list

Lihat info detail satu tunnel:

BASH
cloudflared tunnel info tunnel-saya

Tail log koneksi real-time:

BASH
cloudflared tail a7b3c4d5-e6f7-8901-2345-6789abcdef01

Test ingress rule untuk domain tertentu:

BASH
cloudflared tunnel ingress rule https://app.domainkamu.com

Output:

CODE
Using rules from /Users/kamu/.cloudflared/config.yml
Matched rule #0
    hostname: app.domainkamu.com
    service: http://localhost:3000

Hapus tunnel:

BASH
cloudflared tunnel cleanup tunnel-saya
cloudflared tunnel delete tunnel-saya

cleanup menghentikan koneksi aktif, delete menghapus tunnel secara permanen. DNS record perlu dihapus manual dari dashboard.

Rotasi token:

BASH
cloudflared tunnel token tunnel-saya

Kesalahan Umum yang Sering Terjadi

Dari pengalaman dan observasi, berikut kesalahan yang paling sering muncul saat setup Cloudflare Tunnel:

1. Lupa menambah catch-all rule. Setiap config file wajid diakhiri dengan - service: http_status:404. Tanpa ini, cloudflared akan error saat start.

2. Aplikasi lokal hanya listen di 127.0.0.1, bukan 0.0.0.0. Kalau kamu jalan cloudflared di Docker container yang berbeda dengan aplikasi, localhost di config bisa mengarah ke container yang salah. Gunakan IP internal Docker network atau host.docker.internal.

3. Domain belum di-manage Cloudflare. Cloudflare Tunnel butuh domain yang nameserver-nya sudah diarahkan ke Cloudflare. Kalau masih pakai nameserver registrar, DNS record tidak akan terbuat.

4. SSL mode salah. Default Cloudflare SSL mode kadang "Flexible", yang bisa bikin redirect loop. Set ke "Full" atau "Full (strict)" untuk tunnel.

5. Firewall blok outbound port 7844. Cloudflare Tunnel butuh koneksi keluar ke port 7844. Kalau server kamu di belakang firewall korporat yang membatasi port non-standar, tunnel nggak akan connect. Solusinya: minta network admin untuk whitelist outbound ke *.cloudflare.com di port 7844.

6. Edit config tapi lupa restart. Setiap kali kamu ubah config.yml, kamu perlu restart service. Di Linux: sudo systemctl restart cloudflared. Di Docker: docker restart cloudflared.


Skema Konfigurasi untuk Berbagai Skenario

Skenario 1: Developer yang Mau Share Progress ke Klien

YAML
tunnel: dev-preview
credentials-file: ~/.cloudflared/uuid.json

ingress:
  - hostname: preview.domainkamu.com
    service: http://localhost:3000
  - service: http_status:404

Klien akses https://preview.domainkamu.com, lihat perubahan real-time. Nggak perlu deploy ke staging server.

Skenario 2: Webhook Testing untuk Stripe

YAML
tunnel: webhook-test
credentials-file: ~/.cloudflared/uuid.json

ingress:
  - hostname: webhooks.domainkamu.com
    service: http://localhost:4000
  - service: http_status:404

Set di Stripe dashboard: https://webhooks.domainkamu.com/webhooks/stripe. Test payment dan lihat webhook masuk di terminal lokal.

Skenario 3: Smart Home Lengkap

YAML
tunnel: smart-home
credentials-file: ~/.cloudflared/uuid.json

ingress:
  - hostname: home.domainkamu.com
    service: http://localhost:8123
  - hostname: plex.domainkamu.com
    service: http://localhost:32400
  - hostname: pihole.domainkamu.com
    service: http://localhost:80
  - hostname: nas.domainkamu.com
    service: http://localhost:5000
  - hostname: cameras.domainkamu.com
    service: http://localhost:5001
  - service: http_status:404

Akses semua smart home service dari mana saja, dengan HTTPS otomatis dan DDoS protection.

Skenario 4: Tim Development dengan Multiple Project

YAML
tunnel: agency-projects
credentials-file: ~/.cloudflared/uuid.json

ingress:
  - hostname: clienta.domainkamu.com
    service: http://localhost:3001
  - hostname: clientb.domainkamu.com
    service: http://localhost:3002
  - hostname: clientc.domainkamu.com
    service: http://localhost:3003
  - service: http_status:404

Satu tunnel, tiga klien, tiga subdomain. Share link ke masing-masing klien tanpa perlu deploy terpisah.


Performance dan Optimasi

Cloudflare Tunnel umumnya cepat karena traffic melewati jaringan global Cloudflare yang punya data center di ratusan kota. Tapi ada beberapa tweak untuk optimasi:

Enable HTTP/2 ke origin:

YAML
originRequest:
  http2Origin: true

Atur compression:

YAML
originRequest:
  disableChunkedEncoding: false

Pilih data center terdekat. cloudflared otomatis connect ke data center terdekat, tapi kalau kamu di Indonesia dan traffic kamu dilempat ke Singapore padahal ada data center di Jakarta, coba restart cloudflared atau update ke versi terbaru.

Monitor resource usage. cloudflared ringan, tapi kalau kamu jalan banyak connector di satu server, cek dengan top atau htop:

BASH
top -p $(pgrep cloudflared)

Pertimbangkan multiple replicas. Dalam satu tunnel, kamu bisa jalan beberapa cloudflared instance di server berbeda. Traffic akan di-load balance otomatis:

BASH
# Server 1
cloudflared tunnel run tunnel-saya

# Server 2 (server berbeda, config dan credentials file sama)
cloudflared tunnel run tunnel-saya

Cloudflare akan distribusi traffic ke kedua connector. Kalau satu mati, yang lain ambil alih. Ini memberikan high availability tanpa konfigurasi tambahan.


Cloudflare Tunnel vs Tailscale: Kapan Pakai Yang Mana?

Saya sering ditanya ini, jadi mari kita bahas lebih detail.

Cloudflare Tunnel ideal untuk:

  • Expose web service ke publik dengan domain sendiri

  • Dapat SSL, CDN, WAF, dan DDoS protection gratis

  • Tidak perlu install client di sisi pengunjung

  • Akses dari browser mobile tanpa app tambahan

Tailscale ideal untuk:

  • VPN mesh antar device — akses private network

  • RDP, VNC, atau protocol non-HTTP antar device

  • Latensi rendah (p2p connection kalau memungkinkan)

  • Tidak butuh domain atau exposure ke publik

Intinya: Cloudflare Tunnel untuk "bikin service saya bisa diakses dari internet", Tailscale untuk "bikin device saya bisa saling terhubung secara private". Bisa dipakai bersamaan tanpa konflik.

Saya pakai Cloudflare Tunnel untuk expose Home Assistant ke publik (dengan access policy), dan Tailscale untuk SSH ke semua server di rumah tanpa expose SSH ke internet. Kombinasi yang aman dan praktis.


Migrasi dari ngrok ke Cloudflare Tunnel

Kalau kamu selama ini pakai ngrok dan mau pindah, ini yang perlu kamu tahu:

Aspek

ngrok Free

Cloudflare Tunnel

Domain

Random, berubah tiap restart

Domain sendiri, tetap

Custom domain

Berbayar ($10/bulan)

Gratis

Concurrent tunnels

1

Tidak terbatas

SSL

Ya

Ya

DDoS protection

Tidak

Ya

WAF

Tidak

Ya

Bandwidth limit

Ada

Tidak ada yang signifikan

Langkah migrasi:

  1. Daftar Cloudflare dan tambahkan domain

  2. Install cloudflared

  3. Buat tunnel dan config

  4. Update webhook URL di service eksternal (Stripe, GitHub, dll) ke domain baru

  5. Stop ngrok, start cloudflared

Proses migrasi saya dulu cuma butuh sekitar 30 menit, dan nggak pernah balik ke ngrok sejak itu.


Keamanan: Apa yang Perlu Diwaspadai

Cloudflare Tunnel aman secara arsitektur, tapi ada beberapa hal yang perlu kamu perhatikan:

Tunnel token = akses ke tunnel kamu. Siapa pun yang punya token bisa attach connector ke tunnel. Jangan share di Slack, GitHub issue, atau screenshot.

Service yang di-expose tetap publik kecuali kamu tambah Access policy. Cloudflare Tunnel mengamankan koneksi, bukan otomatis menambahkan autentikasi ke aplikasi kamu. Kalau kamu expose admin panel tanpa Access policy, siapa pun yang tahu URL bisa akses.

Self-signed cert di origin perlu noTLSVerify. Kalau origin kamu pakai self-signed cert dan kamu set SSL mode "Full (strict)", request akan gagal. Tambah noTLSVerify: true atau gunakan cert dari Let's Encrypt.

Update cloudflared secara rutin. Seperti software lainnya, cloudflared bisa punya vulnerability. Update berkala untuk tetap aman.

Monitor log. Setelah enable logging, cek sesekali apakah ada pola yang mencurigakan:

BASH
sudo journalctl -u cloudflared --since "1 hour ago" | grep -i error

Mengelola Tunnel di Tim

Kalau kamu bekerja dalam tim, ada beberapa hal yang perlu diatur:

Version control config file (tanpa credentials). Simpan config.yml di Git repo internal tim. Tapi jangan simpan file credentials JSON — itu perlu di-distribute secara secure (misal via password manager atau secret management tool).

Dokumentasi DNS record. Catat setiap subdomain dan service yang terhubung. Kalau tim tumbuh, akan ada banyak subdomain dan tanpa dokumentasi, orang akan lupa mana untuk apa.

Naming convention yang konsisten. Misal: [service].[environment].domainkamu.com. Contoh: api.staging.domainkamu.com, api.prod.domainkamu.com.

Separate tunnel untuk staging dan production. Jangan campur. Kalau tunnel staging mati, production nggak terdampak.


Ekspansi: Workers VPC dan Load Balancing

Cloudflare Tunnel juga terintegrasi dengan fitur Cloudflare lain yang lebih advanced:

Workers VPC

Kalau kamu pakai Cloudflare Workers, kamu bisa pakai tunnel untuk biarkan Worker akses database atau API private kamu. Worker jalan di edge Cloudflare, dan via tunnel, bisa reach service di server lokal tanpa expose ke publik.

Load Balancing

Tunnel bisa dipakai sebagai origin endpoint di Cloudflare Load Balancer pool. Ini berguna kalau kamu punya multiple tunnel di lokasi berbeda dan mau distribusi traffic dengan health check dan failover otomatis.

Kedua fitur ini lebih advanced dan butuh plan Cloudflare berbayar, tapi worth knowing kalau kamu sedang membangun infrastruktur yang serius.


Checklist: Apakah Cloudflare Tunnel Cocok untuk Kamu?

Sebelum kita tutup, mari kita ringkas kapan Cloudflare Tunnel adalah pilihan yang tepat:

Cloudflare Tunnel cocok untuk kamu kalau:

  • Mau expose web service lokal ke internet tanpa VPS

  • Punya domain yang sudah di-manage Cloudflare

  • Butuh HTTPS otomatis tanpa urus sertifikat manual

  • Ingin IP origin tersembunyi

  • Server di belakang NAT/CGNAT dan nggak bisa port forwarding

  • Mau pakai Cloudflare CDN, WAF, dan DDoS protection gratis

  • Butuh akses dari mobile device tanpa VPN

Cloudflare Tunnel mungkin bukan pilihan terbaik kalau:

  • Kamu butuh p2p connection dengan latensi sangat rendah (pertimbangkan Tailscale)

  • Domain kamu belum dan nggak mau di-manage Cloudflare

  • Kamu butuh expose protocol non-HTTP yang butuh client-side cloudflared (meskipun ini bisa dilakukan, tapi lebih ribet)

  • Kamu butuh kontrol penuh atas setiap packet di network level

Untuk kebanyakan use case web service, Cloudflare Tunnel adalah salah satu tool terbaik yang tersedia gratis. Saya pribadi sudah pakai untuk home lab, development preview, webhook testing, dan bahkan production service kecil. Setup cepat, maintenance minim, dan keamanan bawaan sudah cukup untuk kebanyakan skenario.

Yang membuat Cloudflare Tunnel menonjol adalah kombinasi gratis, aman, dan mudah. Tidak banyak tool yang bisa klaim ketiganya sekaligus. Kalau kamu sudah punya domain di Cloudflare, nyaris tidak ada alasan untuk tidak mencoba. Setup cuma butuh 10-15 menit, dan kalau nggak cocok, tinggal hapus tunnel — tidak ada kontrak, tidak ada biaya, tidak ada sisa konfigurasi yang merepotkan.

Troubleshooting: Masalah yang Sering Muncul dan Cara Mengatasinya

Teman-Teman, nggak ada teknologi yang 100% bebas masalah. Begitu juga Cloudflare Tunnel. Selama beberapa bulan pakai tool ini, saya sudah ketemu beberapa error yang cukup sering muncul. Daripada kalian panik kayak saya dulu, mari kita bahas satu-satu.

Tunnel Status "Healthy" Tapi Halaman 502 Bad Gateway

Ini yang paling bikin bingung. Di dashboard Cloudflare, tunnel kamu terlihat hijau dan sehat-sehat saja. Tapi pas diakses, yang muncul error 502.

Penyebab paling umum: cloudflared jalan dan terhubung ke edge Cloudflare, tapi service di belakangnya mati atau listening di port yang salah. Cek dulu apakah service kamu benar-benar up:

BASH
curl -I http://localhost:8080

Kalau response-nya kosong atau error, berarti service-nya yang bermasalah, bukan tunnel-nya. Pastikan juga port di config.yml sesuai dengan port service kamu. Saya dulu pernah ketularan typo — nulis port 8080 padahal service jalan di 8000. Tunnel sehat, tapi 502 terus.

Error 1033 — "Argo Tunnel Error"

Error ini muncul kalau cloudflared belum berhasil establish koneksi ke edge Cloudflare, tapi DNS record sudah di-create. Biasanya terjadi di awal-awal setup.

Solusinya: pastikan cloudflared sudah running dan terhubung. Cek status service-nya:

BASH
sudo systemctl status cloudflared

Kalau statusnya inactive atau failed, jalankan ulang dan cek log untuk lihat detail error-nya. Kadang masalahnya cuma karena credentials file belum di-copy ke direktori yang benar.

SSL Handshake Failed (Error 526)

Error 526 artinya Cloudflare nggak bisa verifikasi SSL certificate di origin server kamu. Ini terjadi kalau kamu set SSL mode ke "Full (strict)" tapi origin pakai self-signed cert atau cert yang sudah expired.

Ada dua jalan keluar:

  1. Pakai cert yang valid dari Let's Encrypt. Gratis dan auto-renewal. Ini solusi yang lebih baik jangka panjang.

  2. Set noTLSVerify: true di config tunnel kamu. Cepat, tapi kurang ideal soal keamanan.

Kalau service kamu cuma HTTP (tanpa TLS di origin), set origin URL pakai http:// bukan https:// di config, dan ubah SSL mode Cloudflare ke "Flexible" atau "Full".

Tunnel Sering Disconnect

Kalau tunnel kamu sering putus-nyambun, ada beberapa kemungkinan:

Koneksi internet tidak stabil. cloudflared butuh koneksi internet yang lumayan stabil untuk maintain tunnel. Kalau ISP kamu sering drop, tunnel juga ikut drop. Kabar baiknya, cloudflared punya auto-reconnect, jadi biasanya akan nyambung lagi sendiri.

Versi cloudflared terlalu lama. Versi lama kadang punya bug yang bikin koneksi nggak stabil. Update ke versi terbaru:

BASH
# Untuk Debian/Ubuntu
sudo apt-get update && sudo apt-get install cloudflared

# Untuk macOS (Homebrew)
brew upgrade cloudflared

Resource terbatas di server. Kalau server kamu kekurangan RAM atau CPU, cloudflared bisa crash. Monitor resource pakai htop atau glances untuk pastikan server nggak kelebihan beban.

DNS Record Tidak Ter-Create Otomatis

Saat pakai cloudflared tunnel route dns, kadang DNS record nggak otomatis terbikin. Biasanya karena:

  • Domain belum di-add ke akun Cloudflare yang sama dengan tunnel

  • DNS record untuk subdomain tersebut sudah ada (manual atau dari service lain)

  • Permission API token nggak cukup

Cek manual di dashboard Cloudflare → DNS → Records. Kalau record sudah ada tapi masih pointing ke tempat lain, hapus dulu, lalu jalankan ulang command route dns.


Tips dan Trik yang Saya Pakai Sehari-Hari

Setelah beberapa bulan pakai Cloudflare Tunnel, ada beberapa tips kecil yang ternyata cukup membantu:

Pakai ingress rules untuk routing berdasarkan path. Kamu nggak harus bikin subdomain terpisah untuk setiap service. Satu subdomain bisa serve multiple service berdasarkan path:

YAML
ingress:
  - hostname: app.domainkamu.com
    path: /api/*
    service: http://localhost:3000
  - hostname: app.domainkamu.com
    path: /*
    service: http://localhost:8080
  - service: http_status:404

Dengan config di atas, /api/* diarahkan ke backend API di port 3000, dan sisanya ke frontend di port 8080. Praktis banget kalau kamu mau serve frontend dan backend dari satu domain.

Bikin script untuk restart tunnel cepat. Simpan script kecil di server untuk restart tunnel tanpa harus ingat command panjang:

BASH
#!/bin/bash
# restart-tunnel.sh
sudo systemctl restart cloudflared
sleep 3
sudo systemctl status cloudflared --no-pager

Kasih permission execute (chmod +x restart-tunnel.sh) dan simpan di /usr/local/bin/. Tinggal jalankan restart-tunnel.sh kapan pun perlu.

Manfaatkan Cloudflare Access untuk autentikasi gratis. Kalau kamu mau expose service tapi cuma untuk diri sendiri atau tim kecil, aktifkan Cloudflare Access. Kamu bisa pakai login Google, GitHub, atau One-Time PIN via email. Gratis untuk sampai 50 user. Ini jauh lebih aman daripada biarkan service terbuka untuk siapa pun yang tahu URL.

Pakai multiple ingress untuk testing beberapa project sekaligus. Kalau lagi develop beberapa project paralel, tambah aja beberapa ingress rules:

YAML
ingress:
  - hostname: project-a.domainkamu.com
    service: http://localhost:3001
  - hostname: project-b.domainkamu.com
    service: http://localhost:3002
  - hostname: project-c.domainkamu.com
    service: http://localhost:3003
  - service: http_status:404

Satu tunnel, satu cloudflared instance, tapi tiga project kecil-kecilan bisa diakses dari mana saja. Saya pakai approach ini hampir setiap hari kalau lagi kerja di multiple repo.

Monitor uptime pakai Uptime Robot atau Better Stack. Cloudflare Tunnel sendiri nggak punya built-in alert kalau service di belakangnya mati. Bikin monitor external yang nge-ping URL tunnel kamu setiap menit. Kalau down, kamu langsung dapat notifikasi. Gratis untuk plan basic, dan cukup untuk kebanyakan use case.


Cloudflare Tunnel untuk Kebutuhan Bisnis Lokal

Teman-Teman yang punya bisnis lokal atau startup di Indonesia, Cloudflare Tunnel punya beberapa keunggulan yang spesifik relevan buat kita.

ISP di Indonesia sering pakai CGNAT. Banyak ISP rumahan dan bahkan bisnis kecil dapat IP di belakang CGNAT, yang artinya port forwarding nggak bisa dilakukan. Cloudflare Tunnel bypass CGNAT sepenuhnya karena koneksi outgoing dari server kamu ke edge Cloudflare. Nggak peduli ISP pakai NAT berlapis, tunnel tetap jalan.

Hosting di VPS luar negeri tetap cepat. Kalau kamu host di VPS Singapura atau Hong Kong, traffic user Indonesia tetap lewat CDN Cloudflare yang punya PoP di Jakarta. Static assets di-cache di edge, jadi loading time untuk user Indonesia tetap cepat walau origin server jauh.

Gratis untuk mulai. Buat bisnis yang masih bootstrap, nggak keluar biaya untuk expose service ke publik. Domain saja yang perlu dibeli, dan itu pun bisa pakai domain murah. Tunnel, CDN, DDoS protection, dan SSL semuanya masuk paket gratis Cloudflare.

Mudah untuk tim yang remote. Tim yang kerja dari rumah masing-masing tetap bisa akses internal tool via tunnel dengan Access policy. Nggak perlu setup VPN yang ribet, dan setiap anggota tim cukup login pakai email mereka untuk akses.

Kalau kamu sedang membangun produk dari Indonesia dan butuh expose ke internet dengan budget minim, Cloudflare Tunnel adalah jalan pintas yang paling masuk akal. Saya sudah merekomendasikan ini ke beberapa teman yang startup-nya masih di fase early, dan semuanya sampai sekarang masih pakai.


Pertanyaan yang Sering Muncul

Apakah Cloudflare Tunnel bisa untuk game server?

Bisa, tapi nggak ideal. Cloudflare Tunnel dirancang untuk traffic HTTP/HTTPS. Untuk game server yang pakai TCP/UDP dengan latensi rendah, tunnel menambah overhead yang bisa bikin ping naik. Tapi untuk web-based game atau admin panel game server, tunnel tetap oke.

Berapa banyak tunnel yang bisa dibuat di akun gratis?

Cloudflare nggak publikasikan limit hard untuk jumlah tunnel di plan gratis. Tapi secara praktis, untuk kebanyakan use case, 2-3 tunnel sudah lebih dari cukup. Satu tunnel bisa handle banyak hostname dan ingress rules.

Apakah tunnel bisa jalan di Raspberry Pi?

Bisa banget. cloudflared tersedia untuk ARM dan ARM64. Saya jalanin tunnel di Raspberry Pi 4 untuk home lab, dan resource yang dipakai cuma sekitar 30-50 MB RAM. Sangat ringan.

Kalau server saya mati, apa yang terjadi?

DNS record yang di-create tunnel akan tetap ada, tapi request ke subdomain akan dapat error 502 atau halaman Cloudflare yang bilang origin nggak bisa di-reach. Begitu server hidup lagi dan cloudflared jalan, tunnel akan otomatis nyambung dan service kembali normal.

Kesimpulan

Setelah ngejalanin Cloudflare Tunnel di beberapa project — mulai dari home lab di Raspberry Pi sampai production server buat startup teman-teman — saya bisa bilang tool ini bener-bener ngubah cara saya ngepikirin soal expose service ke internet. Dulu, setup reverse proxy + SSL certificate + firewall rules itu ritual yang makan waktu berjam-jam. Sekarang, install cloudflared, jalankan satu command, dan subdomain kamu udah live dengan SSL otomatis. Nggak perlu utak-atik router, nggak perlu khawatir CGNAT, dan nggak perlu bayar VPN tambahan buat tim remote.

Yang bikin Cloudflare Tunnel menarik buat konteks Indonesia adalah kombinasi harga (gratis) dan infrastruktur (PoP di Jakarta). Kamu bisa host di VPS murah mana pun, tapi traffic tetep di-accelerate lewat edge Cloudflare yang dekat sama user kamu. Buat bisnis lokal yang masih bootstrap atau developer yang mau share portfolio tanpa ribet, ini kombinasi yang susah dikalahin. Bandingkan sama setup tradisional: beli IP publik, konfigurasi port forwarding, manage SSL renewal, dan set up VPN kalau mau akses internal — semuanya makan waktu dan uang.

Satu hal yang perlu diingat: Cloudflare Tunnel bukan solusi untuk semua skenario. Kalau kamu butuh latensi super rendah buat game server atau traffic non-HTTP, tunnel ini akan bikin kamu frustasi. Tapi untuk 90% use case developer dan bisnis — web app, API, admin panel, internal tool, static site — Cloudflare Tunnel lebih dari cukup. Bahkan dokumentasi resmi Cloudflare punya panduan lengkap untuk mulai dalam hitungan menit.

Kalau kamu belum pernah coba, saya sarankan install cloudflared hari ini juga, bikin satu tunnel buat project paling sederhana kamu, dan rasain sendiri bedanya. Setup-nya cuma butuh 10 menit, tapi dampaknya ke workflow kamu bisa signifikan. Begitu kamu ngalamin betapa gampangnya, balik ke cara lama rasanya susah banget.


Referensi

Cloudflare Developers. (2026). Cloudflare Tunnel.

Cloudflare Developers. (2026). Cloudflare Tunnel · Cloudflare One docs.

The IT Bros. (2026). Cloudflare Tunnel: Expose Your Home Network to the Internet Securely.

GitHub. (2026). Cloudflare Tunnel client.

Dev Community. (2026). Turn your local machine into a web server with Cloudflare Tunnel.

Medium. (2026). How To Setup A Cloudflare Tunnel And Expose Your Local Service Or Application.

David Mohl. (2026). I finally understand Cloudflare Zero Trust tunnels.

GitHub. (2026). Cloudflare Tunnel - Secure Zero Trust Connectivity for Apps and Private Services.

Knightli. (2026). Cloudflare Tunnel Setup Guide: Expose Local Services Without Port Forwarding.

Adam Patterson. (2026). Setting Up a Cloudflare Tunnel with Wildcard Support.

Komentar (0)

Belum ada komentar. Jadilah yang pertama berbagi pendapat!

Tinggalkan komentar