The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Статистика сетевых соединений через syslog и iptables
Часто недовольные пользователи приходят и просят дать им распечатку логов доступа в интернет. 
Отчасти это позволяет сделать 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 дня назад.
.....
и т.д.

Для меня данное решение оказалось удобным.
 
29.11.2005 , Автор: umask
Ключи: iptables, linux, traffic, log / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Syslog, ведение логов

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, KonstantinK (??), 13:55, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А использовать какой-нить netflow-коллектор не судьба?
     
  • 1.2, zombie (??), 14:56, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    перегружать машину надо после создания всех этих телодвижений?
     
  • 1.3, Dread (?), 15:35, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хм зачем изобретать велосипед?
    Что касаеться iptables есть замечательное решение
    под названием ulog!! Без всяких там дебагов и прочей лажи!!
     
  • 1.4, zombie (??), 15:56, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    2Dread
    Камрад. Если у тебя есть реальный рабочий пример настроек и скриптов для ведения статистикик по ulog,  под линукс скажем Mandrake, то я был бы очень признателен.
     
     
  • 2.12, sash (??), 23:30, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Выкладывать пример скрипта не буду, но система следующая 1 iptables ipt_ULOG u... большой текст свёрнут, показать
     

  • 1.5, zombie (??), 15:59, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    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
    просто пустую страничку демонстрирует.
    Я может что то пропустил в процедуре настройки?
     
  • 1.6, umask (?), 16:21, 29/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >А использовать какой-нить netflow-коллектор не судьба?

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

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

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

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

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

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

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

     
     
  • 2.7, zombie (??), 16:32, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    если не сложно в этот ящик бросьте скрипт.
    nbsp-team@mail.ru
    Заранее спасибо большущее.
     
     
  • 3.8, umask (?), 17:40, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    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

     
     
  • 4.9, zombie (??), 17:44, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >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

     
  • 2.10, KonstantinK (??), 22:36, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >> А использовать какой-нить 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/)

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

     
     
  • 3.11, umask (?), 23:14, 29/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Не спорю, но меня мой вариант на 200% устраивает ;-)

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

     

  • 1.13, DM (??), 09:58, 06/12/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    это все хорошо когда твой пользователь сам в свою очередь админ раздющий инет далее  и может сверить твои логи пакетов со своими, а вот простым пользователям прийдется долго и безуспешно  обяснять что есть такое IP address, etc
     
  • 1.14, saylor_ua (??), 11:53, 19/12/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    www.netams.com
     
  • 1.15, N.Leiten (?), 11:15, 10/02/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вопрос следующего характера. В какую сторону посмотреть/почитать для ведения логов www трафика. Объясню конкретнее: в сквиде есть лог файл, кто куда ходил, в некоторых случаях мне не нужен сквид, точнее нет возможности его ставить, но возможность ведения таких же логов требуется в не меньшей степени.
    Насколько я понял это или доп. модуль, либо программка на которую, при помощи iptables редиректятся пакеты на 80 порт, а прога уже обрабатывает и составляет лог, что-то наподобие прозрачного прокси. Вопрос на засыпку - есть ли такие решения и как это можно завязать с сохранением айпишника источника. Заранее спасибо :)
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру