欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入
最后一个primitive形式为 expr relop expr
若把这个形式记为A,那么你可这样写tcpdump ‘A1 && A2 && ip src 192.168.200.1’,等等。
下面我们就来分析A这个形式,看看这是如何强大,如果你觉得很乱的话,建议你先用用上面的知识来实际操作几次,要不然就会很乱的,因为expression太复杂了。
形式:expr relop expr
relop表示关系操作符,可以为>, < ,>=,<=, =, !=之一,
expr是一个算术表达式,由整数组成和二元运算符(+,-,*,/,&,|, <<, >>),长度操作,报文数据访问子。同时所有的整数都是无符号的,即0x80000000 和 0xffffffff > 0。为了访问报文中的数据,可使用如下方式:
proto [ expr : size ]
proto表示该问的报文,expr的结果表示该报文的偏移,size为可选的,表示从expr偏移量起的szie个字节,整个表达式为proto报文 中,expr起的szie字节的内容(无符号整数)
下面是expr relop expr这种形式primitive的例子:
’ether[0] & 1 !=0′ ether报文中第0个bit为1,即以太网广播或组播的primtive。
通过这种方式,我们可以对报文的任何一个字节进行匹配了,因此它的功能是十分强大的。
‘ip[0] = 4’ ip报文中的第一个字节为version,即匹配IPv4的报文,
如果我们想匹配一个syn报文,可以使用:’tcp[13] = 2’,因为tcp的标志位为TCP报文的第13个字节,而syn在这个字节的低1位,故匹配只有syn标志的报文,上述条件是可满要求的,并且比较严格。
如果想匹配ping命令的请求报文,可以使用’icmp[0]=8’,因为icmp报文的第0字符表示类型,当类型值为8时表示为回显示请求。
对于TCP和ICMP中常用的字节,如TCP中的标志位,ICMP中的类型,这个些偏移量有时会忘记。不过tcpdump为你提供更方便的用法,你不用记位这些数字,用字符就可以代替了.
对于ICMP报文,类型字节可以icmptype来表示它的偏称量,上面的primitive可改为’icmp[icmptype] =8’,如果8也记不住怎么办?tcpdump还为该字节的值也提供了字符表示,如’icmp[icmptype] = icmp-echo’。
下面是tcpdump提供的字符偏移量:
icmptype:表示icmp报文中类弄字节的偏移量
icmpcode:表示icmp报文中编码字节的偏移量
tcpflags:表示TCP报文中标志位字节的偏移量
此外,还提供了很多值来对应上面的偏移字节:
ICMP中类型字节的值可以是:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redi?rect, icmp-echo, icmp-routeradvert, icmp-routersolicit,
icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstam?preply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.
TCP中标志位字节的值可以是:
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg.
通过上面的字符表示,我们可以写出下面的primitive
’tcp[tcpflags] = tcp-syn’ 匹配只有syn标志设置为1的 tcp报文
’tcp[tcpflags] & (tcp-syn |tcp-ack |tcp-fin) !=0′ 匹配含有syn,或ack或fin标志位的TCP报文
对于IP报文,没有提供字符支持,如果想匹配更细的条件,直接使用数字指字偏移量就可以了,不过要对IP报文有更深入的了解才可以。
学会写primitive后,expression就是小菜一碟了,由一个或多个primitive组成,并且逻辑连接符组成即可:
tcpdump ‘host 192.168.240.91 && icmp[icmptype] = icmp-echo’
tcpdump ‘host 192.168.1.100 && vrrp’
tcpdump ‘ether src 00:00:00:00:00:02 && ether[0] & 1 !=0’
让你随心所欲地使用tcpdump,将不用再从复杂的输出中去挑报文了!
如此,我们可以写出更复杂的表达式来匹配报文,如IP或TCP中的报文id,IP是中的分段标志,ICMP中类型和代码等。
[1][2][3][4][5]
我们大都接受的是正面的教育,