Provoz na síti a zápis do databáze

Tomask

Provoz na síti a zápis do databáze
« kdy: 06. 12. 2013, 13:14:44 »
Dobrý den, mám tu takový pro mě oříšek.
Potřebuji nějak měřit traffic v (asi v kilobajtech) na jednotlivé IP adresy a zapisovat je do databáze.
Asi nejlepší by to bylo pomocí iptables , jelikož na routeru mi nic jiného než linux a php neběží a ukládalo by se to do vzdálené databáze.
Potřeboval bych nějak v PHP udělat dotaz přes iptables na jednotlivé IP na in a out a kolik dat proteklo (download a upload), jelo by to pak v cronu např. co 5 minut.
Prosím o jakoukoliv radu nebo script, jak toto udělat.
Děkuji.
« Poslední změna: 09. 12. 2013, 14:10:24 od Petr Krčmář »


LadaD

Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #1 kdy: 06. 12. 2013, 13:29:10 »
Není lepší pro zjišťování z iptables a vkládání do db použít bash a php by to četlo z DB?


McFly

  • *****
  • 616
    • Zobrazit profil
    • E-mail

Tomask

Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #4 kdy: 06. 12. 2013, 15:23:45 »
Děkuji, ale z tohoto to do kupy nedám, jelikož iptables neovládám, nechápu systém co je chain atp. navíc nechci ukládat data do nějakého texťáku, ale jinam do databáze.
Spíše by mi pomohlo nějaký příklad třeba rozhraní eth0, konkrétní třeba 2 adresy (in out) a zápis do mysql, pokud to nebude přes php, ale jen scriptem spouštěným co 5 minut. Výstupem by měl být zápis do tabulky mysql databáze  typ,ip, datum, velikost(bytes) např.:

download  192.168.200.120   2013-12-06 12:05:00   2568666
upload      192.168.200.120   2013-12-06 12:05:00   7768666
download  192.168.200.150   2013-12-06 12:05:00   12565286
upload      192.168.200.150   2013-12-06 12:05:00   73768666

Kdyby nějaká ochotná duše toto dala jako příklad, moc by mi to pomohlo.
šlo by to takto nějak?
Děkuji za ochotu.


Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #5 kdy: 06. 12. 2013, 15:48:23 »
Děkuji, ale z tohoto to do kupy nedám, jelikož iptables neovládám, nechápu systém co je chain atp.
V tom případě to nedáš, zas tak jednoduchý to není.

Kdyby nějaká ochotná duše toto dala jako příklad, moc by mi to pomohlo.
šlo by to takto nějak?
Děkuji za ochotu.
Pokud se v iptables vůbec neorientuješ a neumíš si ani napsat skript, který vyparsuje něco z výstupu příkazu a uloží to do databáze, tak ti příklad nepomůže. To by ti to ten někdo musel kompletně napsat a zprovoznit.

LadaD

Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #6 kdy: 06. 12. 2013, 16:12:36 »
Pokud se ti nechce, nebo neumíš dělat bash scripty, můžeš to zkusit s ULOGem, kterým necháš projet všechen provoz a k němu je modul na zápis do mysql, takže pak si můžeš už jenom hrát s daty v DB.
http://blog.sflow.com/2010/12/ulog.html

Jimm

Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #7 kdy: 06. 12. 2013, 18:09:36 »
Napadá mě opět to samé, co mě napadne vždy při čtení podobného dotazu. Proč ten server prostě nemá na starost někdo, kdo ví co dělá? Ono to sice stojí peníze, ale zase se tomu potom neříká "bastlení" a přidaná hodnota je, že to "nezkurví". Myslet si, že se o server náležitě postará někdo kdo o něm nic neví je opravdu velmi hloupé...

Adrian

Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #8 kdy: 06. 12. 2013, 18:48:24 »
Nechapu proc tu pan vubec pise,

tohle forum neni udelatko "vlastnich" programku !

McFly

  • *****
  • 616
    • Zobrazit profil
    • E-mail
Re:Zjištění trafficu roz eth0 nebo br0 a zápis do databáze
« Odpověď #9 kdy: 06. 12. 2013, 18:49:03 »
Analyse this! :) (víc pod nos to už dát nejde)

Kód: [Vybrat]
#!/bin/bash
#
#  IP Accounting v 1.1
#  Tento program slouzi ke statistice sitoveho provozu pro jednotliva IP
#  Created by standus - standus at standus.com

active_iface="eth0 eth1"
dir_data_txt="/var/www/html/ipaccounting"
dir_data_rdd="/var/www/html/ipaccounting/rrd"
rdd_active="on"
txt_active="on"
testing_active="on"

# Testovani pravidel a chainu v IPTABLES
if [ $testing_active == "on" ]; then
    if [ "`iptables -t mangle -L POSTROUTING | grep "DATA_IN"`" == "" ]; then
echo "Pridavam chain DATA_IN"
        iptables -t mangle -N DATA_IN
        iptables -t mangle -A POSTROUTING -j DATA_IN
    fi
    if [ "`iptables -t mangle -L PREROUTING | grep "DATA_OUT"`" == "" ]; then
echo "Pridavam chain DATA_OUT"
        iptables -t mangle -N DATA_OUT
        iptables -t mangle -A PREROUTING -j DATA_OUT
    fi
   
    for iface in $active_iface; do
for ip in `cat /proc/net/arp | grep "$iface" | awk '{print $1}'`; do
        echo "Testuji ip: $ip"
        if [ "`iptables -t mangle -L DATA_IN  -v -x -n | grep " $ip " | awk '{print $2}'`" == "" ]; then
echo "Pridavam pravidlo DATA_IN pro ip: $ip"
iptables -t mangle -A DATA_IN -d $ip -j RETURN
    fi
    if [ "`iptables -t mangle -L DATA_OUT  -v -x -n | grep " $ip " | awk '{print $2}'`" == "" ]; then
echo "Pridavam pravidlo DATA_OUT pro ip: $ip"
iptables -t mangle -A DATA_OUT -s $ip -j RETURN
    fi
done
    done
fi

# Nacteni dat z IPTABLES
counter_file=`cat $dir_data_txt/data.txt`
data=`iptables -t mangle -L DATA_OUT  -v -x -n -Z  | sed -e 's/ /-/g' | grep "RETURN"`
for i in $data; do
    ip=`echo $i | sed -e 's/-/ /g' | awk '{print $7}'`
    out=`echo $i | sed -e 's/-/ /g' | awk '{print $2}'`
    out_old=`echo -ne "$counter_file"  | grep "$ip-" | sed -e 's/-/ /g' | awk '{print $2}'`
    out_new=`echo $out_old + $out | bc `
    new_file_out="$new_file_out$ip-$out_new\n"
    out_aver=$(($out / 120))
    new_rdd_out="$new_rdd_out$ip-$out_aver\n"
    echo -ne "$ip\tOUT\tstare: $out_old \tnove: $out \tsoucet: $out_new\trate: $out_aver\n"
done
data=`iptables -t mangle -L DATA_IN  -v -x -n -Z  | sed -e 's/ /-/g' | grep "RETURN"`
for i in $data; do
    ip=`echo $i | sed -e 's/-/ /g' | awk '{print $8}'`
    in=`echo $i | sed -e 's/-/ /g' | awk '{print $2}'`
    in_old=`echo -ne "$counter_file"  | grep "$ip-" | sed -e 's/-/ /g' | awk '{print $3}'`
    in_new=`echo $in_old + $in | bc `
    new_file_in="$new_file_in$ip-$in_new\n"
    in_aver=$(($in / 120))
    new_rdd_in="$new_rdd_in$ip-$in_aver\n"
    echo -ne "$ip\tIN\tstare: $in_old \tnove: $in \tsoucet: $in_new\trate: $in_aver\n"
done


# Zapsani hodnot do txt souboru (pocitadlo prenesenych dat)
if [ $txt_active == "on" ]; then
    for i in `echo -ne $new_file_out`; do
ip=`echo $i | sed -e 's/-/ /g' | awk '{print $1}'`
out=`echo $i | sed -e 's/-/ /g' | awk '{print $2}'`
in=`echo -ne "$new_file_in" | grep "$ip-" | sed -e 's/-/ /g' | awk '{print $2}'`
counter_data="$counter_data$ip-$out-$in\n"
    done
    echo -ne $counter_data > $dir_data_txt/data.txt
fi


# Zapsani hodnot do rrd databaze (grafy prenosu)
if [ $rdd_active == "on" ]; then
    for i in `echo -ne $new_rdd_out`; do
        ip=`echo $i | sed -e 's/-/ /g' | awk '{print $1}'`
out=`echo $i | sed -e 's/-/ /g' | awk '{print $2}'`
        in=`echo -ne "$new_rdd_in" | grep "$ip-" | sed -e 's/-/ /g' | awk '{print $2}'`
    if [ ! -e "$dir_data_rdd/host-$ip.rrd" ]; then
rrdtool create "$dir_data_rdd/host-$ip.rrd" --step 120 DS:in:GAUGE:600:0:U DS:out:GAUGE:600:0:U RRA:AVERAGE:0.5:1:3600;
    fi
    rrdtool update "$dir_data_rdd/host-$ip.rrd" -t in:out N:$in:$out   
    done
fi