Cloudflare Tunnel untuk Server Tanpa Public IP
Menghubungkan aplikasi lokal ke internet melalui Cloudflare Tunnel tanpa membuka port atau memiliki public IP.
Cloudflare Tunnel membuat koneksi keluar dari server Anda ke Cloudflare. Tidak ada port masuk yang dibuka, sehingga cocok untuk server di balik NAT/CGNAT.
Cara kerja
User ──HTTPS──▶ Cloudflare Edge ──tunnel──▶ cloudflared ──▶ localhost:80cloudflaredberjalan di server dan membuka koneksi keluar ke Cloudflare.- Cloudflare meneruskan request dari domain Anda melalui tunnel.
- Tidak perlu port forwarding atau public IP.
- Sertifikat HTTPS ditangani di edge Cloudflare.
Tunnel vs reverse proxy
Tunnel menggantikan kebutuhan membuka port 80/443 ke internet. Reverse proxy seperti NPM tetap berguna untuk routing internal antar-aplikasi.
1. Prasyarat
- Domain sudah aktif di Cloudflare.
- Server dapat mengakses internet.
- Aplikasi berjalan di localhost atau IP internal.
2. Instalasi cloudflared
Debian/Ubuntu
mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
| tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' \
| tee /etc/apt/sources.list.d/cloudflared.list
apt update
apt install -y cloudflared
cloudflared --version3. Autentikasi
cloudflared tunnel loginPerintah menampilkan URL. Buka di browser, pilih domain, dan setujui. Sertifikat disimpan di
~/.cloudflared/cert.pem.
4. Membuat tunnel
cloudflared tunnel create devops-lab
cloudflared tunnel listPerintah membuat file kredensial di ~/.cloudflared/<UUID>.json. Catat UUID tunnel.
5. Konfigurasi ingress
Buat ~/.cloudflared/config.yml:
tunnel: <UUID-TUNNEL>
credentials-file: /root/.cloudflared/<UUID-TUNNEL>.json
ingress:
- hostname: app.example.com
service: http://localhost:80
- hostname: api.example.com
service: http://10.10.10.11:3000
- service: http_status:404Aturan terakhir wajib ada sebagai fallback.
Opsi tambahan
originRequest:
connectTimeout: 30s
noTLSVerify: false
httpHostHeader: app.example.com6. Membuat DNS route
cloudflared tunnel route dns devops-lab app.example.com
cloudflared tunnel route dns devops-lab api.example.comCloudflare akan membuat record CNAME ke tunnel.
7. Menjalankan tunnel
Uji di foreground:
cloudflared tunnel run devops-labJika berhasil, buka https://app.example.com.
Sebagai service
cloudflared service install
systemctl status cloudflared --no-pager
journalctl -u cloudflared -f8. Tunnel berbasis token (dashboard)
Alternatif tanpa file kredensial lokal:
- Buka Cloudflare Zero Trust → Networks → Tunnels.
- Buat tunnel dan pilih Cloudflared.
- Salin token instalasi.
- Jalankan di server:
cloudflared service install <TOKEN> - Atur public hostname di dashboard ke
http://localhost:80.
Pendekatan ini memudahkan pengelolaan dari dashboard, tetapi token harus dijaga seperti kredensial.
9. Integrasi dengan Nginx Proxy Manager
Pola umum:
Cloudflare Tunnel → NPM (localhost:80) → aplikasi internalDi config.yml:
ingress:
- hostname: app.example.com
service: http://localhost:80
- service: http_status:404Di NPM, buat proxy host app.example.com yang meneruskan ke 10.10.10.11:3000.
Jangan mengekspos port admin
Tunnel hanya untuk layanan yang memang publik. Jangan arahkan tunnel ke port admin (NPM 81, Proxmox 8006) tanpa autentikasi tambahan.
10. Troubleshooting
| Gejala | Cek |
|---|---|
502 Bad Gateway | Layanan lokal tidak berjalan/port salah |
| Tunnel tidak connect | Internet keluar, firewall, token |
1033 | Tunnel tidak aktif |
530 | DNS/route tunnel belum benar |
| WebSocket gagal | Dukungan WebSocket di origin |
| Aplikasi melihat IP salah | Header CF-Connecting-IP |
Log:
journalctl -u cloudflared -n 100
cloudflared tunnel info devops-lab
cloudflared tunnel listUji layanan lokal:
curl -I http://localhost:80
curl -I http://10.10.10.11:3000Praktik: menerbitkan aplikasi tanpa public IP
- Pastikan aplikasi berjalan di
10.10.10.11:3000. - Pasang
cloudflareddi server yang dapat menjangkau aplikasi. - Buat tunnel
devops-lab. - Atur ingress ke
http://10.10.10.11:3000. - Buat DNS route
app.example.com. - Jalankan sebagai service.
- Uji
https://app.example.com. - Pastikan tidak ada port 80/443 yang dibuka di router.
Ringkasan
- Cloudflare Tunnel menghubungkan layanan lokal tanpa public IP atau port forwarding.
cloudflaredmembuka koneksi keluar ke Cloudflare.- Ingress mengatur hostname ke layanan internal.
- Tunnel cocok dipadukan dengan NPM, tetapi jangan mengekspos port admin.
Selanjutnya
Deploy aplikasi Node.js di aaPanel dan Deployment Aplikasi Node.js.
SSL/HTTPS, Cloudflare Proxy, dan DNS Configuration
Mengatur sertifikat SSL, memilih mode SSL Cloudflare yang benar, serta menghindari mixed content dan redirect loop.
aaPanel dan Deployment Aplikasi Node.js
Memasang aaPanel, menyiapkan site Node.js, menjalankan aplikasi, serta mengatur reverse proxy dan SSL.