02 Januari 2012

Hitung packets IPFW untuk TCP/UDP

Dulu pernah terpikir dibenak saya untuk menghitung packet yang lewat IPFW dan seperti biasa hasilnya saya phasing ke MRTG. Tapi kendalanya packet selalu bertambah jumlahnya sesuai dengan output rules dari IPFW; dengan ini grafik yang dihasilnya bersifat naik terus sampe ketika mesin reboot barulah ia kembali ke nol. Jadi, perhitungan rata-rata packet yang masuk/keluar lewat router per-satuan waktu tidak didapatkan alias tidak dinamis. Barulah setelah saya ingat beberapa teknik lama pemograman yaitu dengan variable dummy dengan mencatat packet awal/akhir, lalu dihitung selisihnya per-satuan waktu, hasil grafik terlihat lebih manusiawi :-). Ini adalah satu contoh sederhana scripting yang saya buat:
#!/bin/sh
# TmpFile
TEMPFILE="/tmp/ipfw.tu"
# TCP/UDP grab to file
OLDT1=`ipfw -a list | grep 00300 >  $TEMPFILE`
OLDT2=`ipfw -a list | grep 00301 >> $TEMPFILE`
OLDT3=`ipfw -a list | grep 00302 >> $TEMPFILE`
OLDT4=`ipfw -a list | grep 00303 >> $TEMPFILE`
OLDU1=`ipfw -a list | grep 00400 >> $TEMPFILE`
OLDU2=`ipfw -a list | grep 00401 >> $TEMPFILE`
OLDU3=`ipfw -a list | grep 00402 >> $TEMPFILE`
OLDU4=`ipfw -a list | grep 00403 >> $TEMPFILE`

# Fetch old packets
OLDTI1=`grep 00300 $TEMPFILE | awk '{print $2}'`
OLDTI2=`grep 00301 $TEMPFILE | awk '{print $2}'`
OLDTI3=`grep 00302 $TEMPFILE | awk '{print $2}'`
OLDTI4=`grep 00303 $TEMPFILE | awk '{print $2}'`
OLDTO1=`grep 00300 $TEMPFILE | awk '{print $3}'`
OLDTO2=`grep 00301 $TEMPFILE | awk '{print $3}'`
OLDTO3=`grep 00302 $TEMPFILE | awk '{print $3}'`
OLDTO4=`grep 00303 $TEMPFILE | awk '{print $3}'`
OLDUI1=`grep 00400 $TEMPFILE | awk '{print $2}'`
OLDUI2=`grep 00401 $TEMPFILE | awk '{print $2}'`
OLDUI3=`grep 00402 $TEMPFILE | awk '{print $2}'`
OLDUI4=`grep 00403 $TEMPFILE | awk '{print $2}'`
OLDUO1=`grep 00400 $TEMPFILE | awk '{print $3}'`
OLDUO2=`grep 00401 $TEMPFILE | awk '{print $3}'`
OLDUO3=`grep 00402 $TEMPFILE | awk '{print $3}'`
OLDUO4=`grep 00403 $TEMPFILE | awk '{print $3}'`

# Clean TmpFile
rm -f $TEMPFILE

# Summ TCP old packets
SOLDTIO=$(($OLDTI1+$OLDTI2+$OLDTI3+$OLDTI4 \
+$OLDTO1+$OLDTO2+$OLDTO3+$OLDTO4))

# Summ UDP old packets
SOLDUIO=$(($OLDUI1+$OLDUI2+$OLDUI3+$OLDUI4 \
+$OLDUO1+$OLDUO2+$OLDUO3+$OLDUO4))

# Fetch TCP curr packets
NEWTI1=`ipfw -a list | grep 00300 | awk '{print $2}'`
NEWTI2=`ipfw -a list | grep 00301 | awk '{print $2}'`
NEWTI3=`ipfw -a list | grep 00302 | awk '{print $2}'`
NEWTI4=`ipfw -a list | grep 00303 | awk '{print $2}'`
NEWTO1=`ipfw -a list | grep 00300 | awk '{print $3}'`
NEWTO2=`ipfw -a list | grep 00301 | awk '{print $3}'`
NEWTO3=`ipfw -a list | grep 00302 | awk '{print $3}'`
NEWTO4=`ipfw -a list | grep 00303 | awk '{print $3}'`

# Summ TCP curr packets
SNEWTIO=$(($NEWTI1+$NEWTI2+$NEWTI3+$NEWTI4 \
+$NEWTO1+$NEWTO2+$NEWTO3+$NEWTO4))

# Fetch UDP curr packets
NEWUI1=`ipfw -a list | grep 00400 | awk '{print $2}'`
NEWUI2=`ipfw -a list | grep 00401 | awk '{print $2}'`
NEWUI3=`ipfw -a list | grep 00402 | awk '{print $2}'`
NEWUI4=`ipfw -a list | grep 00403 | awk '{print $2}'`
NEWUO1=`ipfw -a list | grep 00400 | awk '{print $3}'`
NEWUO2=`ipfw -a list | grep 00401 | awk '{print $3}'`
NEWUO3=`ipfw -a list | grep 00402 | awk '{print $3}'`
NEWUO4=`ipfw -a list | grep 00403 | awk '{print $3}'`

# Summ UDP curr packets
SNEWUIO=$(($NEWUI1+$NEWUI2+$NEWUI3+$NEWUI4 \
+$NEWUO1+$NEWUO2+$NEWUO3+$NEWUO4))

# Diff old/curr packets
DIFFTIO=$(($SNEWTIO-$SOLDTIO))
DIFFUIO=$(($SNEWUIO-$SOLDUIO))

# Prob all result
echo $DIFFTIO
echo $DIFFUIO
Selanjutnya hasilnya tinggal ditampilkan ke MRTG atau RRDTool. Dibawah ini saya coba menggunakan MRTG:
Target[ipfw.tu]: `/usr/local/bin/ipfw.tu`
Title[ipfw.tu]: IPFW TCP/UDP Packets Summary
Colours[ipfw.tu]: DODGERBLUE#1E90FF,BLUE#0000FF,DODGERBLUE#1E90FF,BLUE#0000FF
RouterUptime[ipfw.tu]: local@localhost
MaxBytes[ipfw.tu]: 30000
AbsMax[ipfw.tu]: 30000
YTics[ipfw.tu]: 10
PageTop[ipfw.tu]: IPFW TCP/UDP Packets Summary
YLegend[ipfw.tu]: Packets/5 Min
ShortLegend[ipfw.tu]:
LegendI[ipfw.tu]: TCP
LegendO[ipfw.tu]: UDP
Legend1[ipfw.tu]:
Legend2[ipfw.tu]:
Options[ipfw.tu]: gauge, growright, avgpeak, integer, absolute, pngdate


Selamat mencoba :-)

Tidak ada komentar: