tcpdump重要笔记

无关痛痒的参数就不写了。只说一些我认为值得注意的。

1 tcpdump参数

    -s 最早在公司旧机器上截包时发现总是不完整,于是知道了这个参数,之后就一直用-s0了。最近一次在家里,忘记输入-s发现包竟然还是完整的,赶紧用man查询了下,人家说的很明白缺省值是“65535 bytes”,这下把我搞蒙了。最终才发现,原来至少在4.1之后的tcpdump使用的缺省值都是65535了,公司的tcpdump是3.9缺省值是96字节。所以现在网上资料里普遍提到的"默认tcpdump抓包大小限制在96个byte"是很古老的说法了,至少在2012年的版本里,其缺省值已经变成65535。

    -l 只有在使用管道或者输出重定向会用到它,在这种情况下必须加上这个参数,它能保每行内容都会被及时输出给后端。

    -w 保存成文件,虽然直接使用输出重定向">"也可以输出到文件,但是要注意,-w才能正确的保存成二进制格式,也就是wireshark可以查看的格式,而输出重定向只是保存了16进制的文本。

    -X 要看每个包的16进制内容就必须使用这个参数,多数时候我都需要这个参数。

    -i 指定网络接口,也就是ifconfig看到的最左面的名字“eth0, eth1, lo”,注意这个参数如果不加不代表抓取所有的接口,而是使用列表里最小的那个,最小的往往都不是我们希望使用的那个,所以这个参数几乎也是必须的。

2 tcpdump表达式

    这种表达式过滤数据非常方便,可以通过头部内容过滤,基本上是使用这样的格式 proto[index:length] (proto是协议名不限于ip/tcp,index是以0为开头的字节数,length是从开头往后跨越的字节数),通过简单的算术运算和布尔运算,几乎可以对任何条件进行筛选了。虽然可以用tcp[tcpflags] & tcp-push这样的命名式写法,但个人觉得还是数字然后配合ip/tcp结构图更方便,因为我如何在不查资料的情况下知道应该写成“tcp[tcpflags] & tcp-push”还是"tcp[tcpflags] & push"呢?多了个命名就多了一个查询的步骤。附带几个例子:

//只显示目的端口是20835的push包
tcpdump 'tcp[13] & 8 != 0 && dst prot 20835' -i eth1 -nn -X

//0x4745 为字母"GE"(GET),0x4854 为字母"HT"(HTTP),这种方式只显示HTTP相关的包(某博客学来)
tcpdump "tcp[20:2]=0x4745 or tcp[20:2]=0x4854" -i eth1 -nn -X

//只显示有数据的包,SYN,FIN和纯粹的ACK会被过滤掉(man学来的)
tcpdump "tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" -i eth1 -nn -X

3 定位应用层数据

    这块内容在之前的文章"给tcpdump加点颜色"已经提及,要找到应用层数据的开头,注意下面3点

    1 IP头和TCP头都是可变长度,实际使用中来说,我很少遇到IP头的选项部分,但TCP可选项经常使用。

    2 IP头的长度位于第一个字节的高地址部分,TCP头的长度位于第13个字节的低地址部分

    3 表示长度的单位都是4字节。



附图:wikipedia IPv4 TCP



  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值