Archive for February, 2007

NAT + bandwidth management with PF

Wednesday, February 28th, 2007

sebenernya iseng iseng doang sih nyobain NAT di jaringan STT + bandwidth management di FreeBSD 6.1. Dari pada di leb ga ada kerjaan yang jelas, ya dari situlah dapet ide bikin mini tutorial ini. NAT dan bandwidth management disini menggunakan PF (packet filter). Sebelum menggunakan PF sebaiknya kompile kernel anda terlebih dahulu. Caranya dapet dilihat di tutorial sebelumnya. Lengkap kok :) :) :) :P :P :P :P

skema jaringan lengkapnya adalah sebagai berikut :
Skema_awal_1

seperti yang terlihat di gambar, terdapat BSD nat Machine yang berfungsi sebagai gateway untuk jaringan 192.168.0.0/24. terdapat 2 buah interface di BSD nat Machine, yaitu rl0 dan xl0. rl0 adalah interface ke jaringan luar, sedang xl0 adalah untuk jaringan private. IP address untuk interface rl0 adalah 10.14.3.7, sedang interface untuk xl0 adalah 192.168.0.1. Nah yang menjadi masalah sekarang, bagaimana cara client di jaringan 192.168.0.0/24 bisa mengakses jaringan internal STT ???? salah satu caranya adalah dengan menggunakan mekanisme NAT (network address translation). Untuk mekanisme NAT, silakan baca dokumen-dokumen di internet.

konfigurasi BSD nat Machine adalah sebagai berikut  :

  1. pastikan dahulu ip forwarding telah di set 1. Caranya, buka file /etc/sysctl.conf, kemudian tambahkan baris berikut net.inet.ip.forwarding=1

     2.  setting IP address untuk kedua interface tersebut, caranya bisa pake               ifconfig ato edit file /etc/rc.conf, kemudian tambahkan baris berikut :
                 ifconfig_rl0="inet 10.14.3.7  netmask 255.255.255.0"
             ifconfig_xl0="inet 192.168.0.1 netmask 255.255.255.0"
              defaultrouter="10.14.3.1"

    3.  saat yang paling mengasyikan, yaitu setting nat dengan pf.Ini adalah              konfigurasi nat dan bandwidth managementnya ( file /etc/pf.conf):

ext_if="rl0" #variable external interface
ext_addr="10.14.3.7/32" #IP address untuk ext_if
priv_addr="192.168.0.0/24" #subnet untuk private address

#antispoof for $ext_addr

set loginterface  $ext_if #digunakan untuk mengumpulkan informasi pada interface rl0
set optimization aggressive #firewall akan menggunakan memory dan CPU time yang lebih sedikit. (llengkapnya baca manual PF)
scrub in on $ext_if all fragment reassemble (packet normalization)

altq on $ext_if priq bandwidth 10Mb queue {dns,ssh,www,chatting,other} ()
queue dns priority 14 priq(red)
queue ssh priority 13 priq(red)
queue www priority 12 priq(red)
queue chatting priority 11 priq(red)
queue other priority 1 priq(default)
#queue test_b priority 10

nat on $ext_if proto {tcp, udp, icmp} from $priv_addr to any -> $ext_addr

#pass in on xl0 all
block drop all
pass in on xl0 proto {tcp, udp, icmp} all
pass out on xl0 proto {tcp, udp,icmp} all
pass in on $ext_if proto udp from any to any port 53 keep state queue dns

pass out on $ext_if proto {tcp,udp} from any to any port 53 keep state queue dns
pass out on $ext_if proto tcp from any to any port { 80, 443 } keep state queue www
pass out on $ext_if proto tcp from any to any port {6666, 6667, 6668} keep state queue chatting
pass in on $ext_if proto tcp from any to any port 22 keep state queue ssh

penjelasan :
altq on $ext_if priq bandwidth 10Mb queue {dns,ssh,www,chatting,other} ()
queue dns priority 14 priq(red)
queue ssh priority 13 priq(red)
queue www priority 12 priq(red)
queue chatting priority 11 priq(red)
queue other priority 1 priq(default)
#queue test_b priority 10

