Скрипт за следене на трафика – обновена на 11.04.2013
26.11.2013 Posted by Александър Христов
Наложи ми се да разбера къде отива трафика на една мрежа. След известно ровене из нета с гугал попаднах на една статия което ми даде идея за решение как да разбера кое IP колко трафик навърта и с какъв MAC адрес е. Има в един момент идея да се прави филтриране по MAC адрес, но това е друга тема. В началото мислех да следя само входящия трафик, но нещата се промениха и се наложи да доразвия скрипта да следя и изходащия трафик
Използват се iptables и apr. Скрипта си е чисто мое дело като идея и писане, НО във възлов момент се намеси Киро който реши проблема с проверката в един от IF-вете, за което съм му много благодарен. Благодарско Кире 😉
Принципа на работа е следния:
1. Създаваме нови политики която аз си кръстих TRAFFIC_DOWN и TRAFFIC_UP (в случая може и друго име);
2. Правим пренасочване на трафика към IP ХХХ.ХХХ.ХХХ.NNN, като NNN може да е от 1 до 253, в моя случай от 100 до 253.
[code lang=“bash“]
iptables -N TRAFFIC_DOWN
iptables -N TRAFFIC_UP
iptables -I FORWARD -j TRAFFIC_DOWN
iptables -I FORWARD -j TRAFFIC_UP
iptables -A TRAFFIC_DOWN -j RETURN -d ХХХ.ХХХ.ХХХ.NNN
iptables -A TRAFFIC_UP -j RETURN -s ХХХ.ХХХ.ХХХ.NNN
[/code]
След което залагаме следния ред в crontab:
[code lang=“bash“]
# crontab -e
0 20 * * * /etc/monitoring/traffic_monitoring/traffic_monitoring.sh # Starting script for monitoring on traffic IP
[/code]
Ето го и самия скрипт traffic_monitoring.sh 🙂
[code lang=“bash“]
#!/bin/bash
#
# script by alex@hgs.name
##############################################
path=“/etc/monitoring/traffic_monitoring“
iptables=“/sbin/iptables“
email=“admin@domain.com“
server=“domain.com“
report=“report_ip_traffic.txt“
report_log=“report_ip_traffic_`date +%d“.“%m“.“%Y`.txt“
start_number=1
end_number=67
b_ip=100
e_ip=253
time_sleep=600
traffic_limit=1500
##############################################
$iptables -Z TRAFFIC_UP #Clear upload traffic
$iptables -Z TRAFFIC_DOWN #Clear download traffic
touch $path/$report
chmod 777 $path/$report
 ip_number () {
	if [ $start_number -gt $end_number ]; then
		mv $path/$report $path/$report_log
		export begin_ip=$b_ip
		export end_ip=$e_ip
		touch $path/report2mail.txt
		chmod 777 $path/report2mail.txt
		report2mail
	else
		export begin_ip=$b_ip
		export end_ip=$e_ip
		export number_line=$start_number
		ip_cicle  >> $path/$report
		start_number=$(( $start_number+1 ))
		sleep $time_sleep
		ip_number
	fi
}
ip_cicle () {
if [ $begin_ip -gt $end_ip ]; then
	echo
else
	for IP in 192.168.1.$begin_ip ;
	do
		traffic=`iptables -L TRAFFIC_DOWN -n -v | grep „$IP “ | grep „M“ | awk ‘{print $2}’`
		if [ `echo $traffic | wc -m` -gt 1 ]; then
			ip_to_mac=`arp -vn | grep „$IP “ | awk ‘{print $3}’`
			traffic_d=`iptables -L TRAFFIC_DOWN -n -v | grep „$IP “ | awk ‘{ print $2 }’`
			traffic_u=`iptables -L TRAFFIC_UP -n -v | grep „$IP “ | awk ‘{ print $2 }’`
			echo „$number_line~ `date +%H:%M“ „%d.%m.%y` IP $IP traffic download is $traffic_d – MAC address is $ip_to_mac“
			echo „$number_line~ `date +%H:%M“ „%d.%m.%y` IP $IP traffic upload is $traffic_u – MAC address is $ip_to_mac“
			begin_ip=$(( $begin_ip+1 ))
			ip_cicle
		else
			begin_ip=$(( $begin_ip+1 ))
			ip_cicle
		fi
	done
fi
}
report2mail () {
if [ $begin_ip -gt $end_ip ]; then
	if [ -e „$path/report2mail.txt“ ]; then
          (
          cat $path/report2mail.txt
          ) | mail -s „$server monitoring IP traffic `date +%d“.“%m“.“%Y`“ $email
          rm $path/report2mail.txt
          exit
	else
	  exit
	fi
else
        for IP in 192.168.1.$begin_ip ;
                do
			dt=`cat $path/$report_log | grep „$end_number~ “ | grep „192.168.1.$begin_ip “ | grep „download“ | awk ‘{print $9}’`
			ut=`cat $path/$report_log | grep „$end_number~ “ | grep „192.168.1.$begin_ip “ | grep „upload“ | awk ‘{print $9}’`
		if [ `echo $dt | wc -m` -gt 1 ]; then
  		   if [ `echo $dt | grep „[0-9.]*“ -o` -ge $traffic_limit ]; then
			mac_export=`cat $path/$report_log | grep „192.168.1.$begin_ip“ | grep -n 1 -m 1 |awk ‘{print $14}’`
			echo „| `date +%d“.“%m“.“%Y` | $mac_export | 192.168.1.$begin_ip | $dt | $ut“ >> $path/detail_report
			echo „192.168.1.$begin_ip – download $dt, upload $ut, mac address is $mac_export“ >> $path/report2mail.txt
			echo „––––––––––––––––––––––“ >> $path/report2mail.txt
			echo „|  Date      | Mac Address       | IP            | DOWN  | UP    “ >> $path/report2mail.txt
			echo „––––––––––––––––––––––“ >> $path/report2mail.txt
			echo „`cat $path/detail_report | grep $mac_export`“ >> $path/report2mail.txt
			echo “ “ >> $path/report2mail.txt
			begin_ip=$(( $begin_ip+1 ))
			report2mail
		   else
		    begin_ip=$(( $begin_ip+1 ))
		    report2mail
		   fi
        else
		 begin_ip=$(( $begin_ip+1 ))
		 report2mail
	 	fi
        done
fi
}
# The start of script
ip_number
[/code]
Малко разяснение по traffic_monitoring.sh:
sleep e времето което да чака преди да повтори цикъла IF отново, в случая са 600 секунди или 10 минути.
start_number и end_number са начало и края на брояча за цикъла IF. В случая на всеки 10 минути, за 84 цикъла, ако не съм сбъркал са 12 часа.
traffic_limit Променлива която оказа над колко MB да изпраща емаил.
Правилото $iptables -Z TRAFFIC_DOWN занулява изброените пакети и свален трафик.
Голяма борба, голямо чудо докато ги обединя двата скрипта в едно и да прави и повече неща 🙂
Освен traffic_limit има промяна в самия скрипт за изпращане на писма, вида на писмото както и както и автоматично изваждане на MAC адреса. Добавя се и допълнителна информация към MAC адреса, като дата, качен, свален трафик както и IP.

This work by Александър Христов is licensed under a Creative Commons Attribution-NonCommercial 4.0 International


Вашият коментар
logged in to post a comment.'), get_option('siteurl') . '/wp-login.php?redirect_to=' . get_permalink()) ?>