[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bande passante



On 2005-06-10 07:35:41 +0200, mailling@fache.be wrote:
> je voudrais calculer la bande passante utilisée sur un port particulier.
> Quel sont les possiblités ?

J'utilise iptables pour avoir les compteurs et RRDTools pour sauver
les données et les afficher sous formes de graphes.

Mes règles iptables pour calculer la bande passante locale et externe:

    if iptables -F; then
      iface="`ifconfig -a | sed -n 's/ .*00:30:65:CC:59:74.*//p'`"
      iface="${iface:-eth0}"
      ipsrc=192.168.0.3
      iptables -X
      iptables -A INPUT -i "$iface" -d $ipsrc -s 192.168.0.0/24 -j ACCEPT
      iptables -A INPUT -i "$iface" -d $ipsrc -j ACCEPT
      iptables -A OUTPUT -o "$iface" -s $ipsrc -d 192.168.0.0/24 -j ACCEPT
      iptables -A OUTPUT -o "$iface" -s $ipsrc -j ACCEPT
      iptables -Z
    fi

Je ne pense pas que ce soit bien compliqué d'adapter cela pour
spécifier un port particulier...

Les compteurs se lisent avec "iptables -vnxL". Mais il faut être root
pour utiliser iptables. Comme je voulais avoir accès aux compteurs en
tant que simple utilisateur, j'ai écrit un wrapper setuid root, appelé
"netcounters":

#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{
  execl("/sbin/iptables", "iptables", "-vnxL", (const char *) NULL);
  perror("netcounters");
  return 1;
}

Et enfin un script Perl qui utilise RRDTools:

#!/usr/bin/env perl

use strict;
use RRDs;

my $RCSID = '$Id: net-update 2770 2004-03-17 22:39:32Z lefevre $';
my ($proc) = $RCSID =~ /^.Id: (\S+) / or die;

@ARGV or die "Usage: $proc <rrdfile> [ <webdir> ]\n";

my $file = shift;
-f $file or die "$proc: RRDtool file isn't a plain file\n";
-r $file or die "$proc: RRDtool file isn't readable\n";
-w $file or die "$proc: RRDtool file isn't writable\n";

my $wdir = shift;
if (defined $wdir)
  { -d $wdir or die "$proc: $wdir isn't a directory\n"; }

my %t = (
  'day'   => 1,
  'week'  => 6,
  'month' => 24,
  'year'  => 288);

for(;;)
  {
    my $time = time;
    open NETC, "netcounters 2> /dev/null |"
      or die "$!\n$proc: can't execute netcounters\n";
    my ($chain,%c);
    while (<NETC>)
      {
        if (/^Chain (\S+)/)
          {
            undef $chain;
            $1 eq 'INPUT'  and $chain = 'in';
            $1 eq 'OUTPUT' and $chain = 'out';
          }
        elsif (defined $chain)
          {
            m:^\s*\d+\s+(\d+)\s.*192\.168\.0\.0/24:
              and $c{"loc_$chain"} = $1;
            m:^\s*\d+\s+(\d+)\s.*0\.0\.0\.0/0:
              and $c{"ext_$chain"} = $1;
          }
      }
    close NETC or die "$!\n$proc: netcounters failed\n";
    time - $time < 3
      and RRDs::update ($file, "$time:".join(':', map
        { defined $c{$_} ? $c{$_} : 'U' } qw/loc_in loc_out ext_in ext_out/));
    &rrdgraph('loc', 'local');
    &rrdgraph('ext', 'external');
    sleep 60;
  }

sub rrdgraph
  {
    defined $wdir or return;
    my ($name,$label) = @_;
    foreach (qw/day week month year/)
      {
        RRDs::graph ("$wdir/$name-$_.png", '-a', 'PNG',
          '-h', 200, '-v', "$label comm. (bytes/sec)", '-o',
          '--start', -120000*$t{$_},
          "DEF:in=$file:${name}_in:AVERAGE",
          "DEF:out=$file:${name}_out:AVERAGE",
          "AREA:in#00ff00", "LINE1:out#0000ff");
      }
  }


-- 
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Reply to: