MRTG

от ILuxWiki

Направо към: навигация, търсене

Това е програма за изчертаване на графики, използва се предимно за изобразяване на трафика преминал през даден интерфейс, но е възможно да се следи и състоятнието на процесора, температура или други данни.

Съдържание

Линукс

Конфигурация без използването на iptables

/etc/mrtg.cfg

 # Global configuration
 WorkDir:        /var/www/stats
 IconDir:        ../
 WriteExpires: Yes
 
 Title[eth0]:    External Interface
 Target[eth0]:   `/root/bin/mrtg_data.sh eth0`
 PageTop[eth0]:  External Interface
 MaxBytes[eth0]: 10000000
 #Options[eth0]: absolute growright
 
 Title[eth1]:    Internal Interface
 Target[eth1]:   `/root/bin/mrtg_data.sh eth1`
 PageTop[eth1]:  Internal Interface
 MaxBytes[eth1]: 10000000
 #Options[eth1]: absolute growright  
 Title[^]: Traffic Analysis for


mrtg_data.sh

скрипт за извличане на данните от всеки интерфейс

 #!/bin/sh
 if [ "x$1" != "x" ]; then
       LINE=`cat /proc/net/dev | grep -w $1`
       echo $LINE | awk '{print $1" "$2}' | awk -F: '{print $2}' | awk '{print $1}'
       echo $LINE | awk -F: '{print $2}' | awk '{print $9}'
       echo `uptime`
       echo `hostname -f`
 else 
       exit 1;
 fi

Конфигурация с използването на iptables

mkmrtgcnf

използва се за създаване на mrtg.cfg, погледнете вашия стандартен mrtg.cfg и направете необходимите промени

 #!/usr/bin/perl -w
 # mkmrtgcnf by Todor Dragnev
 $fetchprog = "/g00net/bin/showacc";
 $default = "\
 ##
 ## autogenerate from $0
 ## 
 ". '
 #
 # this is default for interface
 #
 IconDir: /stats/mrtg
 WorkDir: /var/www/htdocs/stats
 Interval: 5
 ';
 print $default;
 @link = `/sbin/ip li`;
 for ( @link ) {
   push @devices, $1 if /^\d+:\s+(\w+)/;
 }
 for (@devices) {
   chomp;
   print "##\n";
   print "## $_\n";
   print "##\n";
   printf("Target[%s]: `%s %s`\n", $_, $fetchprog, $_);
   printf("Title[%s]: Traffic for %s\n", $_, $_);
   printf("MaxBytes[%s]: %s\n", $_, 18000);
   printf("AbsMax[%s]: %s\n", $_, 18000);
   printf("Suppress[%s]: %s\n", $_, "m w y");
   printf("PageTop[%s]: %s\n",$_,$_);
   printf("Directory[%s]: %s\n", $_, $_);
   print "\n";
 }


showacc

скрипт за извличане на данните от iptables

 #!/usr/bin/perl
 # script by Todor Dragnev aka t0d0r
 
 $devname = shift;
 
 $in_devname = "I" . $devname;
 $out_devname = "O" . $devname;
 
 @in_traffic  = split "\n", `/usr/sbin/iptables -L $in_devname  -nvx`;
 @out_traffic = split "\n", `/usr/sbin/iptables -L $out_devname -nvx`;
 
 #print $in_traffic[2] ."\n" ;
 #print $out_traffic[2] . "\n" ;
 
 if ( $in_traffic[2] =~ /^\s{0,}(\d+)\s+(\d+)/ )
   {
     $in_bytes = $2;
   } else { $in_bytes = 0 ;}
 if ( $out_traffic[2] =~ /^\s{0,}(\d+)\s+(\d+)/ )
   {
     $out_bytes = $2;
   } else { $out_bytes = 0; }
 print "$in_bytes\n$out_bytes\n"

mkmrtgindex

за създаване на index.html

 #!/usr/bin/perl -w
 # mkmrtgindex by Todor Dragnev
 
 @link = `/sbin/ip li`;
 
 for ( @link ) {
   push @devices, $1 if /^\d+:\s+(\w+)/;
 }
 
 print "<html>\n";
 print "<body>\n";
 print "<center>\n";
 print "<table>\n";
 for $dev ( sort @devices ) {
   print "<tr><td>Interface $dev</td></tr>\n";
   print "<tr><td><a href=\"$dev/$dev.html\"><img src=\"$dev/$dev-day.png\" border=0></a></td></tr>\n";
   print "<tr><td> </td></tr>\n";
 } 
 print "</table>\n";
 print "</center>\n";
 print "</body></html>\n";

upmrtgchain

създаване на правилата в iptables

 #!/usr/bin/perl -w
 # upmrtgchain by Todor Dragnev
 @link = `/sbin/ip li`;
 
 push @devices, "ppp0";
 for ( @link ) {
   push @devices, $1 if /^\d+:\s+(\w+)/;
 }
 
 for (@devices) {
   `/sbin/iptables -N I$_`;
   `/sbin/iptables -A I$_`;
   `/sbin/iptables -N O$_`;
   `/sbin/iptables -A O$_`;
   `/sbin/iptables -A INPUT -i $_ -j I$_`;
   `/sbin/iptables -A OUTPUT -o $_ -j O$_`;
 }

FreeBSD

IPFW: get_acc.pl - изчитане на трафика по определено IP

#!/usr/bin/perl
# script by Todor Dragnev aka t0d0r

$ip = shift;

$in_reg = sprintf("ip from %s to", $ip);
$out_reg =  sprintf("ip from any to %s out", $ip);

#00101   39265    3353279 count ip from 192.168.140.3 to any in via net1
#00101   51047   53545678 count ip from any to 192.168.140.3 out via net1
@rules = `/sbin/ipfw show 100-300`;

$in_bytes  = 0;
$out_bytes = 0;

for (@rules) {
       if ($_ =~ /$in_reg/) {
               ($rule, $none, $in_bytes, @none) = split /\s+/, $_;
       }
       if ($_ =~ /$out_reg/) {
               ($rule, $none, $out_bytes, @none) = split /\s+/, $_;
       }
}
print "$in_bytes\n$out_bytes\n"

--Sysop 12:02, 9 дек 2005 (EET)

Лични инструменти