syntax diatas menjelaskan tentang bandwidth management dengan menggunakan priq. sebenarnya ada beberapa algoritma queue management di FreeBSD, diantaranya CBQ(class-Based Queue), priq(priority), HFSC (Hierarchial Fair Service Curve). disini saya hanya menjelaskan menggunakan algoritma priq(priority queuing). Priority Queuing merupakan algoritma yang  paling sederhana ketimbang CBQ maupun HFSC. Mekanismenya adalah sebagai berikut, kita memiliki alokasi bandwidth sebesar X Mb, dengan bandwidth sebesar X tsb, kita ingin membagi-bagi bandwidth tsb menjadi beberapa alokasi, misalkan untuk koneksi ssh, www, mail, chatting, dll. Nah, cara kerja PRIQ adalah dengan prioritas. Contohnya gini, koneksi ssh lebih penting daripada koneksi www, dan koneksi www lebih penting ketimbang koneksi mail. Intinya disini adalah prioritas koneksi (dapat dilihat di skrip diatas). suatu koneksi dengan prioritas yang lebih besar memiliki prioritas koneksi yang lebih tinggi pula. nilai priority mulai dari 0-14. semakin tinggi nilai priority-nya, semakin tinggi pula kemungkinan alokasi bandwidth untuk koneksi tersebut. Dari syntax firewall diatas dapat dilihat bahwa koneksi DNS memiliki prioritas paling tinggi, sedang koneksi other memiliki prioritas bandwidth paling rendah. Nah setelah kita bikin bandwidth managementnya, tinggal kita panggil aja lewat script dibawah ini:   
pass out on $ext_if proto {tcp,udp} from any to any port 53 keep state queue dns

pass out on $ext_if proto tcp from any to any port { 80, 443 } keep state
queue www

pass out on $ext_if proto tcp from any to any port {6666, 6667, 6668} keep state
queue chatting

pass in on $ext_if proto tcp from any to any port 22 keep state
queue ssh

yang ditulis tebal diatas, digunakan untuk memanggil queue yang telah dibuat.

setelah membuat bandwidth management, maka tinggal kita bikin NAT nya. untuk penjelasan NAT, silakan baca manuual di internet. settingnya gini :

nat on $ext_if proto {tcp, udp, icmp} from $priv_addr to any -> $ext_addr

dari syntax diatas, dapat diartikan bahwa semua koneksi yang lewat interface $ext_if (rl0) yang berasal dari $priv_addr(192.168.0.0/24) yang menuju ke any (bisa ke semua tujuan), akan diubah menjadi 10.14.3.7 . Gampangnya, ketika suatu host A yg memiliki IP address  192.168.0.23 yang mengakses misalkan tele.stttelkom.ac.id, maka, di tele.stttelkom.ac.id akan mengenali host A memiliki IP address 10.14.3.7. begitu prinsip NAT.

Untuk skrip yang dibawahnya, saya rasa anda sudah mengerti maksudnya. nah untuk menjalankan firewall tsb jalankan perintah berikut (jangan lupa, setiap kali menjalankan script baru flush dulu firewall nya):

  • pfctl -F all (untuk nge flush firewall)
  • pfctl -f /etc/pf.conf

setelah firewall nya jalan, anda dapat melihat settingan yang sedang berjalan, caranya adalah :

  • pfctl -s all |more

output dari rule /etc/pf.conf adalah sebagai berikut :
TRANSLATION RULES:
nat on rl0 inet proto tcp from 192.168.0.0/24 to any -> 10.14.3.7
nat on rl0 inet proto udp from 192.168.0.0/24 to any -> 10.14.3.7
nat on rl0 inet proto icmp from 192.168.0.0/24 to any -> 10.14.3.7

FILTER RULES:
scrub in on rl0 all fragment reassemble
block drop all
pass in on xl0 proto tcp all
pass in on xl0 proto udp all
pass in on xl0 proto icmp all
pass out on xl0 proto tcp all
pass out on xl0 proto udp all
pass out on xl0 proto icmp all
pass in on rl0 proto udp from any to any port = domain keep state queue dns
pass out on rl0 proto tcp from any to any port = domain keep state queue dns
pass out on rl0 proto udp from any to any port = domain keep state queue dns
pass out on rl0 proto tcp from any to any port = http keep state queue www
pass out on rl0 proto tcp from any to any port = https keep state queue www
pass out on rl0 proto tcp from any to any port = 6666 keep state queue chatting
pass out on rl0 proto tcp from any to any port = ircd keep state queue chatting
pass out on rl0 proto tcp from any to any port = 6668 keep state queue chatting
pass in on rl0 proto tcp from any to any port = ssh keep state queue ssh

ALTQ:
queue dns priority 14 priq( red )
queue ssh priority 13 priq( red )
queue www priority 12 priq( red )
queue chatting priority 11 priq( red )
queue other priq( default )

STATES:
self tcp 10.14.3.7:22 <- 10.14.5.3:45374       ESTABLISHED:ESTABLISHED
self tcp 192.168.0.3:56849 -> 10.14.3.7:60543 -> 10.14.200.231:6667       ESTABLISHED:ESTABLISHED

sebenernya outputnya banyak banget sihh, tapi saya coba mengambil yang penting penting aja.

mungkin cukup sekian dulu sedikit informasi mengenai PF dan bandwidth dengan PF. thanks to temon yang udah banyak ngajarin saya……….

semoga bermanfaat buat temen temen semua

     trimakasih

cipitunk a.k.a kinan

membangun firewall dengan PF (packet Filtering) di FREEBSD 6.0

Saturday, February 3rd, 2007

