Traffic tellen per IP gebaseerd op iptables

Pagina: 1
Acties:

  • Wupsje
  • Registratie: Januari 2001
  • Laatst online: 13-11-2024
Ik ga ervan uit dat je geinstalleerd & werkende hebt :

- een of andere versie van linux
- iptables
- perl
- rrdtool (www.rrdtool.org)
- Verstand van CRON/perl/kortom gezond verstand :)

maak de volgende entry aan in een scriptje dat start bij het opstarten (rc.local bv)

iptables -I FORWARD 1 -i eth1 -s 192.168.0.x
iptables -I FORWARD 1 -i eth0 -d 192.168.0.x

De eerste is de rule voor al het uitgaand verkeer op dat IP, de tweede uiteraard voor inkomend verkeer.

Herhaal dit voor alle ip's die je wilt bijhouden.

Onderaan deze post zet ik een bestandje dat je om de x aantal minuten in de CRON daemon moet aanroepen.
Dit bestandje zul je execute rechten moeten geven (chmod).

Uiteraard even doorlopen op paden (path) die fout staan..
Bij mij staat alles in de /etc/rc.d

PS Het scriptje refereert ook nog naar /etc/rc.d/ips.txt
dit is gewoon een bestandje met op elke regel een ip-adres.
Dat zijn uiteindelijk de ip's die die monitor & opslaat.

Voor vragen opmerkingen hier reageren of email naar got@wps.tmfweb.nl

-----------------------------------------------------------
#!/usr/bin/perl

sub get_ip_counters {

local(@ip) = @_;

my (@rules, @in_bytes, @in_pkts, @out_pkts, @out_bytes, $upTime);

$_=`/sbin/iptables -L FORWARD -nvx | grep -w "@ip" | grep eth0`;
@rules = split;
@in_bytes = split(' ',$rules[1]);
@in_pkts = split(' ', $rules[0]);

$_=`/sbin/iptables -L FORWARD -nvx | grep -w "@ip" | grep eth1`;
@rules = split;
@out_bytes = split(' ',$rules[1]);
@out_pkts = split(' ', $rules[0]);

# uptime of the machine
open(UPTIME,"uptime |cut -b 13-26|");
$upTime=<UPTIME>;
close(UPTIME);
chop $upTime;

if (!$in_bytes[0]) { $in_bytes[0] = 0; }
if (!$out_bytes[0]) { $out_bytes[0] = 0; }

return ($in_bytes[0],$out_bytes[0]);
}

open (FILE,"/etc/rc.d/ips.txt");
@file = <FILE>;
close FILE;
foreach (@file) {
@ipadres = $_;
@ipadres = split(' ',$ipadres[0]);
@resultaat = get_ip_counters(@ipadres);


if (-e "/etc/rc.d/@ipadres.rrd") {
system "/usr/local/rrdtool-1.0.33/bin/rrdtool update /etc/rc.d/@ipadres.rrd N:@resultaat[0]:@resultaat[1]";
}
else {
system "/usr/local/rrdtool-1.0.33/bin/rrdtool create /etc/rc.d/@ipadres.rrd -s 60 DS:input:ABSOLUTE:90:0:U DS:output:AB
system "/usr/local/rrdtool-1.0.33/bin/rrdtool update /etc/rc.d/@ipadres.rrd N:@resultaat[0]:@resultaat[1]";
}

}
system "/sbin/iptables -Z";

  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
beetje (heel erg) late reactie, maar ik wil zoiets graag op mijn server zetten en vroeg me af waarom je eth0 en eth1 hebt en niet gewoon 2x eth0 :?

Bij mij blijven te tellers overigens op nul staan.
code:
1
2
3
4
5
[root@ns root]# /sbin/iptables -L FORWARD -nvx
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0            tcp  --  eth0   *       0.0.0.0/0            69.0.***.**        
       0        0            tcp  --  eth0   *       69.0.***.**          0.0.0.0/0


na de inputs:
code:
1
2
3
iptables -F
iptables -I FORWARD 1 -p tcp -i eth0 -d 69.0.***.**
iptables -I FORWARD 1 -p tcp -i eth0 -s 69.0.***.**


Iemand een id hoe dit kan? }:O


overige info
code:
1
2
[root@ns root]# uname -a
Linux ns.***.com 2.4.20-28.7 #1 Thu Dec 18 11:31:59 EST 2003 i686 unknown


ifconfig voor het ip in kwestie
code:
1
2
3
4
eth0:4    Link encap:Ethernet  HWaddr 00:30:48:52:38:**  
          inet addr:69.0.***.**  Bcast:69.0.221.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:10 Base address:0x1000

[ Voor 44% gewijzigd door JasperE op 19-10-2004 00:00 ]


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 27-01 12:55

Bergen

Spellingscontroleur

Het script even met correcte inspringing...

