Часто недовольные пользователи приходят и просят дать им распечатку логов доступа в интернет.
Отчасти это позволяет сделать squid, но только при прозрачном проксировании, да и то логи только по http-протоколу.На помощь приходит iptables и syslog.
Настраиваем в syslog.conf добавление сообщений от ядра уровня debug (или уровня, который вам удобнее)
в отдельный файл. Лучше всего хранить эти логи на отдельном разделе (их размер огромен!
но проблему решает gzip - сжимает логи более чем в 10 раз).В моём syslog.conf была добавлена строка:
kern.=debug -/var/log/access/accessЖелательно, что бы в уровень debug сообщений от ядра не поступало никакой другой информации,
кроме информации от iptables. У меня так и получилось по умолчанию с уровнем debug.В rc.firewall было добавлено в самое начало:
#LOG ALL (!!!). Beware!!!
#FORWARD
iptables -A FORWARD -m state --state NEW -j LOG --log-level debug \
--log-prefix 'FRWLL_FWD_NEW ' # --log-tcp-options --log-ip-options
#iptables -A FORWARD -m state --state ESTABLISHED -j LOG --log-level debug \
# --log-prefix 'FRWLL_FWD_ESTBLSHD ' # --log-tcp-options --log-ip-options
#iptables -A FORWARD -m state --state RELATED -j LOG --log-level debug \
# --log-prefix 'FRWLL_FWD_RLTD ' # --log-tcp-options --log-ip-options
#iptables -A FORWARD -m state --state INVALID -j LOG --log-level debug \
# --log-prefix 'FRWLL_FWD_INVLD ' # --log-tcp-options --log-ip-options
#INPUT
iptables -A INPUT -m state --state NEW -j LOG --log-level debug \
--log-prefix 'FRWLL_INPT_NEW ' # --log-tcp-options --log-ip-options
#iptables -A INPUT -m state --state ESTABLISHED -j LOG --log-level debug \
# --log-prefix 'FRWLL_INPT_ESTBLSHD ' # --log-tcp-options --log-ip-options
#iptables -A INPUT -m state --state RELATED -j LOG --log-level debug \
# --log-prefix 'FRWLL_INPT_RLTD ' # --log-tcp-options --log-ip-options
iptables -A INPUT -m state --state INVALID -j LOG --log-level debug \
--log-prefix 'FRWLL_INPT_INVLD ' # --log-tcp-options --log-ip-options
Если раскомментировать все строки, то получиться лог с полной статистикой доступа - он будет очень большим.
Поэтому в данном примере имеем лог только по установкам соединений и ошибочным соединениям в цепочках INPUT и FORWARD.Итак. В logrotate я добавил (/etc/logrotate.d/access):
/var/log/access/access {
sharedscripts
compress
rotate 45
daily
postrotate
/bin/killall -HUP syslogd
endscript
}Сжимаем логи каждый день. Храним статистику за последние 45 суток.
Компрессия логов в моём случае дала значительный прирост производительности, поскольку шлюз
достаточно мощный и скорость парсинга логов упиралась только в чтение с HDD.В итоге был написан простой скрипт на perl, выдающий статистику в более-менее удобоваримой форме.
Вот и сам скрипт:
-------------------------#!/usr/bin/perl
use CGI qw(:standard);
use PerlIO::gzip;
use Switch;##Redefine before start:
my $LOG_DIR="/var/log/access/";
my $LOG_FILENAME="access";
##endmy $IP, $FLAG;
## Params delimeter in request: "-"
($IP, $FLAG) = split(/-/, $ARGV[0]);## if undefine IP or file log FLAG-number or FLAG is empty - parser exit:
if(!defined($IP)||!defined($FLAG)||$FLAG==""){
print header; print start_html;
print "Valid parameters required!"; print end_html; exit(1);
}print header;
print start_html("Stat for: $IP");
print "<h2>Stat for: $IP</h2><br/>", "\n<pre>";switch($FLAG)
{
case "0"
{
open($FD, "<$LOG_DIR$LOG_FILENAME")
or die "Cannot open current (0) log-file!<br> File does not exist or access not permitted!<br>";
while(<$FD>)
{
chomp;
s/gw kernel://g;
if(grep(/$IP/, $_))
{
print $_, "<br>\n";
}
}
close($FD);
}
else
{
open($GZIP, "<:gzip(lazy)", "$LOG_DIR$LOG_FILENAME.$FLAG.gz")
or die "Cannot open old (", $FLAG, ") log-file!<br> File does not exist or access not permitted!<br>";
while(<$GZIP>)
{
chomp;
s/gw kernel://g;
if(grep(/$IP/, $_))
{
print $_, "<br>\n";
}
}
close($GZIP);
}
}
print "</pre>\n";
print "<br><br>Access stat parser by \"umask at yandex dot ru\"<br>";
print end_html;
-------------------------Для работы скрипта необходимо установить модуль PerlIO-gzip. Найти ссылку на модуль можно на cpan.org.
Доступ к статистике можно получить через браузер (скрипт рассчитан для работы как CGI):
hostname.ru/cgi-bin/parse.pl?192.168.1.1-0Аргумент понимаеться так:
192.168.1.1 - искомая подстрока.
0 - норме лог файла. В данном случае текущий (в который пока ещё записываются сообщения syslog).
1 - вчерашний,
2 - позавчерашний,
3 - 3 дня назад.
.....
и т.д.Для меня данное решение оказалось удобным.
URL:
Обсуждается: http://www.opennet.me/tips/info/930.shtml
А использовать какой-нить netflow-коллектор не судьба?
перегружать машину надо после создания всех этих телодвижений?
Хм зачем изобретать велосипед?
Что касаеться iptables есть замечательное решение
под названием ulog!! Без всяких там дебагов и прочей лажи!!
2Dread
Камрад. Если у тебя есть реальный рабочий пример настроек и скриптов для ведения статистикик по ulog, под линукс скажем Mandrake, то я был бы очень признателен.
>2Dread
>Камрад. Если у тебя есть реальный рабочий пример настроек и скриптов для
>ведения статистикик по ulog, под линукс скажем Mandrake, то я
>был бы очень признателен.Выкладывать пример скрипта не буду, но система следующая:
1. iptables+ipt_ULOG+ulogd+mysql
2. Создаете табличку в mysql, указываете ее в настройках ulogd
3. пишите правило вроде: iptables -A FORWARD -j ULOG
4. запускаете iptables/mysql/ulogdПолучаете в таблице развернутую попакетную статистику. Для оптимизации таблицы написал следующее на пхп:
mysql_query("DROP TABLE tmp;");
mysql_query("CREATE TABLE tmp (ip_saddr INT UNSIGNED, ip_daddr INT UNSIGNED, ip_protocol TINYINT(2) UNSIG
NED,
ip_totlen INT(8) UNSIGNED, tcp_sport SMALLINT UNSIGNED, tcp_dport SMALLINT UNSIGNED,
udp_sport SMALLINT UNSIGNED, udp_dport SMALLINT UNSIGNED, time INT(10) UNSIGNED, INDEX(time));");$i=0;
$rows=mysql_query("SHOW TABLE STATUS LIKE 'traffic';");
$rows=mysql_result($rows, 0, 'Rows');while($i<=$rows):
mysql_query("INSERT INTO tmp SELECT * FROM traffic LIMIT 300000;");
mysql_query("INSERT INTO cache (ip_saddr,ip_daddr,ip_protocol,ip_totlen,tcp_sport,tcp_dport,udp_sport,udp
_dport,time)
SELECT ip_saddr,ip_daddr,ip_protocol,sum(ip_totlen),tcp_sport,tcp_dport,udp_sport,udp_dport,time
FROM tmp GROUP BY ip_saddr,ip_daddr,ip_protocol,tcp_sport,tcp_dport,udp_sport,udp_dport,time ORDER B
Y time;");
mysql_query("DELETE FROM tmp;");if($rows-$i<300000)
{
$temp=$rows-$i;
$query="DELETE FROM traffic LIMIT $temp;";
} else {
$query="DELETE FROM traffic LIMIT 300000;";
}mysql_query($query);
$i=$i+300000;
endwhile;mysql_query("DROP TABLE tmp;");
mysql_query("OPTIMIZE TABLE traffic;");
В таблицу traffic собсно складывается статистика. Идея скрипта - агрегировать статистику по пакетам в статистику по соединениям. Насколько это мне удалось - судить сложно, есть нюансы с mysql 4.1.Дальше вы можете генерировать какие угодно отчеты:
- по портам
- протоколам
- оправителям получателям
- и т.д.Учтите, если вы используете прокси на этой же машине надо будет отдельно настраивать ulog для порта прокси, вроде:
iptables -A INPUT -p tcp --dport 3128 -d $IP_PROXY -s $SUBNET_LOCAL -m state --state NEW,ESTABLISHED -j ULOG
iptables -A OUTPUT -p tcp --sport 3128 -s $IP_PROXY -s $SUBNET_LOCAL -m state --state NEW,ESTABLISHED -j ULOGПоследнее, нагрузка на mysql - 512k - 2-3%, и еще 10% wa, так что лучше иметь для статистики отдельную машину, если пользуете базу данных.
З.Ы. Тема простая, но объемная много простых нюансов которые следует учитывать.
2umask.
Камрад, сделал все по твоей доке. В лог access повалило так что мама не горюй. Скрипт перловый положил как написано в цгибин.
Через бровзер даю запрос такого рода
http://192.168.0.1/cgi-bin/genstat.pl?192.168.0.23-0
типа хочу статистику с этого ипа получить.
отвечает Valid parameters required!.
Даю тогда запрос http://192.168.0.1/cgi-bin/genstat.pl?192.168.0.23-1
просто пустую страничку демонстрирует.
Я может что то пропустил в процедуре настройки?
>А использовать какой-нить netflow-коллектор не судьба?Нет, не судьба. Посвятите нас в то, как это использовать. Может начнём.
>перегружать машину надо после создания всех этих телодвижений?
Нет, не нужно.
Нужно перезапустить syslog и запустить rc.firewall.>Хм зачем изобретать велосипед?
>Что касаеться iptables есть замечательное решение
под названием ulog!! Без всяких там дебагов и прочей лажи!!Хорошо. Предложите нам Ваш вариант использования.
Опишите его, я буду вам благодарен.Пришлось немного переписать скрипт.
Во время тестирования скрипта Opera ошалела и просто не принимала ничего от сервера со статистикой. Поэтому ...Выложить скрипт в комментарии не возможно.
Кому нужно - email есть.
если не сложно в этот ящик бросьте скрипт.
nbsp-team@mail.ru
Заранее спасибо большущее.
This message was created automatically by mail delivery software.A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:yelowtanya@mail.ru
user not found
>This message was created automatically by mail delivery software.
>
>A message that you sent could not be delivered to one or
>more of its
>recipients. This is a permanent error. The following address(es) failed:
>
> yelowtanya@mail.ru
> user not foundфигня какая то.
вот сюда пульните тогда, тут все должно пройти
pavel(собака)btlvolga.ru
>> А использовать какой-нить netflow-коллектор не судьба?
> Нет, не судьба. Посвятите нас в то, как это использовать. Может начнём.На выбор (ключевые слова "Net-flow" и/или "IP Cisco Accounting"):
fprobe.sf.net
ipcad.sf.net
ndsad.sf.net
и т.п.хошь подцепляй через ulog, хошь через pcap.
съем информации с помошью flow-tools (www.splintered.net/sw/flow-tools/)
а то что написано - это штаны через голову одевать.
Не спорю, но меня мой вариант на 200% устраивает ;-)А Ваш обязательно попробую :-)
это все хорошо когда твой пользователь сам в свою очередь админ раздющий инет далее и может сверить твои логи пакетов со своими, а вот простым пользователям прийдется долго и безуспешно обяснять что есть такое IP address, etc
www.netams.com
Вопрос следующего характера. В какую сторону посмотреть/почитать для ведения логов www трафика. Объясню конкретнее: в сквиде есть лог файл, кто куда ходил, в некоторых случаях мне не нужен сквид, точнее нет возможности его ставить, но возможность ведения таких же логов требуется в не меньшей степени.
Насколько я понял это или доп. модуль, либо программка на которую, при помощи iptables редиректятся пакеты на 80 порт, а прога уже обрабатывает и составляет лог, что-то наподобие прозрачного прокси. Вопрос на засыпку - есть ли такие решения и как это можно завязать с сохранением айпишника источника. Заранее спасибо :)