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: