Packet Filter atau PF adalah sebuah pseudo device, yang bekerja pada level kernel, yang berfungsi membolehkan seseorang untuk mengontrol proses keluar masuknya packet data yang melalui interface ioctl(2). Seperti mengaktifkan atau menonaktifkan filter, menambahkan atau menghapus masukan rules atau state table, me-load rulesets yang kita buat pada sebuah file, atau melihat statistik dari packet data yang terjaring oleh rulesets yang telah kita buat.
PF tersedia pada keluarga *BSD, seperti FreeBSD, NetBSD, PC-BSD, Dragonfly BSD, dkk. Penulis tidak akan membahas sejarah PF disini, jadi kita langsung saja. Konfigurasi PF biasanya terletak pada /etc/pf.conf, isi file ini disebut dengan rulesets, setiap barisnya berisi dengan rules (aturan) untuk membantu menjelaskan packet filtering seperti apa yang harus dilakukan pada sebuah trafik dari network yang ditemui. File /etc/pf.conf akan di load menggunakan tool pfctl. Pada openBSD sudah tersedia rules default, jadi jika ingin belajar silahkan memberikan rule baru pada baris paling akhir.
OpenBSD yang digunakan disini adalah versi terbaru pada saat penulisan OpenBSD 5.0.
Pada OpenBSD 4.6 keatas, pf sudah enable secara default, dengan konfigurasi minimal.
Untuk mengaktifkan PF kita bisa gunakan perintah berikut:
###################################################################
# pfctl -e
pf enabled
###################################################################
Untuk OpenBSD 4.6 kebawah kita bisa aktifkan PF secara default dengan mengedit atau
menambahkan baris "pf=YES" pada /etc/rc.conf.local file.
Dasar dari syntax PF:
################################################################################
action [direction] [quick] [on interface] [af] [proto protokol] [from alamat_sumber] [to detinasi_port]
################################################################################
action: melakukan pass atau block packet
direction: in atau out paket
quick: jika packet sesuai dengan spesifikasi quick, maka di tunjuk sebagai rule terakhir.
interface: alamat fisik interface network
af: inet untuk ipv4 atau inet6 untuk ipv6
proto: udp, tcp, icmp atau icmp6
OK sekarang penulis akan memberi contoh minimal ruleset:
###################################################################
pass in quick on vic0 proto tcp to port 80
###################################################################
Rule di atas membolehkan semua trafik masuk yang datangnya dari
interface network vic0 menuju port 80 (http). Mudah di mengerti bukan?
###################################################################
pass in quick on vic1 proto udp to port domain
pass in quick on vic1 proto udp to port domain
###################################################################
Membolehkan semua trafik masuk yang datang dari interface network vic1
menuju port 53 (domain)
bagaimana jika trafiknya tidak menggunakan protokol tcp atau udp ? seperti ping:
###################################################################
pass in quick inet proto icmp all icmp-type echoreq
###################################################################
Membolehkan trafik masuk dengan protokol icmp berstatus request
jika sudah tidak ingin memperbolehkan packet lain masuk dari port yang sudah kita,
maka gunakan:
###################################################################
block in all
###################################################################
dan tambahkan:
###################################################################
pass out all
###################################################################
agar semua trafik keluar di perbolehkan.
Berikut rules selengkapnya
###################################################################
pass in quick on vic0 proto tcp to port 80
pass in quick on vic1 proto udp to port domain
block in all
pass out all
###################################################################
sekarang mari kita reload isi dari pf.conf agar aktif:
###################################################################
# pfctl -f /etc/pf.conf
###################################################################
sekarang mari kita coba start httpd dan test koneksi dari host lain.
###################################################################
# httpd
# telnet clus1.unixhat.com 80
Trying 192.168.117.128...
Connected to 192.168.117.128.
ŠEscape character is '^]'.
^C
Connection closed by foreign host.
###################################################################
###################################################################
# ping -c3 clus1.unixhat.com
PING 192.168.117.128 (192.168.117.128): 56 data bytes
64 bytes from 192.168.117.128: icmp_seq=0 ttl=255 time=12.375 ms
64 bytes from 192.168.117.128: icmp_seq=1 ttl=255 time=1.632 ms
64 bytes from 192.168.117.128: icmp_seq=2 ttl=255 time=1.852 ms
--- 192.168.117.128 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 1.632/5.286/12.375/5.013 ms
# ssh clus1 unixhat@clus1.unixhat.com
###################################################################
Perintah pertama kita mengaktifkan apache webserver, kemudian melakukan testing koneksi ke port 80 menggunakan telnet, terlihat jelas koneksi berhasil. Selanjutnya melakukan testing koneksi protokol icmp (ping), ada reply disana. Tapi sekarang kita mencoba koneksi ke ssh (port 22) yang tidak kita allow untuk melakukan koneksi ke port ssh di pf.conf, tidak ada reaksi disana.
Pada pf rule dibaca dari atas ke bawah, jadi prosesnya adalah pf membaca semua rulesets kemudian melakuakan aksi pada packet data yang sesuai. Sekarang kita bisa melihat bagaimana penting quick, dengan quick secepatnya packet akan langsung diarahkan dengan rule yang telah dijabarkan, tanpa melihat rule dibawahnya. Tanpa ini, penyaringan packet akan dilanjutkan untuk melihat rule yang sesuai, hingga baris
terakhir dari rulesets. Kita bisa menggunakan # sebagai tanda komentar agar sebuah rule tidak aktif.
Sampai disini pengelanan PF, karena disini kita belajar untuk mengetahui dan memperkenalkan bagaimana proses pf bekerja, untuk pf lebih lanjut akan kita bahas pada topik yang lain. Terima kasih.
###################################################################
pfctl -vf /etc/pf.conf
digunakan untuk reload pf.conf dengan mode verbose.
###################################################################
###################################################################
pfctl -nf /etc/pf.conf
melakukan pengecekan terhadap rulesets, sebelum reload-nya.
# pfctl -vf /etc/pf.conf
set skip on { lo }
pass all flags S/SA
block drop in on ! lo0 proto tcp from any to any port 6000:6010
###################################################################
###################################################################
pfctl -s info
digunakan untuk melihat informasi lengkap dari status packet yang terjaring pf.
# pfctl -s info
Status: Enabled for 0 days 04:34:47 Debug: err
State Table Total Rate
current entries 1
searches 28105 1.7/s
inserts 448 0.0/s
removals 447 0.0/s
Counters
match 450 0.0/s
bad-offset 0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
bad-timestamp 0 0.0/s
congestion 0 0.0/s
ip-option 0 0.0/s
proto-cksum 0 0.0/s
state-mismatch 0 0.0/s
state-insert 0 0.0/s
state-limit 0 0.0/s
src-limit 0 0.0/s
synproxy 0 0.0/s
###################################################################
###################################################################
pfctl -s Interfaces
digunakan untuk melihat daftar interface dan drivernya yang tersedia untuk pf.
# pfctl -s Interfaces
all
carp
enc
enc0
lo
lo0
pflog
pflog0
vic0
vic1
###################################################################
###################################################################
pfctl -s timeouts
digunakan untuk melihat global timeout variable.
# pfctl -s timeouts
tcp.first 120s
tcp.opening 30s
tcp.established 86400s
tcp.closing 900s
tcp.finwait 45s
tcp.closed 90s
tcp.tsdiff 30s
udp.first 60s
udp.single 30s
udp.multiple 60s
icmp.first 20s
icmp.error 10s
other.first 60s
other.single 30s
other.multiple 60s
frag 30s
interval 10s
adaptive.start 6000 states
adaptive.end 12000 states
src.track 0s
###################################################################
Anda bebas meng-copy artikel ini, dengan syarat memberikan sumber dari unixhat.com
source:
man pf
man pfctl
man pf.conf