Menguasai pf (Packet Filter), firewall bawaan OpenBSD: membaca dan menyusun /etc/pf.conf, memahami ruleset block dan pass, menulis service rules untuk SSH, HTTP, dan HTTPS, mengaktifkan logging lewat pflog, serta memvalidasi konfigurasi dengan pfctl secara aman.

Di episode 11 sebelumnya, kalian mengamankan data dengan backup. Sekarang kita sampai pada alasan utama banyak orang memakai OpenBSD: pf, atau Packet Filter. pf bukan sekadar firewall — ia adalah heart of OpenBSD networking, alat yang sama-sama menangani filtering, NAT, load balancing, dan logging.
Sistem Linux punya iptables/nftables yang sering terasa berantakan. pf terasa berbeda: syntax-nya ringkas, dibaca seperti bahasa, dan default-nya deny. Aturan pertama yang harus diinternalisasi: apa yang tidak di-pass, diblok. Keamanan dimulai dari deny, bukan dari allow.
pf adalah service biasa yang dikelola rcctl:
rcctl enable pf
rcctl start pf
rcctl status pfSaat boot, pf membaca /etc/pf.conf. Jika file tidak ada, pf tidak aktif — jadi langkah pertama adalah memastikan service aktif dan ruleset dimuat.
/etc/pf.conf berisi beberapa bagian penting. Contoh minimum yang aman:
table <bruteforce> persist
set skip on lo
block return in all
block out all
pass in on egress proto tcp to port 22
pass in on egress proto tcp to port 80
pass in on egress proto tcp to port 443
pass out inet proto tcp to port 53
pass out inet proto udp to port 53set skip on lo — trafik loopback tidak difilter.block return in all dan block out all — deny semua sebagai default, return mengirim RST/ICMP.pass berikutnya membuka celah secara eksplisit.Aturan dievaluasi dari atas ke bawah, dan aturan pertama yang cocok menang. Karena itulah block harus diletakkan sebelum pass yang lebih spesifik.
pf.conf terstruktur dalam beberapa bagian:
if="em0" dan web_port="{80 443}" agar ruleset mudah dibaca.set block-policy dan set skip.block/pass yang sebenarnya.Contoh dengan macros:
int_if = "em0"
pass in on $int_if proto tcp from $int_if:network to any port ssh
pass in on $int_if proto tcp to any port httpMacros membuat ruleset kalian mudah dipelihara dan dibaca — sangat penting saat ruleset tumbuh ratusan baris.
Setiap service yang ingin kalian buka membutuhkan aturan pass yang jelas. Pola dasarnya:
pass in on egress proto tcp to port { ssh http https }
pass in on egress proto tcp to port smtp
pass in on egress proto { tcp udp } to port domainssh, http, https adalah nama service yang dikenali pf dari /etc/services.Jangan membuka port yang tidak kalian jalankan. Setiap port terbuka adalah permukaan serangan — prinsip secure by default berlaku dari episode 1 sampai di sini.
Bagian scrub membersihkan paket dari fragmentasi dan anomali — pertahanan terhadap berbagai serangan evasion:
match in all scrub (no-df max-mss 1440)Pada pf versi modern, match menggantikan scrub lama. Normalisasi dilakukan pada semua paket masuk. Ini lapisan pertahanan yang murah dan berdampak besar.
Untuk mencatat paket yang diblok, tambahkan kata kunci log:
block return log in all
pass in log on egress proto tcp to port 22Log pf ditangkap oleh perangkat pflog0 dan dibaca lewat tcpdump:
tcpdump -n -e -ttt -i pflog0
tail -f /var/log/pflog/var/log/pflog adalah file biner pflog yang ditulis oleh pflogd. Analisis log ini adalah cara utama mengetahui serangan yang sedang dicoba terhadap kalian.
Warning
Jangan pernah me-reload ruleset yang belum divalidasi. Selalu jalankan pfctl -nf /etc/pf.conf sebelum rcctl reload pf — kesalahan syntax di pf.conf akan membuat pf berhenti memuat ruleset dan trafik bisa macet total.
pfctl adalah alat utama untuk memuat, memvalidasi, dan menginspeksi ruleset:
pfctl -nf /etc/pf.conf
pfctl -f /etc/pf.conf
pfctl -s rules
pfctl -s states
pfctl -s info-nf memvalidasi tanpa memuat (draf aman).-f memuat ruleset.-s rules menampilkan ruleset yang aktif.-s states menampilkan state koneksi yang dilacak.-s info menampilkan statistik pf.Kombinasi -nf lalu -f lalu -s rules adalah siklus kerja harian administrator pf.
Saat mengubah ruleset dari jarak jauh, ada bahaya klasik: salah menulis aturan, lalu koneksi SSH kalian terputus selamanya. Praktik amannya adalah menguji dulu dengan ruleset yang membiarkan SSH tetap terbuka, lalu memuat dengan hati-hati:
pfctl -nf /etc/pf.conf && pfctl -f /etc/pf.confOperator && memastikan ruleset hanya dimuat jika valid. Untuk perubahan besar, pertimbangkan menambah pass in on egress proto tcp to port 22 di posisi paling atas ruleset kalian — koneksi SSH tidak akan pernah terputus.
Di episode 12 ini kalian menguasai fondasi pf: mengaktifkannya dengan rcctl, membaca struktur /etc/pf.conf, memahami ruleset block/pass yang dievaluasi dari atas ke bawah, menulis service rules untuk SSH/HTTP/HTTPS, normalisasi dengan match ... scrub, logging lewat pflog, dan memvalidasi dengan pfctl.
Inti yang harus dibawa pulang:
block sebelum pass.pfctl -nf sebelum memuat, dan pastikan SSH selalu terbuka.Di episode 13 selanjutnya, kita akan menaikkan level: pf advanced — NAT outbound dan redirect (rdr), tables dengan persist, anchors untuk modularitas, serta dynamic rules dengan state tracking.