akhirnya setelah lama berjuang melawan kemalasan menulis blog, akhirnya gw tulis aja ini sedikit tutorial mengenai bagaimana cara membangun firewall menggunakan PF. PF merupakan firewall bawaan dari openBSD, namun sudah di porting ke FreeBSD. sintaksnya gampang, mudah untuk dipahami. dari pengalaman saya, ternyata PF lebih gampang ketimbang ipfw, (walaupun pada awalnnya saya merasa agak sukar menggunakan PF untuk pertama kalinya). tanpa basa basi langsung aja ke tutorialnya.

langkah pertama kali yang saya lakukan adalah melakukan kompile kernel. sebenarnya tanpa kompile kernel freebsd pun bisa, namun saya prefer untuk melakuukan kompile kernel. berikut ini adalah langkah kompile kernel :

  • cd /usr/src/sys/i364/conf
  • cp GENERIC firewall
  • ee firewall (di file tersebut terdapat banyak sekali modul modul kernel yang di load oleh mesin Freebsd. )
  • tambahkan baris berikut ini :
    • device pf
    • device pflog
    • device pfsync
    • options ALTQ
    • options ALTQ_RED
    • options ALTQ_CBQ
    • options ALTQ_RIO
    • options ALTQ_HFSC
    • options ALTQ_PRIQ
    • options ALTQ_NOPCC
  • abis itu save, dan kompile kernel kamu, caranya :
    • config firewall
    • cd ../compile/firewall
    • make cleandepend; make depend
    • make; make install
  • kalo ga ada error waktu kompile kernel, berarti semuanya berjalan normal.
  • trus tambahin  baris berikut di file /etc/rc.conf :
    • pf_enable="YES"
    • pf_rules="/etc/pf.conf"
    • pf_flags=""
    • pflog_enable="YES"
    • pflog_logfile="/var/log/pflog"
  • reboot komputermuuuu

setelah selesai langkah diatas, lalu buat file konfigurasi firewalll nya di file /etc/pf.conf. konfigurasinya adalah sebagai berikut :

if = "xl0" ###(interface pada mesin freebsd. di  linux  dikenali  sebagai  eth0)
dns="10.14.203.7" ###(ip address untuk dns server)

no_route="{192.168.0.0/16, 127.0.0.0/8, 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 204.152.64.0/23, 224.0.0.0/3}"

netbios_sharing="{137,138,139,445,81}"
ob_state="flags S/SA keep state" ###paket yang keluar dari mesin FreeBSD
ib_state="flags S/SA keep state" ###paket yang masuk ke mesin FreeBSD

set block-policy drop ## rule status awal dari rule firewall adalah di drop untuk semua paket yang masuk maupun yang keluar.
set state-policy if-bound

set loginterface $if  #buat ngambil statistik pada interface xl0
set fingerprints "/etc/pf.os"

antispoof for $if

pass in quick on lo0 all 

#ijinkan akses keluar untuk dns server
pass out quick on $if proto tcp from any to any port 53 $ob_state
pass out quick on $if proto udp from any to any port 53 keep state

#ijinkan akses keluar untuk http https dan ssh juga ftp
pass out quick on $if proto tcp from any to any port 22 $ob_state
pass out quick on $if proto tcp from any to any port 80 $ob_state
pass out quick on $if proto tcp from any to any port 443 $ob_state
pass out quick on $if proto tcp from any to any port 21 $ob_state

#ijinkan keluar ping
pass out quick on $if inet proto icmp from any to any icmp-type 8 keep state

block out log on $if  #### selain rule yang diatas akan diblok oleh firewall

block in quick on $if from $no_route to any
##block inbound ping ke mesin freebsd
block in quick on $if inet proto icmp all icmp-type 8
block in quick on $If proto tcp from any to any port $netbios_sharing
block in log quick on $if inet proto all flags FUP/FUP
block in log quick on $if inet proto all flags SF/SFRA
block in log quick on $if inet proto all flags /SFRA

#ijinkan paket masuk ke web sever dan ssh server
pass in quick on $if proto tcp from any to any port 22 $in_state
pass in quick on $if proto tcp from any to any port 80 $in_state
pass in quick on $if proto tcp from any to any port 443 $in_state

block in log quick on $if all

cara menjalankan nya adalah sebagai berikut ini.

  • pfctl -F all (menghapus rule pf )
  • pfctl -f /etc/pf.conf (me load rule pf. biasanya kalo udah di tulis di /etc/rc.conf, maka akan otomatis di load saat booting)
  • untuk melihat statistik dari rule, pake ‘pfctl -s info’

firewall diatas masih sangat sederhana.
mungkin cukup segitu dulu tutorialnya dari sayyaaa. edisi mendatang akan di bahas lebih dalam bagaimana cara bandwith management dengan PF.

semoga dapat bermanfaat bagi teman teman semua. terimakasih dah mo baca tutorial ga berguna ini.

salam………………….