What It Is
Kerangka untuk memutuskan lapisan mana yang dipakai saat mengekspos service. Titik awalnya: nginx sering memainkan dua peran sekaligus, dan Cloudflare Tunnel hanya menggantikan salah satunya.
- Peran 1 — ingress publik (edge): menerima trafik dari internet, terminasi TLS, arahkan ke backend. Ini yang Tunnel gantikan.
- Peran 2 — router internal: membagi trafik ke banyak service di dalam (path routing, rewrite, load balancing antar replika, health check). Ini yang Tunnel tidak gantikan.
Karena satu nginx bisa merangkap keduanya, pertanyaan “Tunnel atau nginx?” sering salah bentuk. Yang benar: lapisan mana yang sedang dibicarakan.
How To Use
Empat pertanyaan yang menentukan pilihan:
- Siapa yang harus menjangkau apa? Internet → service publik (Tunnel/nginx edge). Hanya perangkat sendiri (Tailscale).
- Di mana TLS berakhir? Di edge Cloudflare, di nginx, atau di aplikasi.
- Ada IP publik dan DMZ? Ada → nginx edge tetap wajar. Tidak ada → Tunnel menghapus seluruh kebutuhan itu.
- Trafiknya utara-selatan atau timur-barat? Dari luar ke dalam = urusan edge. Antar-service di dalam = urusan router internal, Cloudflare tidak ikut campur.
| Situasi | Alat |
|---|---|
| Service publik, tanpa IP publik / tidak mau buka port | Cloudflare Tunnel |
| Service publik, ada IP publik + kontrol firewall sendiri | nginx di edge |
| Beberapa service di satu hostname (path routing) | bisa Tunnel (field Path), atau Caddy/nginx |
| Butuh rewrite path / manipulasi header | nginx atau Caddy — Tunnel tidak bisa |
| Load balancing antar replika + health check | nginx, Caddy, Traefik |
| Non-HTTP (SSH, RDP, DB) | Tunnel (+ Access), atau Tailscale |
| Antar-service internal (timur-barat) | Docker DNS, service mesh, nginx internal |
| Akses berbasis identitas, bukan aturan IP | Cloudflare Access, Tailscale ACL |
Details
Kapan Tunnel yang tepat
- Tidak ada IP publik, atau sengaja tidak mau membukanya
- Mau nol port terbuka — origin tidak bisa dijangkau langsung dari internet, jadi permukaan serangnya mengecil secara struktural
- Ingin akses ditentukan identitas (Access: email/SSO), bukan aturan IP
- Butuh protokol non-HTTP: SSH, RDP, TCP, Unix socket
- Skala kecil-menengah, satu host, banyak subdomain
Yang sudah dipindahkan dari nginx ke edge Cloudflare
- Terminasi TLS (Universal SSL gratis, auto-renew)
- WAF, DDoS protection, caching
- Rate limiting, header via Transform Rules
- Autentikasi via Access
Artinya alasan lama “perlu nginx untuk kompresi / rate limit / header keamanan” sebagian besar sudah tersedia gratis di depan tunnel.
Yang tetap tidak bisa dilakukan Tunnel
- Rewrite path —
/apidi klien tidak bisa diubah menjadi/di backend;Locationheader tidak bisa dimanipulasi - Load balancing dengan health check antar replika
- Multiplexing protokol di satu port
- Kontrol L7 detail: timeout per-route,
proxy_protocol, mTLS antar internal
Kompromi memakai Cloudflare
- Trafik melewati pihak ketiga (untuk data internal sensitif, ini sering alasan sah untuk tidak memakainya)
- Ada batas paket gratis dan biaya per-request untuk fitur lanjutan
- Dependensi vendor, dan debug dilakukan lewat dashboard, bukan langsung di mesin
- Trafik internal yang tidak boleh keluar jaringan sendiri tidak boleh dirutekan lewat sini
Pola paling umum di produksi
Internet → Cloudflare edge (WAF, TLS, cache, Access)
↓ tunnel (koneksi keluar, tanpa port terbuka)
nginx/Caddy di dalam (routing, rewrite, LB)
↓
aplikasi
Yang berubah dibanding arsitektur kantor bukan kemampuan nginx, tapi titik terminasi TLS dan titik kepercayaan.
Kenapa kantor memakai nginx — alasan yang tetap sah
- Sudah punya IP publik dan kontrol firewall, jadi edge sendiri lebih murah dan tanpa dependensi tambahan
- Data tidak melewati pihak ketiga
- Kemampuan debug langsung (
nginx -T, log lokal, tcpdump) - Ops sudah punya ototnya; mengganti berarti melatih ulang tim untuk manfaat yang tidak sepadan
Peta alat per kategori
- Edge / TLS / WAF: Cloudflare, nginx, AWS ALB
- Ingress publik tanpa IP publik: Cloudflare Tunnel, Tailscale Funnel, ngrok
- Router internal / path routing / LB: nginx, Caddy, Traefik, Envoy
- Mesh antar-service (timur-barat): Istio, Linkerd, Tailscale, Consul
- Akses berbasis identitas: Cloudflare Access, Tailscale ACL, zero-trust VPN
Istilah yang perlu dikuasai
- North-south vs east-west: trafik masuk-keluar vs antar-service. Beda pemilik, beda alat.
- TLS termination: titik di mana enkripsi dilepas. Menentukan siapa yang melihat isi trafik.
- Origin: server sebenarnya di belakang proxy/edge.
- Perimeter vs zero-trust: kepercayaan berbasis lokasi jaringan vs berbasis identitas tiap request.
Examples
Latihan bertahap di lab sendiri (urutan ini mengajarkan paling banyak)
- Tahap 1 — tunnel → satu service (
uptime-kuma). Satu hostname, nol port terbuka. Yang dipelajari: ingress publik tanpa exposur. - Tahap 2 — tambah aplikasi kedua di subdomain lain. Perhatikan: tidak ada konfigurasi baru di sisi server selain satu entry dashboard. Yang dipelajari: satu tunnel melayani banyak hostname.
- Tahap 3 — paksa dua service masuk satu hostname dengan path (
/kuma,/app). Di sini akan menabrak batas: aplikasi mengharapkan path yang berbeda dan tunnel tidak bisa rewrite. Solusinya Caddy atau nginx di belakang tunnel. Setelah mengalami sendiri, konsep “edge vs router” jadi konkret.
Pola yang dipakai di lab ini
- Setiap aplikasi = satu direktori
/srv/apps/<nama>+ satu subdomain di tunnel - Service URL di tunnel memakai nama container, bukan
localhost, kalau cloudflared berada di network Docker yang sama - Port service tetap dipublikasikan ke
127.0.0.1saja; jalan masuk satu-satunya adalah tunnel
Catatan teknis Cloudflare Tunnel
- Satu tunnel melayani banyak hostname — bukan satu tunnel per aplikasi
- Ingress rule dievaluasi dari atas ke bawah; tidak ada yang cocok →
404 - Rule bisa mencocokkan hostname dan path (regex Go), jadi path routing sederhana bisa tanpa nginx
- DNS dibuat otomatis: CNAME ke
<UUID>.cfargotunnel.com cloudflared tunnel loginmemakai callback ke localhost, jadi gagal di VPS headless — untuk server, pakai tunnel remotely-managed dari dashboard dan jalankan dengan token
Links
- Cloudflare Tunnel routing: https://developers.cloudflare.com/tunnel/routing
- Configuration file (path matching, protokol): https://developers.cloudflare.com/tunnel/advanced/local-management/configuration-file
- Zero Trust Access: https://developers.cloudflare.com/cloudflare-one/
- nginx reverse proxy: https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/