evilfactorylabs

Cover image for Mengekspos layanan web di rumah ke internet melalui Cloudflare
Rizaldy
Rizaldy

Posted on

Mengekspos layanan web di rumah ke internet melalui Cloudflare

Pada hari Sabtu kemarin gue menerbitkan tulisan berjudul Expose web services at home via Tailscale for fun
yang ditulis menggunakan bahasa Inggris seadanya. Tulisan tersebut lumayan mendapatkan perhatian sampai permintaan masuk pada hari itu sebanyak 6.13k.

Yang sedikit menariknya, situs gue tersebut (init8.lol) berjalan di NAS gue yang ada di rumah yang menggunakan jaringan Biznet dengan kecepatan 50Mbps yang digunakan oleh ~20 orang. Situs tersebut berada dibelakang reverse proxy yang per gue menulis tulisan ini proxy tersebut berada di Raspberry Pi gue.

Dan yang berarti, Raspberry Pi gue (dan atau NAS ala-ala gue) sanggup memproses permintaan masuk sebesar 6.13k pada saat itu (yang dengan hitungan kasar berarti hanyalah 4 req/menit). Tapi intinya, pada hari itu Raspi dan router gue tidak meninggal!

Anyways, disini gue ingin berbagi tentang bagaimana mengekspos layanan web di rumah ke internet dengan bantuan jaringan (dan platform) nya Cloudflare. Jika lo menjalankan Raspberry Pi di rumah dan ingin layanan yang ada di raspi tersebut di-expose untuk pengguna internet, mungkin tulisan ini bisa menjadi referensi.

Rancangan

Sebelumnya gue menggunakan pendekatan seperti ini:

https://init8.lol/wp-content/uploads/2021/10/Untitled-2021-10-16-0110-2.png

Dan itu bekerja sampai hari ini. Tapi bandwidth sampai hari ini tidaklah murah, khususnya untuk egress bandwidth. Untuk kasus gue, ada Reverse Proxy nya Cloudflare di depan aplikasi gue (init8.lol). Yang berarti, untuk kasus gue, diagram nya menjadi seperti ini:

Diagram baru

Yang padahal bisa seperti ini:

Diagram paling baru

Sebagaimna seperti tipikal aplikasi biasa yang menggunakan jaringan Cloudflare didepannya. Permintaan masuk ke Redis (Upstash) per gue mengetik ini sudah sampai 13,430 yang meskipun masih kecil (dan dibawah $1) tapi poinnya adalah angka tersebut akan terus naik selama gue menggunakannya.

Rancangan jaringan yang akan kita buat adalah seperti ini:

Rancangan

Sangat sederhana, bukan?

Setup

Pertama lo harus memiliki akun di Cloudflare dan domain lo harus diatur oleh DNS server nya Cloudflare (untuk menggunakan fitur reverse proxy nya).

Kedua, di jaringan rumah lo harus terpasang reverse proxy (cocok untuk yang males kek gue). Di gue reverse proxy nya berada di raspi gue dan alasan gue menggunakan reverse proxy lagi adalah agar bisa dapat access log dan di generate sama si goaccess tiap 5 menit.

Ketiga, harus memasang program cloudflared di mesin yang ingin digunakan (raspi). Jika 3 kewajiban diatas sudah terpenuhi, mari kita buat tunnel.

Pertama hubungkan dulu mesin yang dipasang cloudflared dengan akun Cloudflare lo dengan perintah cloudflared login dan pilih domain apapun yang ada di layar.

Jika sudah, buat tunnel pertama lo dengan perintah:

cloudflared tunnel create <name>
Enter fullscreen mode Exit fullscreen mode

Silahkan isi name dengan nama yang kalian sayang dan cinta.

Jika sudah, akan ada berkas baru yang biasanya berada di ~/.cloudflared/<uuid>.json yang mana uuid tersebut mengarah ke tunnel ID lo.

Jalankan cloudflared tunnel run <name>, dan arahkan domain yang lo inginkan ke <tunnel_id>.cfargotunnel.com di DNS lo, dan silahkan akses alamat domain tersebut di peramban kesayangan lo. Jika muncul gambar yang intinya ada error tunnel blablabla, berarti tunnel kita berhasil berjalan dan waktunya membuat konfigurasi untuk ingress rule!

Konfigurasinya sederhana, kalau gue seperti ini kurang lebih:

