ПРОЕКТЫ 


  АРХИВ 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 


Модули Apache 

Прочие программы 



ПИШИТЕ
ПИСЬМА














     ПРОГРАММЫ :: Прочие программы

grepip

Программа для поиска IP-адресов в текстовых файлах

Copyright (C) 2003 Alex Tutubalin, lexa@lexa.ru

Download: ftp://ftp.lexa.ru/pub/domestic/lexa/grepip-1.0.tar.gz

Использование

    grepip [options] [-f pattern-file|PATTERN] file1 file2....
например: grepip 192.168.0.0/16 /var/log/maillog
эта команда напечатает все строчки из /var/log/maillog в которых встречаются адреса 192.168.0.0-192.168.255.255

Особенности и свойства

  • Для выделения IP-адресов из входных файлов используются регулярные выражения (perl/pcre style).
  • Списки адресов для поиска могут читаться из файлов, количество этих адресов ограничено только количеством свободной памяти.
  • Поддерживаются теги - каждый используемый диапазон IP-адресов может иметь свою метку, которая печатается в выдаче. Например, команда
    grepip -p -P -f cbl -f dsbl /var/log/maillog
    напечатает что-то в духе:
      cbl: Nov 23 00:29:10 www postfix/smtpd[24629]: reject: RCPT from unknown[4.4.247.81]: 550...
      dsbl: Nov 23 00:29:10 www postfix/smtpd[24559]: connect from user-0cetocb.cable.mindspring.com[24.238.225.139]...
      dsbl: Nov 23 00:29:13 www postfix/smtpd[24559]: 9CBB355FF: client=user-0cetocb.cable.mindspring.com[24.238.225.139]
      cbl: Nov 23 00:29:16 www postfix/smtpd[24629]: lost connection after RCPT from unknown[4.4.247.81]..

    Здесь в качестве тегов использованы имена файлов со списками IP - cbl и dsbl.
  • Поддерживаются вложенные диапазоны IP-адресов (если вложенные результаты имеют разные теги, то выведен будет тег для best match).
  • Теги можно задавать для каждого диапазона IP, либо использовать в качестве тега имя файла в котором задан диапазон.
  • Работает достаточно быстро. На машине P4-3.0Ghz скорость считывания и разбора IP-адресов из файлов со списками составляет около 350000/sec (время, расходуемое программой на инициализацию до начала поиска), скорость поиска во входных файлах - 80000-500000 строк в секунду (зависит от используемых регулярных выражений, длины строк, количества искомых префиксов IP и т.п.). Для больших списков IP (например, дампов RBL) рекомендуется предварительное "склеивание" в супернеты.

Параметры

Для выполнения поиска программе нужно указать:
  • Что искать - диапазон или диапазоны IP-адресов для поиска.
  • Как искать - регулярные выражения для выделения IP-адресов во входном потоке.
  • Где искать - список файлов для поиска.
  • Как выводить - параметры, отвечающие за вывод данных.

Что искать

grepip ищет IP-адреса, которые специфицируются по правилу prefix/bitlen, в качестве префикса надлежит указывать все 4 октета, например:
    192.168.0.0/16
    224.0.0.0/8
    
Вместе с диапазоном адресов может быть указан тег, который будет использован при выводе. В командной строке тег задается вместе с диапазоном IP в одном параметре:
    grepip '192.168.0.0/16 private space' file
Задать дополнительные диапазоны IP для поиска можно через параметры командной строки:
-e PATTERN
Задает дополнительный диапазон IP-адресов для поиска. Диапазоны IP-адресов могут быть вложенными, в этом случае "срабатывает" (что имеет смысл для тегов) тот, который более соответствует найденному IP.
Пример использования:
grepip -e '192.168.0.0/24 private' '127.0.0.0/8 localhost' logfile

 

-f patterns-file
Задает имя файла из которого считываются искомые диапазоны IP-адресов. При использовании параметра <-b>-f считается, что в командной строке адреса (PATTERN) по-умолчанию не задаются, но их можно задать через параметр -e
 

-s
Использовать упрощенные представления для IP-адресов:
  • адрес a.b.c.d интерпретируется как a.b.c.d/32
  • a.b.c=>a.b.c.0/24
  • a.b=>a.b.0.0/16
  • a=>a.0.0.0/8

Как искать

Для выделения IP-адресов из входных файлов используются регулярные выражения в Perl/PCRE-стиле.
По-умолчанию используется regexp \b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b
Для изменения регулярного выражения можно использовать следущие опции командной строки:
-l
Использовать "слабое" регулярное выражение (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}), которое может ошибочно выделить IP 222.222.222.122 из строки вида 1222.222.222.12222222, но если подобных строк во входном файле быть не может, то сработает несколько быстрее.
 

-s
Использовать регулярное выражение (\S+), выделяющее из файла "слова", удобно использовать совместно с ключом -c если искомые IP-адреса отделены от остальной строки пробелами.
 

-c N
Проверять на соответствие искомым диапазонам только N-е вхождение регулярного выражения в строку. Например, сочетание параметров -s -c 2 будет выделять 2-ю колонку из файла, пытаться сконвертировать ее в IP и при успехе - искать в списках искомых IP-адресов.
 

-R regexp
Использовать регулярное выражение regexp. Если в выражении использованы круглые скобки, то считается что IP-адрес будет внутри одной из пар скобок (пример: -R '\[(\d+\.\d+\.\d+\.\d+)\]'). Если скобок в regex нет, то считается что выражение описывает IP-адрес целиком (в этом случае, правда, следует использовать или ключи -l/-s или regexp по-умолчанию).
Неверное задание регулярного выражения может привести к экзотическим результатам!.

Где искать

Список файлов для поиска задается в командной строке после PATTERN, либо после всех опций (если использовался ключ -f). Если список файлов пуст, то поиск производится в stdin.

Что выводить

По-умолчанию, выводится найденная строка. Если в командной строке было задано несколько файлов для поиска, то выводится имя файла: строка. Изменить вывод по-умолчанию можно такими опциями командной строки:
-v
Печатать строчки в которых ничего не найдено
-h
Не выводить имя файла в начале найденной строки
-d
Напечатать список используемых PATTERNS и выйти ничего не ища (отладочный режим)
-p
Вместо имени файла выводить в начале строки тег диапазона IP-адресов
-P
Использовать в качестве тега имя файла с IP-адресами (имеет смысл только с ключом -f)

Примеры использования

Пример 1. Анализ страновой принадлежности запросов в http-loge

Допустим, у нас есть файлик ripe.ranges, полученный из RIPE db с содержанием вроде такого:
9.20.0.0/17 GB
15.0.0.0/8 FR
...
То-есть диапазон IP - код страны.
Команда:
grepip -w -c 1 -p -f ripe.ranges -e '0.0.0.0/0 WORLD' apache/logs/access_log
Выдаст нам что-то в духе:
LT: 81.7.96.143 - - [25/Nov/2003:00:12:49 +0300] "GET /image/letter.....
LT: 81.7.96.143 - - [25/Nov/2003:00:12:49 +0300] "GET /image/big_p.gif....
WORLD: 66.196.90.119 - - [25/Nov/2003:00:12:50 +0300] "GET /inet-admins/msg07956...
RU: 212.58.199.6 - - [25/Nov/2003:00:12:58 +0300] "GET /image/....

Использованы следущие значения параметров:

  • -w -c 1 - использовать regexp, разбивающий по словам и брать 1-ю колонку лога (IP-адрес)
  • -p - печатать теги, а не имена файлов
  • -e '0.0.0.0/0 WORLD' - используется свойство 'best match win' и все адреса, не вошедшие в ripe.alloc будут печататься с тегом WORLD

Пример 2. Анализ почтового лога на попадание в RBL

Допустим, у нас есть несколько файлов с дампами RBL (cписки адресов по одному на строку) и почтовый лог. Используя команду:
grepip -s -p -P -f dsbl -f cbl -f dul.ru /var/log/maillog
Получим примерно такую выдачу:
cbl: Nov 23 00:29:10 www postfix/smtpd[24629]: reject: RCPT from unknown[4.4.247.81]: 550...
dsbl: Nov 23 00:29:10 www postfix/smtpd[24559]: connect from user-0cetocb.cable.mindspring.com[24.238.225.139]...
dsbl: Nov 23 00:29:13 www postfix/smtpd[24559]: 9CBB355FF: client=user-0cetocb.cable.mindspring.com[24.238.225.139]
cbl: Nov 23 00:29:16 www postfix/smtpd[24629]: lost connection after RCPT from unknown[4.4.247.81]..

Использовано сочетание ключей -p -P, которое означает "печатать теги, используя в качестве тегов имена файлов со списками IP-диапазонов".

Сборка и установка

  1. Для сборки нужна установленная в системе библиотека pcre
  2. Для сборки необходимо:
    • распаковать дистрибутив (tar xzvf grepip-x.yy.tar.gz)
    • при необходимости, отредактировать пути до pcre.h и libpcre (по-умолчанию это /usr/local/include и /usr/local/lib)
    • выполнить make
  3. Установка производится командой make install и устанавливает ipgrep в /usr/local/bin

Copyright

Copyright (C) 2003 Alex Tutubalin, lexa@lexa.ru

Распространение, использование, использование в производных программах допускается на условиях, аналогичных Apache License - должен быть сохранен копирайт автора и ссылка на http://www.lexa.ru/lexa. Производный продукт не должен называться grepip.

Техническая поддержка осуществляется в свободное время автора.

Grepip использует библиотеку libpatricia, Copyright (c) 1997, 1998, 1999
The Regents of the University of Michigan ("The Regents") and Merit Network, Inc. All rights reserved.


 



Copyright © Lexa Software, 1996-2009.