Tutorials
Tutorial Cloudflare Tunnel: Aplikasi Lokal ke Internet
Daftar isi
- Apa Itu Cloudflare Tunnel dan Kenapa Kamu Perlu Peduli
- Sebelum Mulai: Apa Saja yang Perlu Disiapkan
- Cara Kerja Cloudflare Tunnel: Konsep yang Perlu Dipahami
- Tunnel
- Ingress Rules
- Credentials File
- Outbound-Only Connection
- Step 1: Install cloudflared di Server Kamu
- macOS (via Homebrew)
- Linux (Debian/Ubuntu)
- Linux (RHEL/CentOS)
- Windows
- Docker (Alternatif Cross-Platform)
- Step 2: Autentikasi cloudflared dengan Akun Cloudflare
- Step 3: Buat Tunnel Baru
- Step 4: Buat File Konfigurasi config.yml
- Step 5: Konfigurasi DNS Record
- Via CLI (Lebih Cepat)
- Via Dashboard Cloudflare
- Step 6: Jalankan Tunnel
- Quick Tunnel: Testing Tanpa Domain
- Step 7: Menjalankan Tunnel sebagai Service Persisten
- Linux (systemd)
- macOS (launchd)
- Windows
- Docker (dengan Restart Policy)
- Multiple Services: Satu Tunnel, Banyak Aplikasi
- Wildcard Hostname: Akses Semua Subdomain Sekaligus
- Path-Based Routing: Satu Domain, Banyak Endpoint
- SSH Access via Cloudflare Tunnel
- Tambah Hostname SSH di config.yml
- Konfigurasi SSH Client
- Setup via Dashboard Cloudflare (Tanpa Config File)
- Cloudflare Tunnel vs Alternatif: Tailscale, ngrok, dan Port Forwarding
- Studi Kasus: Home Lab dengan Cloudflare Tunnel
- Latar Belakang
- Tantangan
- Pendekatan
- Implementasi
- Hasil
- Konfigurasi untuk WordPress dan Laravel
- WordPress
- Laravel
- Custom Headers dan Origin Request
- Troubleshooting: Error Umum dan Cara Mengatasi
- Tunnel Tidak Mau Start
- Domain Tidak Resolve
- Connection Timeout
- Sertifikat SSL Error
- Tunnel Sering Disconnect
- Connector Status Tidak Connected di Dashboard
- Cloudflare Zero Trust: Access Policy untuk Keamanan Tambahan
- Setup Access Policy
- Bypass Login saat Terhubung WARP
- Tips dan Best Practices
- Manajemen Tunnel: Command yang Berguna
- Kesalahan Umum yang Sering Terjadi
- Skema Konfigurasi untuk Berbagai Skenario
- Skenario 1: Developer yang Mau Share Progress ke Klien
- Skenario 2: Webhook Testing untuk Stripe
- Skenario 3: Smart Home Lengkap
- Skenario 4: Tim Development dengan Multiple Project
- Performance dan Optimasi
- Cloudflare Tunnel vs Tailscale: Kapan Pakai Yang Mana?
- Migrasi dari ngrok ke Cloudflare Tunnel
- Keamanan: Apa yang Perlu Diwaspadai
- Mengelola Tunnel di Tim
- Ekspansi: Workers VPC dan Load Balancing
- Workers VPC
- Load Balancing
- Checklist: Apakah Cloudflare Tunnel Cocok untuk Kamu?
- Troubleshooting: Masalah yang Sering Muncul dan Cara Mengatasinya
- Tunnel Status "Healthy" Tapi Halaman 502 Bad Gateway
- Error 1033 — "Argo Tunnel Error"
- SSL Handshake Failed (Error 526)
- Tunnel Sering Disconnect
- DNS Record Tidak Ter-Create Otomatis
- Tips dan Trik yang Saya Pakai Sehari-Hari
- Cloudflare Tunnel untuk Kebutuhan Bisnis Lokal
- Pertanyaan yang Sering Muncul
- Kesimpulan
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:
[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)

brew install cloudflare/cloudflare/cloudflared
Verifikasi instalasi:
cloudflared --version
Output yang diharapkan:
cloudflared version 2025.10.0
Linux (Debian/Ubuntu)
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
Linux (RHEL/CentOS)
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:
cloudflared.exe --version
Docker (Alternatif Cross-Platform)
Kalau kamu lebih suka Docker, ini cara paling gampang dan konsisten lintas platform:
Baca juga Netlify: Panduan Lengkap Deploy Website Tanpa Ribet
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.
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:
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.
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:
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:
cloudflared tunnel list
Output:
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:
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.comdengan subdomain yang kamu mau -
localhost:3000dengan 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:
cloudflared tunnel ingress validate
Output yang diharapkan:
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.
Baca juga Panduan Lengkap Notion AI 2026
Via CLI (Lebih Cepat)
cloudflared tunnel route dns tunnel-saya app.domainkamu.com
Output:
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
-
Login ke dashboard Cloudflare
-
Pilih domain kamu
-
Klik DNS di sidebar
-
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:
cloudflared tunnel run tunnel-saya
Output yang diharapkan:
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:
cloudflared tunnel --url http://localhost:3000
Output:
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)
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
Cek status:
sudo systemctl status cloudflared
Output yang diharapkan:
● cloudflared.service - cloudflared
Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled)
Active: active (running)
Lihat log real-time:
sudo journalctl -u cloudflared -f
macOS (launchd)
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:
sudo nano /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
Cari bagian <array> di dalam ProgramArguments. Pastikan ada:
<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.
Baca juga Panduan Lengkap Mengatasi Error WordPress Langkah Demi Langkah
Start dan stop service:
sudo launchctl start com.cloudflare.cloudflared
sudo launchctl stop com.cloudflare.cloudflared
Windows
Jalankan sebagai Administrator:
cloudflared service install
sc start cloudflared
Docker (dengan Restart Policy)
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:
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:
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:
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:
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:
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:
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
ingress:
- hostname: app.domainkamu.com
service: http://localhost:3000
- hostname: ssh.domainkamu.com
service: ssh://localhost:22
- service: http_status:404
Tambah DNS record:
Baca juga Cara Migrasi WordPress ke VPS Tanpa Downtime
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:
Host ssh.domainkamu.com
ProxyCommand cloudflared access ssh --hostname %h
Sekarang kamu bisa SSH:
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.
-
Login ke Cloudflare Zero Trust Dashboard
-
Navigasi ke Networks → Tunnels → Create Tunnel
-
Pilih Cloudflare Tunnel dan beri nama
-
Pilih environment (Linux, Windows, macOS, Docker)
-
Copy command yang di-generate dan jalankan di server
-
Tunggu sampai connector status Connected
-
Klik Next dan tambah Public Hostname:
-
Subdomain:
app -
Domain: pilih dari dropdown
-
Type: HTTP
-
URL:
localhost:3000
-
-
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:
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:
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:
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:
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:
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.
Baca juga Rekomendasi Plugin AI untuk Artikel WordPress Otomatis
Custom Headers dan Origin Request
Cloudflare Tunnel mendukung custom headers dan pengaturan origin request yang fleksibel:
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:
- Config file tidak ditemukan:
bash
ls ~/.cloudflared/
Pastikan config.yml dan file credentials JSON ada.
- Indentasi YAML salah:
bash
cloudflared tunnel ingress validate
YAML sangat sensitif terhadap spasi. Gunakan spasi, bukan tab.
- UUID tunnel salah di config: Cek UUID:
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:
dig app.domainkamu.com
Atau:
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:
- Pastikan aplikasi lokal berjalan:
bash
curl http://localhost:3000
Kalau ini juga timeout, berarti aplikasinya yang bermasalah, bukan tunnel.
- Cek port conflict:
bash
lsof -i :3000 # macOS/Linux
netstat -ano | findstr :3000 # Windows
- Tingkatkan timeout di config:
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:
-
Cek SSL mode di dashboard → set ke "Full"
-
Kalau origin pakai self-signed cert, tambahkan di config:
yaml
originRequest:
noTLSVerify: true
Tunnel Sering Disconnect
Gejala: Tunnel connect lalu disconnect berulang-ulang.
Solusi:
Baca juga Shortcut Keyboard Excel: Kerja Jadi 50% Lebih Cepat
- Cek log dengan debug level:
bash
cloudflared tunnel run tunnel-saya --loglevel debug
- Pastikan koneksi internet stabil.
cloudflaredbutuh koneksi outbound ke port 7844. Kalau firewall membatasi, coba:
bash
# Test koneksi ke Cloudflare
curl -v https://api.cloudflare.com
- Update cloudflared:
bash
cloudflared update
- Tambah grace period di config:
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:
ls ~/.cloudflared/cert.pem
Coba re-login:
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
-
Di Zero Trust dashboard, buka Access → Applications → Add Application → Self-hosted
-
Masukkan public hostname, misal
grafana.domainkamu.com -
Buat policy:
-
Action: Allow
-
Include: Email =
[email protected]
-
-
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:
loglevel: info
logfile: /var/log/cloudflared.log
Update cloudflared secara berkala:
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:
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:
Baca juga Rumus dan Fitur Excel: Panduan Lengkap untuk Pemula
cloudflared tunnel list
Lihat info detail satu tunnel:
cloudflared tunnel info tunnel-saya
Tail log koneksi real-time:
cloudflared tail a7b3c4d5-e6f7-8901-2345-6789abcdef01
Test ingress rule untuk domain tertentu:
cloudflared tunnel ingress rule https://app.domainkamu.com
Output:
Using rules from /Users/kamu/.cloudflared/config.yml
Matched rule #0
hostname: app.domainkamu.com
service: http://localhost:3000
Hapus tunnel:
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:
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
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
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
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
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:
Baca juga Rumus VLOOKUP Excel: Cara Pakai & Contoh Lengkap
originRequest:
http2Origin: true
Atur compression:
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:
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:
# 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:
-
Daftar Cloudflare dan tambahkan domain
-
Install
cloudflared -
Buat tunnel dan config
-
Update webhook URL di service eksternal (Stripe, GitHub, dll) ke domain baru
-
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:
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:
Baca juga Cara Install 9router di Termux Android, Anti Error
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:
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:
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.
Baca juga Cara Mudah Install WordPress di Localhost untuk Pemula
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:
-
Pakai cert yang valid dari Let's Encrypt. Gratis dan auto-renewal. Ini solusi yang lebih baik jangka panjang.
-
Set
noTLSVerify: truedi 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:
# 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:
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:
#!/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:
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