[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Кто владеет flow-tools?



On Tue, Dec 11, 2007 at 03:02:56PM +0300, Peter Teslenko wrote:
> Привет, коллеги.
> 
> Кто владеет тайным знанием, для написания фильтров для flow-tools?
> 
> Есть у меня пачка flows'ов хочу сделать из них выборку.
> 
> Как? Уже весь мозг вывихнул.
> 

мне тоже не понравилось, как устроены фильтры в flow-tools, поэтому писал сам.

ftp://swp.pp.ru/incoming/flowstat.tar.gz

хочется чтобы программа на входе сама использовала базы flow-tools, а не парсила 
вывод от flow-print, но не соберусь разобраться как это делается. нет времени и
главное вдохновения. :(

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

flow-cat /var/db/flows/asu/2007/2007-12 | flow-print |\
    ./flowstat -f 'dst-ip { 82.179.19.64/26, 82.179.18.10 } ! src-ip { 82.179.16.0/20 }' \
        'proto' 'src-ip' 'dst-ip' src-ip:src-port' 'dst-ip:dst-port' \
	    'src-ip:dst-port' 'dst-ip:src-port'

параметр -f задает фильтр. все остальное - формы отчётов. все накапливается в
памяти, поэтому при отчете по всем полям 'proto:src-ip:src-port:dst-ip:dst-port' памяти
может потребоваться очень много.

строятся отчёты путем агрегирования всех не указанных полей, указываются 
только значимые поля. в отчётах агрегированные поля будут заменены звёздочками.

используется bison2. грамматика фильтров:

 1 start: sp cond sp

 2 cond: expr
 3     | cond spaces expr
 4     | cond sp '|' '|' sp expr

 5 expr: 'p' 'r' 'o' 't' 'o' spaces protos
 6     | 'i' 'p' spaces ipnets
 7     | 's' 'r' 'c' '-' 'i' 'p' spaces ipnets
 8     | 'd' 's' 't' '-' 'i' 'p' spaces ipnets
 9     | 'p' 'o' 'r' 't' spaces ports
10     | 's' 'r' 'c' '-' 'p' 'o' 'r' 't' spaces ports
11     | 'd' 's' 't' '-' 'p' 'o' 'r' 't' spaces ports
12     | '!' sp expr
13     | '(' sp cond sp ')'

14 protos: proto
15       | '{' sp listprotos sp '}'

16 listprotos: proto
17           | listprotos sp ',' sp proto

18 proto: 'i' 'p'
19      | 'i' 'c' 'm' 'p'
20      | 't' 'c' 'p'
21      | 'u' 'd' 'p'
22      | 'i' 'p' 'e' 'n' 'c' 'a' 'p'
23      | 'g' 'r' 'e'
24      | '*'
25      | number
26      | '!' proto

27 ipnets: ipnet
28       | '{' sp listipnets sp '}'

29 listipnets: ipnet
30           | listipnets sp ',' sp ipnet

31 ipnet: ipaddr
32      | ipaddr '/' netbits
33      | ipaddr '/' netmask
34      | '*'
35      | '!' ipnet

36 ports: port
37      | '{' sp listports sp '}'

38 listports: port
39          | listports sp ',' sp port

40 port: number
41     | '*'
42     | '!' port

43 netbits: number

44 netmask: byte '.' byte '.' byte '.' byte

45 ipaddr: byte '.' byte '.' byte '.' byte

46 byte: number

47 number: DIGIT
48       | number DIGIT

49 sp: /* empty */
50   | spaces

51 spaces: SP
52       | spaces SP

> Критерий:
> srcaddr не 192.168.1.0/24
> dstaddr 192.168.1.2, 192.168.1.5, 192.168.1.21
> 
> на выходе хочу увидеть суммарный объём по 3 хостам и раскладку по srcport 
> 80, 110, 143
> 
фильтр:
    !src-ip 192.168.1.0/24 dst-ip {192.168.1.2,192.168.1.5,192.168.1.21} dst-port {80,110,143}

отчёты:
    dst-ip
	входящий по всем трем хостам

    dst-ip:dst-port
	входящий на все три хоста по портам

    src-ip
	входящий на них внешним адресам

    src-ip:dst-ip:dst-port
	входящий по внешним хостам на порты

PS
если написать Makefile для gnu make лень, на freebsd оно так собирается:
bison2 -p ippf_yy -o ippf.c ippf.y
cc -O -pipe -march=pentium3 -Iinclude -o flowstat ippf.c flow.c 

найдете ошибки - пишите.

/swp



Reply to: