Pengenalan PF (Packet Filter) pada OpenBSD


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