Linux下抓包工具tcpdump应用详解

欢迎进入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]

我们大都接受的是正面的教育,

Linux下抓包工具tcpdump应用详解

相关文章:

你感兴趣的文章:

标签云: