Firewall Dasar: ufw dan pf Secukupnya

Setiap kali saya bantu audit atau setup ulang server kecil — VPS untuk aplikasi Laravel, atau Mac yang dipakai sebagai server rumahan — satu hal yang paling sering terlewat justru yang paling dasar: firewall belum aktif, atau aktif tapi aturannya asal jalan tanpa pernah dipikir ulang. Padahal firewall level host adalah lapisan pertahanan pertama yang paling murah: tidak perlu appliance mahal atau tim security khusus, cukup beberapa baris perintah dan cara berpikir yang benar. Di tulisan ini saya bahas prinsip paling penting, default-deny, lalu penerapannya dengan ufw di Linux dan pf di macOS/BSD.

Kenapa default-deny, bukan default-allow

Ada dua cara berpikir soal firewall. Default-allow: semua trafik boleh lewat kecuali yang saya blokir. Default-deny: semua trafik saya tolak kecuali yang saya izinkan. Untuk server yang menghadap internet, default-deny satu-satunya pilihan yang masuk akal — saya tidak mungkin tahu semua service yang berjalan di sistem, apalagi kalau server dipakai bertahun-tahun dan banyak paket ikut ter-install sebagai dependency. Dengan default-allow, setiap service baru yang kebetulan listen di port tertentu otomatis bisa diakses dari luar, termasuk yang sebetulnya cuma dimaksudkan untuk localhost. Dengan default-deny, service baru itu otomatis tertutup sampai saya sadar dan membuka portnya sendiri — firewall jadi whitelist hidup, bukan daftar hitam yang harus terus dikejar update-nya.

Praktik dengan ufw di Linux

ufw (Uncomplicated Firewall) menyederhanakan konfigurasi iptables/nftables di Linux. Urutan yang saya pakai untuk server kecil: tetapkan kebijakan default lebih dulu.

sudo ufw default deny incoming
sudo ufw default allow outgoing

Outgoing saya biarkan default-allow, karena server tetap perlu update paket, resolve DNS, kirim webhook — fokus utama firewall di server kecil adalah incoming. Setelah itu tambahkan aturan seperlunya, misalnya SSH, HTTP, dan HTTPS:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Satu kebiasaan yang saya pegang: jangan langsung ufw enable sebelum aturan SSH masuk. Kalau default deny incoming diaktifkan duluan, koneksi SSH yang sedang berjalan memang tidak langsung putus, tapi begitu terputus tidak ada jalan masuk lagi kecuali lewat console fisik atau console provider VPS. Jadi, enable selalu paling akhir, setelah semua allow rule masuk. Untuk service yang hanya boleh diakses dari jaringan tertentu — misalnya database yang dipakai aplikasi lain di subnet privat yang sama — saya batasi sumbernya, bukan buka ke semua alamat:

sudo ufw allow from 10.0.0.0/24 to any port 5432

Baru setelah semua rule dasar siap, aktifkan dan cek statusnya dengan sudo ufw enable dan sudo ufw status verbose.

Praktik dengan pf di macOS

Di macOS (dan turunan BSD lainnya), mesin packet filter-nya bernama pf. Ini yang saya pakai kalau setup Mac sebagai server kecil di rumah atau kantor, misalnya untuk hosting internal atau container stack. Bedanya dengan ufw, pf dikonfigurasi lewat file rule teks (anchor) yang dipanggil dari /etc/pf.conf. Prinsipnya sama: default-deny dulu, baru izinkan seperlunya. Contoh isi anchor sederhana:

block in all
pass out all

pass in proto tcp from any to any port 22
pass in proto tcp from any to any port 80
pass in proto tcp from any to any port 443
pass in proto tcp from 192.168.1.0/24 to any port 3100

Baris pertama menolak semua trafik masuk, tiga baris berikutnya mengizinkan SSH, HTTP, dan HTTPS secara eksplisit, dan baris terakhir membatasi akses ke port aplikasi tertentu hanya dari subnet LAN. pf mengevaluasi rule berurutan dan rule terakhir yang cocok yang menang, jadi urutannya penting. Setelah anchor direferensikan di pf.conf, muat ulang dan aktifkan dengan sudo pfctl -f /etc/pf.conf lalu sudo pfctl -e. Perlu diingat, pf tidak otomatis persisten setelah reboot kecuali dikonfigurasi lewat launchd.

Takeaway

Firewall level host bukan pengganti keamanan di lapisan lain — patching berkala, autentikasi yang kuat, dan segmentasi jaringan tetap perlu — tapi dia jaring pengaman pertama yang murah dan efektif untuk server kecil. Ingat tiga hal: mulai dari default-deny untuk incoming, buka port hanya untuk service yang memang perlu diakses dari luar, dan batasi sumbernya ke subnet yang relevan kalau memungkinkan, bukan ke any. Baik pakai ufw maupun pf, cara berpikirnya sama — bedanya cuma sintaks. Dan sebelum enable, selalu cek ulang bahwa rule untuk akses remote yang sedang dipakai sudah ada di daftar allow, supaya tidak mengunci diri sendiri.