最新文章:

首页 运维技术

tcpdump与Wireshark使用方法

发布时间:2016年05月28日 评论数:抢沙发 阅读数:4942

    来源:伯乐在线专栏作者 - 陶仁邦

    链接:http://blog.jobbole.com/101476/

    点击 → 了解如何加入专栏作者


    1 起因


    前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况。这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了。在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。


    为了更好、更顺手地能够用好这两个工具,特整理本篇文章,希望也能给大家带来收获。为大家之后排查问题,添一利器。


    2 tcpdump与Wireshark介绍


    在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具一样,它的特点就是简单而强大。它是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。


    默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。【比如本机的TCP通信,也必须要socket通信的基本要素:src ip port dst ip port】


    如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。


    Linux抓包原理:


    Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

    当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。


    Wireshark是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,一般只在图形界面平台下使用Wireshark,如果是Linux的话,直接使用tcpdump了,因为一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。


    在Mac平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。


    所以,tcpdump是用来抓取数据非常方便,Wireshark则是用于分析抓取到的数据比较方便。


    3 tcpdump使用


    3.1 语法


    类型的关键字


    host(缺省类型): 指明一台主机,如:host 210.27.48.2

    net: 指明一个网络地址,如:net 202.0.0.0

    port: 指明端口号,如:port 23


    确定方向的关键字


    src: src 210.27.48.2, IP包源地址是210.27.48.2

    dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0

    dst or src(缺省值)

    dst and src


    协议的关键字:缺省值是监听所有协议的信息包


    fddi

    ip

    arp

    rarp

    tcp

    udp


    其他关键字


    gateway

    broadcast

    less

    greater


    常用表达式:多条件时可以用括号,但是要用转义


    非 : ! or “not” (去掉双引号)

    且 : && or “and”

    或 : || or “or”

    3.2 选项





    3.3 命令实践


    1、直接启动tcpdump,将抓取所有经过第一个网络接口上的数据包







    2、抓取所有经过指定网络接口上的数据包





    3、抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据:





    4、抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信:





    5、抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包:





    6、抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包





    7、抓取主机10.37.63.3发送的所有数据:



    8、抓取主机10.37.63.3接收的所有数据:



    9、抓取主机10.37.63.3所有在TCP 80端口的数据包:



    10、抓取HTTP主机10.37.63.3在80端口接收到的数据包:



    11、抓取所有经过 en0,目的或源端口是 25 的网络数据



    12、抓取所有经过 en0,网络是 192.168上的数据包



    13、协议过滤



    14、抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据



    15、抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据



    16、抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据



    17、只抓 SYN 包



    18、抓 SYN, ACK



    19、抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c




    20、抓 HTTP GET 数据,”GET “的十六进制是 0x47455420



    21、抓 SSH 返回,”SSH-“的十六进制是 0x5353482D



    22、高级包头过滤如前两个的包头过滤,首先了解如何从包头过滤信息:




    23、抓 DNS 请求数据



    24、其他-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是抓的太多,于是可以用-c 参数指定抓多少个包。



    3.4 抓个网站练练


    想抓取访问某个网站时的网络数据。比如网站 http://www.baidu.com/ 怎么做?


    1、通过tcpdump截获主机www.baidu.com发送与接收所有的数据包

二维码加载中...
本文作者:Mr.linus      文章标题: tcpdump与Wireshark使用方法
本文地址:http://www.90qj.com/355.html  本文已经被百度收录,点击查看详情
版权声明:若无注明,本文皆为“挨踢 Blog”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论