tunnel: <tunnel_id>
credentials-file: /home/dietpi/.cloudflared/<tunnel_id>.json

ingress:
  - service: http://localhost:80
Enter fullscreen mode Exit fullscreen mode

Disitu gue menggunakan rule "catch all" karena validasi hostname berada di level Nginx gue. Jika sudah dibuat konfigurasi tersebut (misal disimpan di /etc/cloudflared/config.yml) jalankan tunnel dengan perintah cloudflared tunnel --config /etc/cloudflared/config.yml run <name> dan test ingress rule (yang misalnya untuk domain init8.lol) berarti:

cloudflared tunnel ingress rule https://init8.lol
Enter fullscreen mode Exit fullscreen mode

Keluaran di gue kurang lebih seperti ini:

Using rules from /etc/cloudflared/config.yml
Matched rule #1
    service: http://localhost:80
Enter fullscreen mode Exit fullscreen mode

Yang artinya Nginx (reverse proxy yang gue pakai) siap mengatur permintaan yang masuk! Konfigurasi minimal salah satu layanan web gue (Wordpress) adalah seperti ini:

server {
  listen [::]:80;

  server_name init8.lol;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;

    proxy_pass http://192.168.1.103;
  }
}
Enter fullscreen mode Exit fullscreen mode

Yang mana berada di /etc/nginx/sites-enabled. Untuk alamat IP 192.168.1.103 adalah IP nya salah satu instance wordpress gue yang berada di jail dan permintaan masuk ke port 80 diatur oleh Apache.

Jika dirasa sudah oke, bisa jalankan cloudflared sebagai systemd services dengan perintah:

cloudflared service install
Enter fullscreen mode Exit fullscreen mode

Pastikan current user yang menjalankan perintah tersebut memiliki privilej untuk membaca & menulis ke /etc/cloudflared dan /etc/systemd/system.

Hasil

Jika kamu mengakses tautan di awal tulisan (yang mengarah ke blog gue), blog tersebut sudah menggunakan Cloudflare tunnel untuk menghubungkan pengguna internet ke layanan yang ada di rumah gue.

Tidak semua layanan yang ada di rumah gue menggunakan Cloudflare tunnel ini, sejauh ini baru:

  • Salah satu blog Wordpress gue
  • Radicale
  • Minio
  • Gitea

Yang akan terus bertambah seiring gue migrasi dari menggunakan VPS somewhere di Singapore ke "server rumah" gue.

Tujuan utamanya cuma biar data yang gue miliki berada dan tersimpan di mesin yang ada di rumah, bukan di mesin orang lain yang berada di somewhere in cloud.

Caveats

Ada beberapa hal yang gue rasa perlu diketahui. Pertama dan yang paling utama mari kita berbicara tentang keamanan terlebih dahulu.

Hal utama yang dijual oleh Cloudflare adalah sebuah reverse proxy, Cloudflare adalah salah satu MiTM terbesar yang menjadi gatekeeper di internet. Bagian menariknya ada disini:

Cloudflare MiTM

Sudah menjadi rahasia umum jika pekerjaan "reverse proxy" salah satunya adalah untuk melakukan TLS termination. Namun diagram diatas hanya berlaku bila pengguna menggunakan Flexible SSL yang ditawarkan oleh Cloudflare.

Tapi bukan itu poinnya.

Poin utama dari HTTPS adalah untuk memastikan bahwa klien berkomunikasi langsung dengan server yang dituju dengan menggunakan end-to-end encryption sehingga siapapun yang berada di jaringan tersebut tidak bisa mengintip apalagi memodifikasi paket yang ditukar.

Dengan menggunakan reverse proxy nya Cloudflare, kita harus percaya kepada Cloudflare dalam merutekan paket yang dikirim dari klien ke server kita. Seperti, bila pengguna mengakses init8.lol, gue harus percaya bahwa Cloudflare membuat sambungan yang aman dari server Cloudflare ke server gue yang ada di rumah.

Tapi sekali lagi, bukan itu poinnya.

Melainkan, kita harus mempercayai Cloudflare, Inc.

Gue pernah berada di kondisi skeptis terhadap Cloudflare bahkan dari sebelum mereka IPO. Menyertakan Cloudflare di infrastruktur internet kita berarti kita telah memposisikan Cloudflare di posisi yang sangat krusial.

Pertama, sentralisasi. Jika Cloudflare (atau DNS nya) down (salah satu, sebagian ataupun sepenuhnya), maka besar kemungkinan layanan kita pun tidak bisa diakses (dan besar kemungkinan sebagian besar internet down).

