TDCTF Academy Logo TDCTF ACADEMY

Setup Cloudflare Tunnel

Apa itu Cloudflare Tunnel?

Cloudflare Tunnel (dulu bernama Argo Tunnel) adalah cara untuk mengekspos server lokal ke internet tanpa perlu membuka port di firewall atau melakukan port forwarding di router.

Perbandingan: Tunnel vs Port Forwarding

Aspek Port Forwarding Cloudflare Tunnel
Buka port di firewall ✅ Ya ❌ Tidak perlu
IP publik statis ✅ Diperlukan ❌ Tidak perlu
SSL/TLS ❌ Manual ✅ Otomatis
Proteksi DDoS ❌ Tidak ✅ Ya
Hide IP asli ❌ Tidak ✅ Ya
Konfigurasi Sederhana Sedang
Cocok untuk Lab lokal, testing Production, production-like

Instalasi cloudflared

Di Linux (Ubuntu/Debian)

# Download dan install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o /tmp/cloudflared.deb
sudo dpkg -i /tmp/cloudflared.deb

# Verifikasi
cloudflared version

Atau via Package Manager

# Download binary langsung
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared

Login & Autentikasi

cloudflared tunnel login

Perintah ini akan:

  1. Membuka browser untuk login ke akun Cloudflare
  2. Meminta izin akses ke domain yang kamu kelola
  3. Menyimpan sertifikat di ~/.cloudflared/cert.pem
tip

Jika bekerja di server tanpa browser (SSH), gunakan cloudflared tunnel login lalu buka URL yang muncul di browser lokalmu.

Membuat Tunnel Baru

# Buat tunnel dengan nama
cloudflared tunnel create nama-tunnel-ku

# Output contoh:
# Created tunnel nama-tunnel-ku with id abc123-def456-...
# Credentials file created at: /home/user/.cloudflared/abc123-def456-....json

Melihat Daftar Tunnel

cloudflared tunnel list

Output:

ID NAME STATUS
abc123-def456-7890-aaaa-bbbbcccc nama-tunnel-ku active
xyz789-... tunnel-lama inactive

Konfigurasi Ingress Rules

Buat file config.yml di ~/.cloudflared/config.yml:

tunnel: abc123-def456-7890-aaaa-bbbbcccc
credentials-file: /home/user/.cloudflared/abc123-def456-7890-aaaa-bbbbcccc.json

ingress:
# Service 1: Web app di port 8080
- hostname: app.domain.com
service: http://vuln.cybersecurity.or.id

# Service 2: API di port 3000
- hostname: api.domain.com
service: http://localhost:3000

# Service 3: SSH via tunnel
- hostname: ssh.domain.com
service: ssh://localhost:22

# Service 4: TCP generic (database)
- hostname: db.domain.com
service: tcp://localhost:3306

# Default fallback - 404 jika tidak ada hostname yang cocok
- service: http_status:404

Multi-Service dalam Satu Tunnel

Kamu bisa mengekspos banyak service dalam satu tunnel seperti contoh di atas. Cukup atur hostname berbeda untuk setiap service.

tip

Gunakan http_status:404 sebagai ingress terakhir untuk mencegah akses ke service yang tidak terdaftar.

Validasi Konfigurasi

cloudflared tunnel validate --config ~/.cloudflared/config.yml

Routing DNS

Setelah tunnel aktif, arahkan DNS domain ke tunnel:

# Route subdomain ke tunnel
cloudflared tunnel route dns nama-tunnel-ku app.domain.com
cloudflared tunnel route dns nama-tunnel-ku api.domain.com
cloudflared tunnel route dns nama-tunnel-ku ssh.domain.com

Ini secara otomatis membuat record DNS CNAME di Cloudflare yang mengarah ke *.nama-tunnel-ku.cfargotunnel.com.

Menjalankan Tunnel

Manual (Testing)

cloudflared tunnel run nama-tunnel-ku

Sebagai Systemd Service (Auto-start)

# Install service systemd
sudo cloudflared service install

