Paket 1 · Fondasi DevOpsModul G — Domain, Cloudflare & Reverse Proxy

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:80
  • cloudflared berjalan 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 --version

3. Autentikasi

cloudflared tunnel login

Perintah 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 list

Perintah 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:404

Aturan terakhir wajib ada sebagai fallback.

Opsi tambahan

originRequest:
  connectTimeout: 30s
  noTLSVerify: false
  httpHostHeader: app.example.com

6. Membuat DNS route

cloudflared tunnel route dns devops-lab app.example.com
cloudflared tunnel route dns devops-lab api.example.com

Cloudflare akan membuat record CNAME ke tunnel.

7. Menjalankan tunnel

Uji di foreground:

cloudflared tunnel run devops-lab

Jika berhasil, buka https://app.example.com.

Sebagai service

cloudflared service install
systemctl status cloudflared --no-pager
journalctl -u cloudflared -f

8. Tunnel berbasis token (dashboard)

Alternatif tanpa file kredensial lokal:

  1. Buka Cloudflare Zero Trust → Networks → Tunnels.
  2. Buat tunnel dan pilih Cloudflared.
  3. Salin token instalasi.
  4. Jalankan di server:
    cloudflared service install <TOKEN>
  5. 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 internal

Di config.yml:

ingress:
  - hostname: app.example.com
    service: http://localhost:80
  - service: http_status:404

Di 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

GejalaCek
502 Bad GatewayLayanan lokal tidak berjalan/port salah
Tunnel tidak connectInternet keluar, firewall, token
1033Tunnel tidak aktif
530DNS/route tunnel belum benar
WebSocket gagalDukungan WebSocket di origin
Aplikasi melihat IP salahHeader CF-Connecting-IP

Log:

journalctl -u cloudflared -n 100
cloudflared tunnel info devops-lab
cloudflared tunnel list

Uji layanan lokal:

curl -I http://localhost:80
curl -I http://10.10.10.11:3000

Praktik: menerbitkan aplikasi tanpa public IP

  1. Pastikan aplikasi berjalan di 10.10.10.11:3000.
  2. Pasang cloudflared di server yang dapat menjangkau aplikasi.
  3. Buat tunnel devops-lab.
  4. Atur ingress ke http://10.10.10.11:3000.
  5. Buat DNS route app.example.com.
  6. Jalankan sebagai service.
  7. Uji https://app.example.com.
  8. Pastikan tidak ada port 80/443 yang dibuka di router.

Ringkasan

  • Cloudflare Tunnel menghubungkan layanan lokal tanpa public IP atau port forwarding.
  • cloudflared membuka 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.

On this page