Halo Sobat Online! Coba bayangkan rumah tanpa pintu depan: tidak ada yang bisa masuk sembarangan, tapi penghuninya tetap bisa mengirim dan menerima paket. Kurang lebih begitulah cara kerja Cloudflare Tunnel di VPS. Aplikasi self-hosted seperti n8n, panel admin, atau dashboard monitoring tetap bisa dibuka dari internet, tetapi tidak ada satu pun port yang perlu dibuka di servermu.
Selama ini kita diajari bahwa supaya aplikasi bisa diakses dari luar, port 80/443 harus dibuka dan domain diarahkan ke IP publik VPS. Cara itu memang jalan, tapi setiap port terbuka adalah pintu yang bisa diketuk siapa saja. Dengan cloudflared, arahnya dibalik: server yang menghubungi Cloudflare lebih dulu, lalu permintaan dari pengunjung dikirim balik lewat “terowongan” yang sudah jadi itu.
Apa Itu Cloudflare Tunnel di VPS dan Kenapa Lebih Aman?
Cloudflare Tunnel adalah fitur dari Cloudflare Zero Trust yang menghubungkan servermu ke jaringan edge Cloudflare tanpa perlu membuka port masuk (inbound) sama sekali. Caranya, sebuah daemon ringan bernama cloudflared dijalankan di VPS. Daemon ini yang membuka koneksi keluar ke Cloudflare, lalu menunggu perintah.
Alurnya sederhana:
cloudflareddi VPS membuka koneksi keluar ke edge Cloudflare. Dokumentasi resmi meminta kamu memastikan port 7844 tidak diblokir kalau servermu pakai firewall ketat.- Pengunjung membuka
https://n8n.domainmu.com. Permintaan itu masuk ke Cloudflare, bukan langsung ke IP VPS-mu. - Cloudflare mengirim permintaan tersebut lewat terowongan yang sudah terbuka, dan
cloudflaredmeneruskannya ke aplikasi lokal — misalnyahttp://127.0.0.1:5678.
Beberapa keuntungan yang paling terasa:
- Tanpa IP publik dan tanpa port forwarding. Pengunjung tidak pernah menyentuh IP VPS-mu.
- TLS otomatis. Sertifikat HTTPS diurus Cloudflare di sisi edge, jadi aplikasi lokalmu boleh tetap berjalan sebagai HTTP biasa.
- Terlindung dari DDoS di lapisan depan. Trafik jahat disaring Cloudflare sebelum sampai ke VPS.
- Tidak takut IP berubah. DNS-nya berupa CNAME ke
UUID.cfargotunnel.com, bukan alamat IP, jadi ganti IP VPS tidak bikin domain mati.
Yang Perlu Disiapkan Sebelum Mulai
Persiapan di bawah ini singkat, tapi dua poin pertama wajib:
- Domain yang sudah memakai nameserver Cloudflare. Ini prasyarat resmi dari dokumentasi Cloudflare Tunnel. Kalau domainmu masih memakai nameserver registrar, pindahkan dulu.
- VPS Linux (Ubuntu/Debian) dengan akses SSH dan hak
sudo. Artikel ini memakai jalur APT, tapi Cloudflare juga menyediakan paket RPM, biner siap pakai, dan image Docker. - Satu aplikasi yang sudah jalan di localhost. Contoh paling gampang: n8n di
http://127.0.0.1:5678. Uji dulu dengancurl -I http://127.0.0.1:5678— kalau dari dalam VPS saja belum menyala, tunnel tidak akan menolong.
Langkah 1: Pasang cloudflared dari Repositori Resmi
Jangan asal mengunduh biner dari situs tidak jelas. Cloudflare punya repositori paket sendiri, dan inilah urutan perintah resminya untuk Ubuntu/Debian:
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
| sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
# 2. Daftarkan repositori cloudflared
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" \
| sudo tee /etc/apt/sources.list.d/cloudflared.list
# 3. Pasang
sudo apt-get update && sudo apt-get install cloudflared
cloudflared --version
Kalau cloudflared --version sudah menjawab nomor versi, lanjut ke langkah berikutnya. Satu catatan penting dari dokumentasi: Cloudflare hanya mendukung versi cloudflared yang berumur kurang dari satu tahun, jadi jangan biarkan paket ini menua sendirian — rajin-rajin sudo apt-get update && sudo apt-get upgrade.
Langkah 2: Login dan Buat Tunnel Bernama
Sekarang saatnya mendaftarkan tunnel. Perintah pertama akan membuka alamat di browser untuk memilih domain mana yang boleh memakai terowongan ini:
cloudflared tunnel login # pilih domainmu di browser, hasilnya cert.pem
cloudflared tunnel create vps-donnebanget
cloudflared tunnel list
Perintah create menghasilkan dua hal yang wajib kamu catat:
- UUID tunnel, misalnya
6ff42ae2-765d-4adf-8112-31c55c1551ef. UUID ini boleh diketahui orang lain. - File kredensial bernama
<UUID>.jsondi folder defaultcloudflared(untuk root biasanya/root/.cloudflared/). Ini rahasia, perlakukan seperti kunci rumah:
chmod 600 ~/.cloudflared/*.json ~/.cloudflared/cert.pem
Jangan pernah menaruh file kredensial atau cert.pem ke dalam repositori Git, walau repositorinya privat.
Langkah 3: Tulis config.yml dan Aturan Ingress
Di sinilah otak dari Cloudflare Tunnel di VPS: file config.yml di dalam folder ~/.cloudflared/. Isinya memetakan nama host ke layanan lokal.
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
ingress:
- hostname: n8n.domainmu.com
service: http://127.0.0.1:5678
- hostname: monitor.domainmu.com
service: http://127.0.0.1:3001
originRequest:
connectTimeout: 30s
- service: http_status:404
Aturan catch-all wajib jadi baris terakhir
Perhatikan baris - service: http_status:404 tanpa hostname. Tanpa aturan catch-all, cloudflared menolak berjalan. Cloudflare memang sengaja begitu: permintaan yang tidak cocok dengan aturan mana pun harus dijawab jelas, bukan diteruskan ke sembarang tempat.
Urutan aturan dibaca dari atas ke bawah, dan aturan pertama yang cocok itulah yang dipakai. Jadi letakkan aturan paling spesifik di atas.
Dua hal yang sering bikin bingung
cloudflaredtidak memotong path. Kalau aturanmu cocok karenapath: /api, permintaan kehttps://domainmu.com/api/userstetap dikirim apa adanya kehttp://127.0.0.1:8000/api/users. Butuh path dipotong? Lakukan di Nginx atau aturan URL Rewrite di sisi Cloudflare.- Wildcard hanya di depan.
.domainmu.comsah, tapitest..domainmu.comtidak didukung.
Kalau kamu hanya mengarahkan satu layanan, file konfigurasi bisa jauh lebih pendek — cukup tiga baris, tanpa blok ingress:
url: http://localhost:5678
tunnel: vps-donnebanget
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
Langkah 4: Arahkan DNS dan Validasi Rute
Tidak perlu membuat record DNS manual di dashboard. Biarkan cloudflared yang membuatnya, karena perintah ini akan menulis CNAME ke <UUID>.cfargotunnel.com:
cloudflared tunnel route dns vps-donnebanget n8n.domainmu.com
cloudflared tunnel route dns vps-donnebanget monitor.domainmu.com
Sesudah itu, uji dulu aturanmu sebelum menghidupkan layanan:
cloudflared tunnel ingress validate # cek sintaks config.yml
cloudflared tunnel ingress rule https://n8n.domainmu.com # lihat aturan mana yang cocok
Perintah kedua itu emas: ia menampilkan nomor aturan yang akan dipakai untuk URL tersebut. Kalau yang muncul ternyata catch-all http_status:404, berarti ada salah ketik di hostname — dan itu lebih baik kamu tahu sekarang daripada setelah tunnel dinyalakan.
Langkah 5: Jalankan Tunnel di Foreground
Sebelum dijadikan layanan permanen, jalankan dulu apa adanya supaya pesan error-nya kelihatan:
cloudflared tunnel run vps-donnebanget
Biarkan terminal itu terbuka, lalu dari laptopmu buka https://n8n.domainmu.com. Kalau halaman n8n muncul dan HTTPS-nya sah, berarti rantainya sudah benar. Ingin memastikan dari sisi VPS:
curl -I https://n8n.domainmu.com --resolve n8n.domainmu.com:443:$(dig +short n8n.domainmu.com | head -1)
cloudflared tunnel info vps-donnebanget # status dan jumlah koneksi ke edge
Langkah 6: Jadikan Layanan systemd Supaya Otomatis Jalan
Tunnel yang cuma dijalankan manual akan mati begitu SSH ditutup. Karena itu, pindahkan konfigurasi ke lokasi permanen dan pasang sebagai layanan:
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/config.yml ~/.cloudflared/<UUID>.json ~/.cloudflared/cert.pem /etc/cloudflared/
sudo sed -i 's|/root/.cloudflared|/etc/cloudflared|g' /etc/cloudflared/config.yml
sudo cloudflared service install
sudo systemctl enable --now cloudflared
systemctl status cloudflared --no-pager
sudo journalctl -u cloudflared -n 30 --no-pager
Yang perlu kamu lihat di log adalah baris Registered tunnel connection beberapa kali, satu per koneksi ke edge Cloudflare. Kalau barisnya tidak ada, hentikan dulu di situ — jangan lanjut ke aplikasi lain. Kalau config.yml disimpan di lokasi lain, sertakan flag --config /path/ke/config.yml saat memasang layanan, supaya unit systemd menunjuk file yang benar. Perlu diingat juga bahwa layanan ini berjalan sebagai root; kalau kamu ingin lebih ketat, buat user khusus lalu ubah direktif User= di unit-nya.
Alternatif: Tunnel dari Dashboard Zero Trust
Kalau kamu tidak suka mengurus file YAML di server, Cloudflare menyediakan jalur remotely-managed tunnel. Konfigurasinya disimpan di dashboard, dan VPS hanya butuh satu perintah berisi token:
- Masuk ke dashboard Cloudflare → Networking → Tunnels → Create a tunnel, pilih konektor Cloudflared, lalu beri nama.
- Pilih sistem operasi VPS-mu, salin perintah pemasangan yang muncul, dan jalankan di server. Bentuknya seperti
sudo cloudflared service install <TOKEN>. - Setelah tunnel terhubung (status hijau/Healthy), buka tab Routes → Add route → Published application, isi subdomain dan Service URL, misalnya
http://localhost:5678.
Enaknya, ubah rute cukup di dashboard tanpa menyentuh server. Kekurangannya, konfigurasinya tidak ikut tersimpan di repositori infrastrukturmu, dan token itu sendiri adalah rahasia yang tidak boleh bocor.
Tips Keamanan dan Kesalahan yang Paling Sering Terjadi
Tunnel membuat aplikasimu rapi, tapi bukan otomatis aman. Beberapa catatan yang layak dipegang:
- Aplikasi tetap harus bind ke localhost.
service: http://127.0.0.1:5678jauh lebih baik daripada membuka ke0.0.0.0. Kalau perlu, tutup port itu di firewall — tunnel tetap jalan. - Tunnel bukan pengganti autentikasi. Panel admin yang dipublikasikan tanpa login akan tetap terbuka untuk dunia. Tambahkan Cloudflare Access di depan hostname admin supaya hanya email tertentu yang boleh masuk.
- Waspadai tabrakan di YAML. Kesalahan paling umum adalah lupa catch-all dan memakai indentasi tab. Jalankan
cloudflared tunnel ingress validatesetiap kali selesai mengedit. - Jangan buat CNAME manual ke IP VPS. Ini keliru dan bisa membuat aplikasi bocor lewat jalur lain. Pakai
cloudflared tunnel route dns. - Simpan kredensial dengan aman. File
<UUID>.jsondancert.pemsetara dengan akses domainmu. - Quick tunnel hanya untuk uji coba. Mode tanpa konfigurasi ini memakai alamat acak
trycloudflare.comyang berubah setiap dijalankan — enak untuk demo cepat, bukan untuk layanan produksi.
Kesimpulan: Sekali Pasang, Banyak Manfaat
Cloudflare Tunnel di VPS mengubah cara kita berpikir soal mengekspos layanan: bukan lagi “buka port lalu berdoa”, tapi “biarkan server yang menghubungi dunia luar”. Dengan satu daemon, satu file config.yml, dan aturan ingress yang tepat, aplikasi seperti n8n, dashboard uptime, atau panel admin bisa diakses dari mana saja lewat HTTPS, tanpa satu port pun terbuka di VPS-mu.
Sobat Online, luangkan 10 menit hari ini untuk memasangnya di satu subdomain. Setelah rasanya berhasil, tambahkan subdomain kedua dan ketiga — dan kamu akan sadar bahwa mengekspos layanan self-hosted ternyata bisa tidak menakutkan. Selamat mencoba, dan bagikan hasilnya di kolom komentar!