# Atau buat manual
sudo cloudflared tunnel install --name nama-tunnel-ku --config ~/.cloudflared/config.yml

Lalu kelola seperti service biasa:

sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared
sudo systemctl restart cloudflared
sudo systemctl stop cloudflared

Melihat Log

sudo journalctl -u cloudflared -f

Atau jika ingin log lebih detail:

cloudflared tunnel run nama-tunnel-ku --loglevel debug

Perintah Penting

Perintah Deskripsi
cloudflared tunnel list Lihat semua tunnel
cloudflared tunnel create <nama> Buat tunnel baru
cloudflared tunnel delete <nama> Hapus tunnel
cloudflared tunnel cleanup <nama> Bersihkan DNS records yang tidak terpakai
cloudflared tunnel info <nama> Detail tunnel
cloudflared tunnel route dns <nama> <domain> Route DNS ke tunnel
cloudflared tunnel run <nama> Jalankan tunnel
cloudflared tunnel validate -c config.yml Validasi konfigurasi
cloudflared tunnel login Login ke Cloudflare
cloudflared tunnel token <nama> Dapatkan token tunnel

Troubleshooting

1. Error 502 Bad Gateway

Artinya cloudflared berhasil terhubung ke Cloudflare, tapi service lokal tidak merespon.

# Cek apakah service lokal berjalan
curl http://vuln.cybersecurity.or.id

# Cek log tunnel
sudo journalctl -u cloudflared -f --no-pager | grep -i error

Penyebab umum:

  • Service lokal mati atau crash
  • Bind address service hanya ke 127.0.0.1 - harus ke 0.0.0.0
  • Port salah di config.yml

2. Tunnel Down / Tidak Bisa Connect

# Cek status tunnel
cloudflared tunnel list

# Restart service
sudo systemctl restart cloudflared

# Cek koneksi internet
ping -c 3 1.1.1.1

3. DNS Tidak Merespon

# Verifikasi record DNS
dig app.domain.com +short

# Cek routing tunnel
cloudflared tunnel route dns nama-tunnel-ku app.domain.com

# Route ulang jika perlu

4. SSL Error di Browser

Pastikan di Cloudflare Dashboard:

  • SSL/TLS → Overview set ke Full (strict)
  • SSL/TLS → Edge Certificates pastikan ada certificate untuk domainmu

5. Permission Denied pada Credentials File

# Pastikan file credentials terbaca oleh user yang menjalankan cloudflared
chmod 600 ~/.cloudflared/*.json

Multiple Tunnels untuk Service Berbeda

Kadang lebih baik menggunakan tunnel terpisah untuk environment berbeda:

# Tunnel untuk production
cloudflared tunnel create production-tunnel

# Tunnel untuk staging
cloudflared tunnel create staging-tunnel

Masing-masing punya config.yml dan systemd service sendiri.

Kesimpulan

Cloudflare Tunnel adalah solusi modern untuk mengekspos service lokal ke internet dengan aman, tanpa ribet setup firewall, port forwarding, atau sertifikat SSL manual.

Keuntungan utama:

  • ✅ Tidak perlu buka port di firewall
  • ✅ SSL otomatis dari Cloudflare
  • ✅ Proteksi DDoS bawaan
  • ✅ Hidden IP asli server
  • ✅ Bisa expose banyak service dengan satu tunnel

Workflow cepat untuk memulai:

# 1. Install
sudo dpkg -i cloudflared.deb

# 2. Login
cloudflared tunnel login

# 3. Buat tunnel
cloudflared tunnel create tunnel-ku

# 4. Konfigurasi (edit ~/.cloudflared/config.yml)

# 5. Route DNS
cloudflared tunnel route dns tunnel-ku app.domain.com

# 6. Install & start service
sudo cloudflared service install
sudo systemctl enable --now cloudflared

Dengan Cloudflare Tunnel, lab lokal kamu bisa diakses dari mana saja dengan aman dan mudah!

PADA HALAMAN INI