URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 12868
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Статистика сетевых соединений через syslog и iptables"

Отправлено auto_tips , 29-Ноя-05 13:55 
Часто недовольные пользователи приходят и просят дать им распечатку логов доступа в интернет.
Отчасти это позволяет сделать 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";
   ##end

   my $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


Содержание

Сообщения в этом обсуждении
"Статистика сетевых соединений через syslog и iptables"
Отправлено KonstantinK , 29-Ноя-05 13:55 
А использовать какой-нить netflow-коллектор не судьба?

"Статистика сетевых соединений через syslog и iptables"
Отправлено zombie , 29-Ноя-05 14:56 
перегружать машину надо после создания всех этих телодвижений?

"Статистика сетевых соединений через syslog и iptables"
Отправлено Dread , 29-Ноя-05 15:35 
Хм зачем изобретать велосипед?
Что касаеться iptables есть замечательное решение
под названием ulog!! Без всяких там дебагов и прочей лажи!!

"Статистика сетевых соединений через syslog и iptables"
Отправлено zombie , 29-Ноя-05 15:56 
2Dread
Камрад. Если у тебя есть реальный рабочий пример настроек и скриптов для ведения статистикик по ulog,  под линукс скажем Mandrake, то я был бы очень признателен.

"Статистика сетевых соединений через syslog и iptables"
Отправлено sash , 29-Ноя-05 23:30 
>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, так что лучше иметь для статистики отдельную машину, если пользуете базу данных.

З.Ы. Тема простая, но объемная много простых нюансов которые следует учитывать.


"Статистика сетевых соединений через syslog и iptables"
Отправлено zombie , 29-Ноя-05 15:59 
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
просто пустую страничку демонстрирует.
Я может что то пропустил в процедуре настройки?

"Статистика сетевых соединений через syslog и iptables"
Отправлено umask , 29-Ноя-05 16:21 
>А использовать какой-нить netflow-коллектор не судьба?

Нет, не судьба. Посвятите нас в то, как это использовать. Может начнём.

>перегружать машину надо после создания всех этих телодвижений?

Нет, не нужно.
Нужно перезапустить syslog и запустить rc.firewall.

>Хм зачем изобретать велосипед?
>Что касаеться iptables есть замечательное решение
под названием ulog!! Без всяких там дебагов и прочей лажи!!

Хорошо. Предложите нам Ваш вариант использования.
Опишите его, я буду вам благодарен.

Пришлось немного переписать скрипт.
Во время тестирования скрипта Opera ошалела и просто не принимала ничего от сервера со статистикой. Поэтому ...

Выложить скрипт в комментарии не возможно.
Кому нужно - email есть.


"Статистика сетевых соединений через syslog и iptables"
Отправлено zombie , 29-Ноя-05 16:32 
если не сложно в этот ящик бросьте скрипт.
nbsp-team@mail.ru
Заранее спасибо большущее.

"Статистика сетевых соединений через syslog и iptables"
Отправлено umask , 29-Ноя-05 17:40 
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


"Статистика сетевых соединений через syslog и iptables"
Отправлено zombie , 29-Ноя-05 17:44 
>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


"Статистика сетевых соединений через syslog и iptables"
Отправлено KonstantinK , 29-Ноя-05 22:36 
>> А использовать какой-нить 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/)

а то что написано - это штаны через голову одевать.


"Статистика сетевых соединений через syslog и iptables"
Отправлено umask , 29-Ноя-05 23:14 
Не спорю, но меня мой вариант на 200% устраивает ;-)

А Ваш обязательно попробую :-)


"Раздел полезных советов: Статистика сетевых соединений через..."
Отправлено DM , 06-Дек-05 09:58 
это все хорошо когда твой пользователь сам в свою очередь админ раздющий инет далее  и может сверить твои логи пакетов со своими, а вот простым пользователям прийдется долго и безуспешно  обяснять что есть такое IP address, etc

"Статистика сетевых соединений через syslog и iptables"
Отправлено saylor_ua , 19-Дек-05 11:53 
www.netams.com

"Раздел полезных советов: Статистика сетевых соединений через..."
Отправлено N.Leiten , 10-Фев-06 11:15 
Вопрос следующего характера. В какую сторону посмотреть/почитать для ведения логов www трафика. Объясню конкретнее: в сквиде есть лог файл, кто куда ходил, в некоторых случаях мне не нужен сквид, точнее нет возможности его ставить, но возможность ведения таких же логов требуется в не меньшей степени.
Насколько я понял это или доп. модуль, либо программка на которую, при помощи iptables редиректятся пакеты на 80 порт, а прога уже обрабатывает и составляет лог, что-то наподобие прозрачного прокси. Вопрос на засыпку - есть ли такие решения и как это можно завязать с сохранением айпишника источника. Заранее спасибо :)