Er klopt ook iets niet in die else aan 't einde. Die eerste system-regel wordt niet afgesloten met aanhalingstekens en een puntkomma. Ik ken geen Perl en weet dus ook niet of er nog meer ontbreekt aan die zin, maar ik zie wel dat ie niet compleet is. Misschien is "; aan 't einde genoeg om het script te corrigeren. :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/perl

sub get_ip_counters {
    local(@ip) = @_;

    my (@rules, @in_bytes, @in_pkts, @out_pkts, @out_bytes, $upTime);

    $_=`/sbin/iptables -L FORWARD -nvx | grep -w "@ip" | grep eth0`;
    @rules = split;
    @in_bytes = split(' ',$rules[1]);
    @in_pkts = split(' ', $rules[0]);

    $_=`/sbin/iptables -L FORWARD -nvx | grep -w "@ip" | grep eth1`;
    @rules = split;
    @out_bytes = split(' ',$rules[1]);
    @out_pkts = split(' ', $rules[0]);

    # uptime of the machine
    open(UPTIME,"uptime |cut -b 13-26|");
    $upTime=<UPTIME>;
    close(UPTIME);
    chop $upTime;

    if (!$in_bytes[0]) { $in_bytes[0] = 0; }
    if (!$out_bytes[0]) { $out_bytes[0] = 0; }

    return ($in_bytes[0],$out_bytes[0]);
}

open (FILE,"/etc/rc.d/ips.txt");
@file = <FILE>;
close FILE;
foreach (@file) {
    @ipadres = $_;
    @ipadres = split(' ',$ipadres[0]);
    @resultaat = get_ip_counters(@ipadres);

    if (-e "/etc/rc.d/@ipadres.rrd") {
        system "/usr/local/rrdtool-1.0.33/bin/rrdtool update /etc/rc.d/@ipadres.rrd N:@resultaat[0]:@resultaat[1]";
    } else {
        system "/usr/local/rrdtool-1.0.33/bin/rrdtool create /etc/rc.d/@ipadres.rrd -s 60 DS:input:ABSOLUTE:90:0:U DS:output:AB
        system "/usr/local/rrdtool-1.0.33/bin/rrdtool update /etc/rc.d/@ipadres.rrd N:@resultaat[0]:@resultaat[1]";
    }
}

system "/sbin/iptables -Z";

  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Het iptables probleem heb ik inmiddels opgelost door een nieuwe chain aan te maken. In die nieuwe chain een regel met een RETURN aan te maken. En vanuit INPUT en OUTPUT via een iptables -j daar alles weer langs te leiden. Beetje vaag maar ik zal nog wel ff posten hoe precies precies als ik thuis ben :)

[ Voor 39% gewijzigd door JasperE op 19-10-2004 10:10 ]


Verwijderd

zoek eens op sasacct, doet precies wat je wilt :)

edit: Dit topic is 2 jaar oud :+ Beetje nutteloos :)

[ Voor 37% gewijzigd door Verwijderd op 19-10-2004 11:09 ]


  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Verwijderd schreef op 19 oktober 2004 @ 11:08:
zoek eens op sasacct, doet precies wat je wilt :)

edit: Dit topic is 2 jaar oud :+ Beetje nutteloos :)
Nou dat is dus eigenlijk precies niet wat ik wil. Kant en klare bandbreedte-grafiek paketten zijn er genoeg, maar daar ben ik totaal niet in geinteresseerd. Ik wil namelijk zelf mijn eigen lichtgewicht oplossing in elkaar draaien :Y)
Het gaat mij in dit topic ook niet zozeer om dat perl script maar meer de correcte iptables regels zodat ik zelf een script daarbij kan maken.

Voor jou is dit oude topic misschien nutteloos, voor mij allerminst nutteloos.

Edit: Wel een leuk progje overigens, als ik dat 2 jaar geleden tegen was gekomen had ik het waarschijnlijk wel gebruikt :)

[ Voor 21% gewijzigd door JasperE op 19-10-2004 12:23 ]


  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Ok ik heb inmiddels iets in elkaar gedraaid.

code:
1
-Nieuwe versie binnenkort-



Opbouwende kritiek graag :Y) Dit is een van mijn allereerste perl projectes, kritiek op syntax is ook welkom dus!

[ Voor 122% gewijzigd door JasperE op 21-10-2004 14:04 ]


  • Oezie Woezie
  • Registratie: December 1999
  • Niet online

Oezie Woezie

Pim. is de beste

code:
1
2
3
 #Set all the counters in the BMON chains in iptables back to 0
  system "/sbin/iptables -Z BMONI";
  system "/sbin/iptables -Z BMONO";

waarom doe je dat niet gelijk als je de waardes ook inleest?
nu kan het zijn dat je wat dataverkeer mist.

een mooi Tshirt met Pim. is de beste enzo


Verwijderd

Het is alleen nogal onlogisch om het uitgaande verkeer negatief te tellen in de grafiek :) Doe het dan zoals MRTG het doet, dat werkt ook prettig en je houdt meer preciesie over omdat je minder ruimte nodig hebt ín de grafiek als je snapt wat ik bedoel.

Ik kan de code zo snel niet draaien, maar heb je er ook een formpje in zitten waarbij je de bandbreedte per tijdsvak kan opvragen?

  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Verwijderd schreef op 20 oktober 2004 @ 09:35:
Het is alleen nogal onlogisch om het uitgaande verkeer negatief te tellen in de grafiek :) Doe het dan zoals MRTG het doet, dat werkt ook prettig en je houdt meer preciesie over omdat je minder ruimte nodig hebt ín de grafiek als je snapt wat ik bedoel.
Dat had ik aanvankelijk zo, maar zo vind ik het toch leuker :P Ik zal hier wel een optie voor maken in de configuratie, is heel simpel te doen :)
Ik kan de code zo snel niet draaien, maar heb je er ook een formpje in zitten waarbij je de bandbreedte per tijdsvak kan opvragen?
Nog niet, dagelijkse totalen was ik nog van plan toe te gaan voegen met mySQL. RRd heeft hier voor zover ik weet geen ondersteuning voor, maar ook dat moet ik nog opzoeken om dit zeker te weten.
Oezie Woezie schreef op 20 oktober 2004 @ 01:02:
code:
1
2
3
 #Set all the counters in the BMON chains in iptables back to 0
  system "/sbin/iptables -Z BMONI";
  system "/sbin/iptables -Z BMONO";

waarom doe je dat niet gelijk als je de waardes ook inleest?
nu kan het zijn dat je wat dataverkeer mist.
Omdat je voor zover ik weet alleen kan resetten in de hele chain en niet per rule. Als je het verkeer voor meerdere ip's uitleest moet je deze dus eerst allemaal uitlezen voordat je reset anders lees je alleen het eerste ip goed uit.
Het is denk ik inderdaad een beter idee op waardes voor alle ips in een array in te lezen en er dan gelijk een reset achter te zetten. Ik heb zojuist gelezen dat je -L en -Z samen in 1 commando kan gebruiken. Hiermee zou dit probleem dus opgelost zijn. Bedankt voor de suggestie :)

[ Voor 4% gewijzigd door JasperE op 20-10-2004 11:02 ]


  • Oezie Woezie
  • Registratie: December 1999
  • Niet online

Oezie Woezie

Pim. is de beste

OD-Frozen schreef op 20 oktober 2004 @ 11:01:

[...]

Nog niet, dagelijkse totalen was ik nog van plan toe te gaan voegen met mySQL. RRd heeft hier voor zover ik weet geen ondersteuning voor, maar ook dat moet ik nog opzoeken om dit zeker te weten.

[...]
je kan het wel met rrdtool uitrekenen.
code:
1
2
3
4
5
push(@data,"--start=-$span");
push(@data,"CDEF:totalin=in,UN,0,in,$span,*,IF");
push(@data,"CDEF:totalout=out,UN,0,out,$span,*,IF");
push(@data,"GPRINT:totalin:AVERAGE:Total traffic\\: %.2lf %s\\n");
push(@data,"GPRINT:totalout:AVERAGE:Total traffic\\: %.2lf %s");

waar $span een geheel aantal seconden is, voor een dag dus 24*60*60=86400 sec.
je kan zoiets ook weer verwerken in een perl script en dan zelf een bargraph maken, of gewoon zoiets gebruiken http://gbgraph2.hauwaerts.be/. zelf heb ik ook zoiets gemaakt, alleen dan ook met onderscheid tussen incomming en outgoing traffic, zie http://octopus.oezie.org/cgi-bin/over/traffic.pl (source http://octopus.oezie.org/traffic.txt en http://octopus.oezie.org/gbgraph.txt moet nog wel wat in verandert worden dan)

een mooi Tshirt met Pim. is de beste enzo


  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
he bedankt oezie, dat ga ik vrijwel zeker toepassen in mijn script als ik even tijd heb! :*)

En die bargraphs ook nog wel denk ik :)

[ Voor 19% gewijzigd door JasperE op 20-10-2004 13:52 ]


  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Ik heb inmiddels de opbouw van het script enigzins gewijzigd en een aparte grafiek voor iedere maand van het jaar toegevoegd. In deze maandgrafieken kun je ook je maandtotalen terugvinden, handig dus als je isp een datalimiet heeft. Wat ik nu eerst ga toevoegen is een grafiek voor de output van "ifconfig eth0". Een grafiek voor het totale dataverkeer van het systeem dus. Wanneer je dan alleen deze grafiek enabled en de individuele-ip-grafieken uitzet zullen er geen iptable rules worden toegevoegd. :)

Ik zal 't wel posten in een nieuwe thread als het 'af' is.

[ Voor 36% gewijzigd door JasperE op 21-10-2004 09:17 ]


Verwijderd

Ik stel voor dat je em dan in de PW gooit, daar zitten ook meer mensen met verstand van perl enzo :)

  • JasperE
  • Registratie: December 2003
  • Laatst online: 27-01 23:07
Goed idee! Je zult hem daar deze week wel zien verschijnen :Y)
Pagina: 1