Списък на потребителите с дропнати конекции и техния брой.
от Илия Няголов на ное..28, 2007, категории Линукс
Първо искам да подчертая че аз не съм програмист 🙂 , и ми е простено за може би лошо написания код по-долу.
1. Настройка на Apache сървър. Добавяте файла „iptables.conf“ в „/etc/apache2/vhosts.d“ и рестартирате web сървъра.
#/etc/apache2/vhosts.d/iptables.conf
Alias /iptables „/var/www/localhost/iptables/“
<Directory „/var/www/localhost/iptables“>AddHandler cgi-script .cgi
Options +FollowSymLinks Indexes ExecCGI
AllowOverride none
DirectoryIndex index.cgi
order deny,allow
Deny from all
allow from 22.211.18.33 22.211.18.32
</Directory>
2. Даване на права за изпълнение на „apache“ потребителя върху „/sbin/iptables“.
Създавате директорията „/var/www/localhost/iptables“
mkdir /var/www/localhost/iptables
cd /var/www/localhost/iptables
Създавате файла „ipta.c“ в “ /var/www/localhost/iptables“ и го компилирате.
#include <unistd.h>
//######################################
//#ipta.c
//######################################
// добави пътя на iptables
char IPTABLES[] = „/sbin/iptables“;main(int argc, char *argv[])
{
argv[0] = IPTABLES;
execv(IPTABLES, argv);
return 1;
}
Компилиране и права на създадения файл „ipta“:
gcc -oipta ipta.c
chown root.root ipta
chmod 6755 ipta
rm ipta.c
Чрез създадения файл „ipta“, „apache“ потребителя извиква „iptables“ и го управлява като „root“.
3. Създаване на правила за ограничаване на 70 едновременни конекции на потребител посредством „iptables“. В статията „Gentoo iptables + l7filter + connlimit със 2.6.22-gentoo-r9“ съм обяснил точно как става пачването на „iptables“ и „kernel-sources“ с „patch-o-matic-ng“.
Създавате файла „rc.connection“ и го зареждате след „/etc/init.d/iptables“.
#rc.connection
IPTABLES=/sbin/iptables$IPTABLES -N connections
IPS=255
while [ $IPS != 30 ]; do
let IPS=$IPS-1
$IPTABLES -A connections -i ppp+ -s 21.121.15.$IPS -p tcp –syn -m connlimit –connlimit-above 70 -j REJECT
$IPTABLES -A connections -i ppp+ -d 21.121.15.$IPS -p tcp –syn -m connlimit –connlimit-above 70 -j REJECT
done$IPTABLES -A FORWARD -j connections
4. Създаване на web интерфейс.
Създавате файла „index.cgi“ в „/var/www/localhost/iptables“.
#!/usr/bin/perl
#/var/www/localhost/iptables/index.cgi
use strict;
use DBI;
use warnings;
use CGI qw/:standard/;my $bgcolor=“#D7FF93″;
my $bgcolor2=“#3C5E21″;
my $bgcolor1=$bgcolor2;
#my $bgcolor1=“#A4FF59″;my $ipta=“/var/www/localhost/iptables/ipta“;
sub readallvariables;
my @vars = readallvariables;if (($vars[0] eq „num“)&&($vars[1] eq 1)) {
system „$ipta -Z connections“;
}#start web
print header(-charset => ‘windows-1251’),
start_html(-title => ‘Iptables’, -author=>’ilia@sharcom.org’, -base=>’true’, -BGCOLOR=>“$bgcolor“, -dtd=>1,
-head=>meta({-http_equiv=>’Refresh’, -content=>’5; index.cgi’}));
print „<center><h1>Списък на любимите ни клиенти</h1></center>“;
print „<form action=\“index.cgi?num=1\“ method=\“post\“>“
. „<input bgcolor=blue type=\“Submit\“ value=\“Нулиране на брояча\“>“
. „</form>“;
show_ip();
print „</body></meta>“;
end_html();
#end websub show_ip {
open(DET, „$ipta“ . ‘ -L connections -v -n –line | grep „0 0 REJECT“ -v |’) || die „No sach file ‘/sbin/iptables’ $!\n“;
my $dbh = DBI->connect( ‘DBI:mysql:abills:21.121.15.2’, ‘username’, ‘password’,{‘RaiseError’ => 1}) || die „Database connection not made: $DBI::errstr“;
print „<center><table width=600 cellspacing=1 cellpadding=1 border=1 bgcolor=$bgcolor2><tr>“
.“<td bgcolor=$bgcolor1> ip-адрес </td>“
.“<td bgcolor=$bgcolor1> Потребилтел </td>“
.“<td bgcolor=$bgcolor1> пакети </td>“
.“<td bgcolor=$bgcolor1> bytes </td><td bgcolor=$bgcolor1> конекций </td></tr>“;while(<DET>) {
# Да се показват само редовете започващи с цифра – демек само резултатите 🙂
if ($_ =~ /^[0-9]/) {
print „<tr>“;
# чрез „split“ образуваме масив от даден ред
my @splitedString = split;# четене на масив и показване
#foreach (@splitedString){
#print $_,“\n“;
#}my $ipsa = $splitedString[8];
my $sth = $dbh->prepare(„SELECT * FROM dv_calls WHERE INET_NTOA(framed_ip_address)=’$ipsa'“);$sth->execute();
my $ref =$sth->fetchrow_hashref();
my $user = „$ref->{‘user_name’}“;$sth = $dbh->prepare(„SELECT * FROM users WHERE id=’$user'“);$sth->execute();
$ref =$sth->fetchrow_hashref();
my $uid = „$ref->{‘uid’}“;if (!($user)){
$user = „Потебителя не съществува“ ;
}print „<td bgcolor=$bgcolor>“,$splitedString[8],“</td>“
.“<td bgcolor=$bgcolor><a href=http://billing.sharcom.org/admin/index.cgi?index=15&UID=$uid>$user</a></td>“
.“<td bgcolor=$bgcolor>“,$splitedString[1],“</td>“
.“<td bgcolor=$bgcolor>“,$splitedString[2],“</td>“
.“<td bgcolor=$bgcolor>“,$splitedString[14],“</td>“;
}
print „</tr>“;
}
print „</table></center>“;
$dbh->disconnect();
}sub readallvariables {
if (my $record = $ENV{‘QUERY_STRING’}) {
my @in=split /&/, $record;
foreach my $i (0 .. $#in) {
$in[$i] =~ s/\+/ /g;
$in[$i] =~ s/%(..)/pack(„c“,hex($1))/ge;
my ($key,$val) = split(/=/,$in[$i],2);
$key=~ s/%(..)/pack(„c“,hex($1))/ge;
$val =~ s/%(..)/pack(„c“,hex($1))/ge;
my @keya = ($key, $val);
return @keya;
}
}
}
Забележка: На мен съм си го направил вместо да ми показва IP аредресите на дадените потребители, да ми показва техните потребителски имена вземайки от база данни.
Поемете дъх и си отворете страницата:
„http://127.0.0.1/iptables/“
Един screenshot.
ноември 28th, 2007 on 2:48 pm
Тази статия определено я претупах :), умората си казва думата!