Home Gentoo Server

Скрипт за следене на трафика – обновена на 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.