Thursday, May 08, 2008

OBSD Router part 1

Seminggu yg lalu aq dapet assignment buat bikin router berbasis OpenBSD. Alasannya? Karena menurut situs resminya (www.openbsd.org), nih OS bener-bener mengutamakan keamanan diatas segalanya. Konsekuensinya ada banyak pekerjaan yang harus dilakukan untuk membuat OS ini berjalan sesuai dengan keinginan kita.

Selain itu nie OS lumayan ringan, karena memang tidak banyak fitur yang disertakan dalam source instalasi standarnya.

Setelah muter-muter di sekitar materi tentang pembuatan router berbasis OpenBSD, ada beberapa pilihan yang tersedia. Dua aplikasi terpopuler diantaranya adalah menggunakan PF (packet filtering) dan Quagga. Aq memilih menggunakan PF karena memang merupakan sudah teruji menurut situs resminya, bahkan hasil benchmarking yg pernah dilakukan oleh pembuatnya dapat mengalahkan kemampuan PF yang ada di kernel sodaranya, si Linux.

Persiapan awal adalah mendownload source .iso OpenBSD 4.2, burning .iso tersebut, lalu instalasi deh (tahap-tahap instalasi yang lumayan bagus bisa dilihat di situs resminya si OBSD.

Langkah berikutnya setelah instalasi adalah meng-konfigurasi OpenBSD menjadi sebuah Router melalui menggunakan kemampuan "packet filtering"-nya (PF).

Setelah login, edit file : /etc/rc.conf.local kemudian, tambahkan baris berikut pada file tersebut :

pf=YES

Setelah itu, restart server.

Setelah itu, login, edit file /etc/pf.conf . Routing akan terjadi berdasarkan isi file ini. Jadi keberhasilan dari routing akan ditentukan pada bagaimana konfigurasi tersebut terbentuk. berikut ini adalah contoh sederhana sebuah routing pada pf.conf

Secara garis besar, PF memiliki 7 (tujuh) bagian utama, yaitu:
  1. Macros
  2. Tables
  3. Options
  4. Scrub
  5. Queueing
  6. Translation
  7. Filter Rules
Berikut ini penjelasan dari masing masing bagian :
  1. Macros
    Merupakan variabel yang diberikan oleh user, misalnya variabel nama interface yang akan digunakan, nomor port, nomor IP, dll. penggunaan macros sebenarnya adalah untuk mengurangi kompleksitas konfigurasi, sehingga perubahan hanya perlu dilakukan satu kali saat sebuah variabel digunakan berkali-kali dalam konfigurasi.
  2. Tables
    Digunakan untuk mengelompokkan alamat-alamat berdasarkan konvensi tertentu, sesuai dengan kebutuhan, desain, dan struktur yang diinginkan.
  3. Options
    Digunakan untuk kebutuhan mengontrol operasional PF. Misalnya, dimana tempat meletakkan log, atau sedalam apa PF akan di- debug (debugging level), dll.
  4. Scrub
    Digunakan untuk menormalisasikan semua paket yang melintasi router sehingga tidak jadi ambiguitas dalam interpretasi.
  5. Queueing
    Digunakan untuk menciptakan "ruang tunggu" untuk paket yang sedang antri untuk diproses.
  6. Translation
    Digunakan untuk mentranslasikan alamat IP dari dalam keluar dan dari luar ke dalam sehingga host yang ada di-luar, tidak perlu mengetahui alamat yang ada didalam. Hal ini biasa disebut NAT.
  7. Filter Rules
    Nah.. bagian inilah yang berfungsi me-routing paket paket data sesuai dengan aturan yang di-inginkan, apakah sebuah paket akan di-passing atau di-blocking.
Berikut ini merupakan sebuah contoh pf.conf yang sederhana, berikut penjelasannya

##--------------------> di-sadur dari www.thedeepsky.com
## Macros
SYN_ONLY="S/FSRA"
EXT_NIC="fxp0"
INT_NIC="fxp1"

# Your Internet IP goes in the EXT_IP variable
EXT_IP="11.22.33.44"

# Your private network IP goes in the INT_IP variable
# if you have two NICs on the machine
INT_IP="192.168.1.1"

## TABLES


## GLOBAL OPTIONS


## TRAFFIC NORMALIZATION


## QUEUEING RULES


## TRANSLATION RULES (NAT)


## FILTER RULES

# Block everything (inbound AND outbound on ALL interfaces) by default (catch-all)
block all

# Default TCP policy
block return-rst in log on $EXT_NIC proto TCP all
  pass in log quick on $EXT_NIC proto TCP from any to $EXT_IP port 22 flags $SYN_ONLY keep state
  pass in log quick on $EXT_NIC proto TCP from any to $EXT_IP port 113 flags $SYN_ONLY keep state

# Default UDP policy
block in log on $EXT_NIC proto udp all
  # It's rare to be hosting a service that requires UDP (unless you are hosting
  # a dns server for example), so there typically won't be any entries here.

# Default ICMP policy
block in log on $EXT_NIC proto icmp all
  pass in log quick on $EXT_NIC proto icmp from any to $EXT_IP echoreq keep state

block out log on $EXT_NIC all
  pass out log quick on $EXT_NIC from $EXT_IP to any keep state

# Allow the local interface to talk unrestricted
pass in quick on lo0 all
pass out quick on lo0 all

No comments: