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: