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-диапазонов".
Сборка и установка
- Для сборки нужна установленная в системе библиотека
pcre
- Для сборки необходимо:
- распаковать дистрибутив (tar xzvf grepip-x.yy.tar.gz)
- при необходимости, отредактировать пути до pcre.h и libpcre
(по-умолчанию это /usr/local/include и /usr/local/lib)
- выполнить make
- Установка производится командой 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.
|