Cloudflare Tunnel untuk Self Hosting

Saya sudah memakai Cloudflare sejak sekitar 10 tahun yang lalu dan tiap tahun biasanya selalu ada fitur baru. Tahun 2020, Cloudflare memperkenalkan Cloudflare Tunnel, yang salah satu kegunaanya adalah untuk membuat situs lokal kita bisa diakses internet. Ada banyak kegunaan lainnya, misalnya bisa untuk melakukan SSH atau remote desktop ke mesin lokal dari Internet atau untuk mengakses intranet, tapi yang akan saya bahas di tulisan ini hanya untuk web hosting saja.

Tunnel cloudflare

Saya sudah pernah menjelaskan apa itu Cloudflare Tunnel di posting Blog ini sekarang bertenaga surya. Secara singkat: salah satu kegunaan Cloudflare Tunnel adalah membuat website di server internal (tidak memiliki IP public) bisa diakses dengan nama domain publik. Caranya dengan menjalankan program cloudflared yang akan melakukan koneksi ke server cloudflare dan koneksi dari IP publik akan masuk melalui cloudflared.

Ini berarti:

  • Tidak mungkin salah konfigurasi sehingga website bisa diakses melalui public IP membypass cloudflare (karena web servernya memang tidak punya IP publik)
  • Kita bisa memakai server di rumah yang memakai dynamic IP (atau bahkan di Android dengan termux)

Selain itu Cloudflare tunnel mendukung autentikasi, jadi misalnya sebuah website punya area /admin yang hanya boleh diakses admin. Kita bisa mensetup agar ketika diakses akan muncul halaman autentikasi dari cloudflare.

Autentikasi Cloudflare bisa berdasarkan email, melalui login Google, login Github ataupun yang lain. Ini merupakan layer keamanan tambahan, andaikan penyerang ingin membrute force password, atau ada kelemahan SQL Injection atau yang lain di halaman login admin, maka penyerang harus bisa membypass dulu autentikasi dari Cloudflare.

Web Server

Saya tidak akan menjelaskan panjang lebar di sini mengenai web server. Ini adalah software yang perlu diinstall agar komputer (bisa server, PC, laptop, atau bahkan ponsel) bisa menerima request dari browser dan memberikan balasan.

Sebelum mencoba tunnel, pastikan bahwa web servernya memang sudah berjalan, dan bisa menerima request. Untuk percobaan, kita bisa memakai server built in Python

python -m http.server (Python 3, untuk python 2.x gunakan SimpleHTTPServer):

Atau jika ingin memakai PHP (minimum PHP 5.4)

php -S localhost:9000

Quick Tunnel

Jika sekedar ingin testing singkat, mode ini paling gampang. Tanpa perlu registrasi, cukup dengan mendownload cloudflared dan satu perintah, kita akan diberi URL publik yang random (tidak bisa dipilih) untuk mengakses web server lokal milik kita.

Untuk quick tunnel, kita tidak perlu punya nama domain sendiri. Kelemahannya adalah: ini sekali pakai saja. Setelah disconnect, kita akan diberi URL baru dan URL lama tidak bisa diakses.

Satu perintah yang perlu dijalankan (sesuaikan localhost dengan alamat IP yang ingin diakses):

cloudflared tunnel --url localhost:9000

Contoh tunnel yang berjalan di Windows

Setelah itu kita bisa mengunjungi webnya:

Diakses dari cloudflare

Selama window tunnelnya belum ditutup, dan kita masih terhubung ke internet, maka siapapun bisa mengunjungi URL tersebut.

Tunnel Biasa

Selain Quick Tunnel, ada tunnel biasa di mana kita bisa memakai nama domain yang kita miliki. Untuk membuat tunnel biasa, prosesnya agak lebih panjang. Pertama nama domain kita harus memakai DNS-nya Cloudflare. Untuk memakai DNS Cloudflare kita harus mendaftar dulu akun Cloudflare .

Cara termudah agar nama domain memakai DNS-nya Cloudflare adalah dengan membeli domain langsung di Cloudflare. Cara lainnya adalah dengan membeli dari registrar lain, menambahkan domainnya di Cloudflare lalu mengikuti petunjuk pergantian DNS-nya.

Bagian kedua adalah mensetup tunnelnya. Tunnel ini yang akan menghubungkan aplikasi lokal ke Cloudflare. Tunnel terdiri dari dua bagian: konfigurasi tunnel di dashboard Cloudflare dan aplikasi tunnel (cloudflared) yang perlu diinstall di server/komputer.

Tunnel ini bisa diinstall di komputer manapun yang bisa mengakses aplikasi web lokal yang ingin ditunnel. Jadi misalnya aplikasi web ada di server B, dan server A bisa mengakses server B, maka tunnel bisa diinstal baik di server A ataupun B atau bahkan dua-duanya.

Konfigurasi tunnel ada di menu Zero Trust

Setelah domain ditambahkan, kita bisa pergi ke menu Zero Trust. Setelah itu pilih menu Access, lalu Tunnels.