Kedua, keamanan & privasi. Cloudflare secara teknis dapat membaca paket yang dikirim dari klien ke server kita karena TLS termination terjadi di server nya Cloudflare (khususnya karena kita menggunakan layanan reverse proxy yang ditawarkan oleh Cloudflare).

Satu-satunya cara untuk membuat Cloudflare tidak melakukannya (alias paket TCP dikirim ke origin/server kita "as is") adalah dengan menggunakan Cloudflare Spectrum yang tentu terlalu overkill untuk skala rumahan khususnya dalam konteks yang ada di tulisan ini.

Gue somehow percaya dengan apa yang Cloudflare janjikan khususnya terkait kebijakan privasi yang mereka miliki berikut dengan usaha mereka dalam terus membuat internet menjadi lebih aman, pribadi, cepat, dan dapat diandalkan.

Dan juga Cloudflare adalah perusahaan publik, mungkin itu bisa menjadi nilai tambah juga.

Terakhir, kebergantungan. Meskipun pada akhirnya "independen" adalah hal yang sangat sulit dilakukan di jaringan internet. Di internet, kita akan selalu bergantung dengan pihak lain. Dari ISP, IXP dan bahkan ICANN yang mengelola root name server.

Satu-satunya cara untuk keluar dari kebergantungan ini adalah dengan membuat jaringan yang "peer-to-peer" tapi itu pembahasan lain.

Kesimpulan

Dengan menggunakan pendekatan diatas, ada beberapa hal yang yang ingin gue capai:

  • Menghilangkan lapisan yang bertindak sebagai "proxy server" yang gue kelola hanya untuk menghubungkan pengguna internet dengan jaringan pribadi gue
  • Menghilangan pemeliharaan terkait "TLS Certificate" yang sebelumnya dikelola oleh Caddy Web Server yang gue jalankan
  • Mengurangi biaya bandwidth dan latensi. Ini lumayan brengsek sih, khususnya untuk yang pakai "consumer VPN" nya Cloudflare yakni Cloudflare Warp. Gue harap Cloudflare Warp ini bukan satu-satunya VPN yang ada di pasar yang berada (ataupun peering) di/dengan jaringannya Cloudflare

Dan yang paling penting tidak perlu Dynamic DNS dan berurusan dengan NAT nya ISP hanya untuk meng-expose layanan yang ada di jaringan rumah gue ke internet.

Dengan kata lain: sudah tidak perlu menyewa alamat IP publik hanya agar pengguna internet dapat mengakses server yang gue kelola!

Penutup

Gue menggunakan Tailscale (Wireguard) di jaringan rumah gue. Jika sebelumnya gue gunakan juga untuk menghubungkan beberapa hal yang ada di jaringan rumah gue ke jaringan internet, sekarang gue kembalikan ke fitrahnya lagi yakni sebagai VPN.

Ketika gue berada diluar (Starbucks misalnya) gue tidak bisa mengakses Pi-hole yang ada di rumah gue dan memang gue tidak ingin meng-expose nya ke jaringan internet karena sebuah alasan. Dengan VPN, gue masih bisa mengaksesnya dimanapun (dan di banyak kasus terjadi secara peer-to-peer) tanpa perlu khawatir perangkat gue berurusan dengan traffic internet yang masuk.

Dan juga, sometimes VPN is nice for sharing something with someone you really care and nobody else. Gue ada blog pribadi yang hanya bisa diakses oleh mereka yang berada di jaringan 192.168.1.0/24, dan dengan VPN (Tailscale), siapapun yang berada di jaringan tersebut bisa mengakses keseluruhan subnet gue tersebut dimanapun.

Maksud gue menulis 3 paragraf diatas adalah dengan menggunakan Cloudflare tunnel ini bukan berarti untuk menghilangkan instalasi VPN yang sudah ada (sebagaimana yang di-iklankan oleh Cloudflare itu sendiri) yang meskipun secara teknis bisa dilakukan dengan menerapkan Zero Trust Network yang terdengar keren.

Semoga tulisan ini dapat membantu kamu yang sedang/tertarik dengan "self-hosting" ataupun membuat "homelab" sendiri, dan jika ada kritik; saran, masukan, atau apapun itu, kolom diskusi ada dibawah 👇

Have a nice day!

Discussion (0)