Menguasai pf (Packet Filter) FreeBSD: struktur ruleset di /etc/pf.conf, penggunaan tables dan anchors, scrub untuk normalisasi paket, dan stateful filtering. Kalian juga akan belajar aturan nat dan rdr untuk port forwarding serta load balancing dasar.

Di episode 11 sebelumnya kalian sudah membuat router FreeBSD dengan NAT pf yang sederhana. Sekarang kita bedah pf secara mendalam — firewall andalan FreeBSD yang dikenal karena sintaksnya yang rapi dan stateful filtering yang kuat. Bukan sekadar "allow dan deny": dengan tables, anchors, scrub, dan state, pf bisa membangun kebijakan keamanan yang kompleks namun tetap mudah dibaca.
Semua aturan pf hidup di /etc/pf.conf. File ini dibaca baris per baris dan aturan dievaluasi berurutan — aturan terakhir yang cocok biasanya yang menang. Struktur dasarnya:
ext_if = "em0"
lan_if = "em1"
block all
pass in on $ext_if proto tcp to port 22Baris pertama mendefinisikan macro untuk interface — cara yang membuat ruleset mudah dipelihara. Baris block all adalah default yang menolak segalanya, lalu aturan pass membuka yang diizinkan.
sysrc pf_enable="YES"
service pf start
pfctl -f /etc/pf.conf
pfctl -s rulesDanger
Aturan block all di awal tanpa aturan pass yang benar akan memutus semua koneksi, termasuk SSH administrasi. Mulailah dengan aturan passthrough yang luas, verifikasi, lalu sempitkan secara bertahap.
pf bersifat stateful: ia melacak koneksi dan hanya mengizinkan paket yang sesuai dengan koneksi yang sudah disetujui. Ini membuat aturan jauh lebih sederhana — kalian cukup membuka koneksi baru, dan responsnya otomatis diizinkan.
pass in on $lan_if from $lan_if:network to any keep state
pass in on $ext_if proto tcp to port 80 keep statekeep state membuat pf mencatat koneksi. Tanpa state, kalian harus menulis aturan untuk dua arah — tidak praktis dan rawan kesalahan.
Info
keep state bukan sekadar optimasi — ini juga perlindungan keamanan. pf menolak paket yang tidak cocok dengan state yang ada, mencegah serangan yang memanfaatkan koneksi yang tidak sah.
Table adalah daftar alamat (IP, CIDR, jaringan) yang bisa diperbarui dinamis tanpa memuat ulang seluruh ruleset:
table <bruteforce> persist
block quick from <bruteforce>
pass in on $ext_if proto tcp to port 22pfctl -t bruteforce -T add 203.0.113.7
pfctl -t bruteforce -T showAnchor adalah titik penyisipan yang memungkinkan aturan dikelola dalam file terpisah atau oleh proses lain (seperti blacklist dinamis):
anchor "spam"
load anchor "spam" from "/etc/pf.spam.conf"scrub in allscrub in all melakukan reassembly fragment, menetapkan ulang TTL, dan merapikan header. Ini pertahanan lapisan pertama terhadap serangan yang memanfaatkan paket terfragmentasi.
NAT mengubah alamat sumber paket yang keluar — dasar untuk berbagi satu IP publik ke seluruh LAN:
ext_if = "em0"
lan_if = "em1"
nat on $ext_if from $lan_if:network to any -> ($ext_if)rdr (redirect) meneruskan paket yang masuk ke alamat atau port internal — dasar port forwarding:
ext_if = "em0"
web_server = "192.168.1.10"
rdr on $ext_if proto tcp from any to $ext_if port 80 -> $web_server port 80Success
Kombinasi nat untuk lalu lintas keluar dan rdr untuk lalu lintas masuk menjadikan satu mesin FreeBSD dengan pf sebagai perimeter jaringan yang lengkap: klien dalam dilindungi, layanan luar diarahkan dengan aman.
web1 = "192.168.1.10"
web2 = "192.168.1.11"
rdr on $ext_if proto tcp from any to $ext_if port 80 -> { $web1, $web2 }ext_if = "em0"
lan_if = "em1"
lan_net = "192.168.1.0/24"
table <bad_hosts> persist
set skip on lo0
scrub in all
nat on $ext_if from $lan_net to any -> ($ext_if)
rdr on $ext_if proto tcp to port 80 -> 192.168.1.10 port 80
block all
block quick from <bad_hosts>
pass in on $lan_if from $lan_net to any keep state
pass in on $ext_if proto tcp to port 22,80,443 keep state
pass out all keep statepfctl -s info
pfctl -s states
pfctl -s rulespass log on $ext_if proto tcp to port 22
tcpdump -n -e -ttt -i pflog0Warning
Sebelum menebak aturan yang salah, lihat dulu log. pf mencatat paket yang ditolak ke interface pflog0. Gunakan tcpdump -n -i pflog0 untuk melihat alasan penolakan dan aturan mana yang cocok.
Di episode 12 ini kalian sudah menguasai pf: struktur ruleset dengan macro, stateful filtering dengan keep state, tables untuk daftar dinamis, anchors untuk modularitas, scrub untuk normalisasi paket, serta nat, rdr, dan load balancing untuk lalu lintas masuk dan keluar.
Inti yang harus dibawa pulang:
block all di awal menetapkan default aman.keep state membuat pf melacak koneksi dan menyederhanakan ruleset.scrub in all menormalkan paket untuk pertahanan fragmentasi.nat untuk lalu lintas keluar, rdr untuk port forwarding dan load balancing.