Hanya bagian “Access” yang akan dibahas di tulisan ini

Pilih Create Tunnel, dan beri nama tunnelnya. Pilih Save Tunnel untuk masuk ke langkah berikutnya. Di layar ini kita diminta memilih sistem operasi dan arsitektur komputer kita.

Di bawahnya akan terlihat instruksi instalasi cloudflare daemon, dan bagaimana menjalankan cloudflarenya. Instruksinya mudah diikuti, hanya satu perintah untuk menjalankan tunnelnya: cloudflared service install <KODEBASE64>.

Bagian terakhir adalah mensetup koneksi aplikasinya. Aplikasi di sini bisa aplikasi web, ssh, atau yang lain. Seperti sudah saya jelaskan sebelumnya, fokus saya hanya pada aplikasi web. Di sini saya mensetup agar: merdeka.17081945.xyz akan mengakses webserver lokal di port 80. Abaikan peringatan: “No DNS record found for this domain”, karena subdomainnya akan otomatis diciptakan.

Sebagai catatan, untuk contoh di atas, saya memakai konfigurasi nginx seperti ini.

server {
    listen localhost:80;
    server_name merdeka.17081945.xyz;

    location / {
        try_files $uri $uri/ =404;
        root /var/www/merdeka;
        index index.html;
    }
}

Artinya: server ngnix bisa dibatasi untuk mendengarkan di localhost saja. Dalam contoh ini cloudflared berjalan di host yang sama dengan web server. Jika konfigurasi default site juga diset hanya listen ke localhost, maka ketika server ini di-portscan dari dalam jaringan yang sama, maka tidak terlihat bahwa ada web server di komputer ini walaupun server ini bisa diakses dari internet.

Sebagai catatan: nama domain xyz yang hanya terdiri dari angka sebanyak 6 sampai 9 digit harganya cuma 1 USD per tahun. Domain ini cocok untuk eksperimen, tapi hati-hati jika dipakai untuk komersial, karena TLD xyz ini sering diblokir di banyak tempat.

Tunnel dengan autentikasi

Tunnel yang dibuat sebelumnya sifatnya publik (bisa diakses semua orang), dan cocok untuk website umum. Cloudflare juga mendukung tunnel ke website yang dilindungi dengan autentikasi. Autentikasi ini bisa diset untuk keseluruhan website, atau URL tertentu saja.

Autentikasi paling gampang adalah dengan email: jadi kita masukkan email kita, nanti akan ada URL yang dikirim ke email dan perlu diklik untuk mengakses aplikasinya. Kita bisa mensetup autentikasi ekstra, misalnya login dengan akun github atau akun Google.

Setup autentikasi aplikasi ada di link Applications. Untuk aplikasi web, pilih Self Hosted. Halaman pertama adalah URL yang ingin dilindungi:

Di halaman berikutnya, kita perlu menyatakan: siapa yang boleh mengakses aplikasi ini.

Halaman lainnya biasanya tidak perlu diedit konfigurasinya, defaultnya sudah OK untuk berbagai aplikasi standard. Jika ada konfigurasi khusus, maka perlu dikonfigurasi sesuai aplikasinya.

Setelah selesai, ketika mengakses https://merdeka.17081945.xyz/rahasia/ akan muncul halaman autentikasi dari Cloudflare. Kalau misalnya halaman yang diproteksi juga memiliki autentikasi tambahan (biasanya halaman admin ada permintaan user/password), maka autentikasi cloudflare ini akan muncul dulu.

Contoh halaman autentikasi ketka mengakses https://merdeka.17081945.xyz/rahasia/

Penutup

Menurut saya saat ini Cloudflare tunnel adalah cara termudah mensetup website yang aman. Cloudflare bisa memblok banyak serangan, dan ada autentikasi ekstra untuk melindungi bagian website yang diangap rentan. Saat ini juga tidak ada batasan bandwidth yang dipakai situs kita.

Sebagai catatan ketika memakai layanan third party apapun, harap diperhatikan jika ada perubahan terhadap term of servicenya. Saat ini, Cloudflare tidak mencharge apapun juga, tapi tidak tertutup kemungkinan suatu hari ini akan berubah. Jika suatu saat ini berubah, saya akan menggunakan cara lain untuk mengekspose aplikasi lokal ke Internet.

2 thoughts on “Cloudflare Tunnel untuk Self Hosting”

  1. Menarik, baru tau ternyata ada layanan macam ini. Terimakasih sharingnya Mas.

  2. Saya baru tahu CF tunnel ini, terima kasih informasinya, Mas.

    Satu atau dua tahun yang lalu, saya menggunakan custom script dari Github untuk mengubah A record subdomain saya di Cloudflare agar mengarah ke IP publik raspi saya di rumah. Script ini saya jalankan setiap 1 jam untuk mengantisipasi perubahan IP publik koneksi internet di rumah.

    Raspi tersebut kemarin mati karena micro SD card-nya rusak dan belum sempat saya backup. Akan saya coba pakai CF tunneling ini agar raspinya bisa kembali diakses dari internet.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.