https://www.cnblogs.com/codelogs/p/16060684.html

简介#

Linux中有很多抓包工具,如ngrep、tcpdump与tshark等,它们有很多用法与使用场景,下面我将结合例子讲解各工具的用法以及它们的使用场景。

本系列文章索引
Linux命令拾遗-入门篇
Linux命令拾遗-文本处理篇
Linux命令拾遗-软件资源观测
Linux命令拾遗-硬件资源观测
Linux命令拾遗-剖析工具
Linux命令拾遗-动态追踪工具
Linux命令拾遗-理解系统负载
Linux命令拾遗-top中的%nice是啥

ngrep#

ngrep是一款抓包工具,它将抓到的包数据以文本形式直接显示出来,非常适用于包数据包含文本的抓包分析(如HTTP、MySQL),如下:

抓HTTP请求#

有时我们会遇到这种场景,服务方提供http接口给调用方使用,调用方传递一个参数值,服务方收到的结果不一样!
这种情况,有可能是调用方的请求方式有问题,也有可能是服务方有请求拦截器导致问题,如何辨别问题是在哪一方呢?这时用ngrep抓包工具确认一下包内容再合适不过了,如下:

# -d any表示抓取所有网卡的数据包
# -W byline 一般用于HTTP抓包,方便查看
$ ngrep -d any -W byline port 8080


如上,ngrep会将非可见字符显示为.,所以上面http请求每行后都有个.,指的是HTTP协议换行符\r\n中的\r,而最前面的T代表这是TCP协议的包。

抓取SQL#

# 抓取3961端口,过滤出包数据中带select的网络包,即查询SQL
# -A 2 匹配包之后的2个包也显示出来
$ ngrep -d any -A 2 'select' port 3961


可以发现,mysql回包都有.def.这样的字样,我们可以根据这个来判断mysql响应包。

ngrep带上-T参数,可以额外打印出前后两个包的间隔时间,这样我们根据回包的间隔时间,就能大概看到SQL查询的耗时了,如下:

# -W single让包数据在一行上显示,便于awk等文本工具处理
# -s 200 包大小最多抓200字节,多余数据不显示
# -T 打印出两个包之间的间隔时间,单位秒
# awk部分脚本逻辑是,一直抓包直到发现回包慢于1秒时停止
$ ngrep -d any -W single -s 200 -T 'select|def' port 3961 \
| awk '{print} $1~/T/ && /.def./ && $2>1 && $2<1000 {exit(0)}'

tcpdump#

tcpdump是一个通用抓包工具,一般用它来抓各种协议的网络包数据,然后再使用wireshark分析,如下:

抓取3961端口网络包#

# -c 10000表示最多抓1万个包
$ tcpdump -i any -s 0 -c 10000 tcp and port 3961 -w ./target.cap # -G 600 表示600s保存一个抓包文件,避免单文件太大
$ tcpdump -i any -s 0 -G 600 tcp and port 3961 -w ./target_%Y_%m%d_%H%M_%S.pcap

wireshark分析#

抓取的target.cap是mysql的网络包数据,它是二进制的,无法直接查看,需要使用wireshark分析,下载地址如下:
https://www.wireshark.org/download.html

默认情况下,wireshark认为3306端口的数据包是MySQL协议的,而上面我们mysql端口是3961,导致wireshark无法将包数据识别为MySQL协议,显示的是TCP原始数据,不方便查看,所以我们需要告诉wireshark使用MySQL协议解析3961端口数据包,如下:

a. 先decode as...相应端口使用MySQL协议解析:

...

b. 输入mysql.query contains "id=24218",查看SQL中包含id=24218的数据包,如下:

网络慢还是后端处理慢?#


为方便分析耗时,一般建议在wireshark上再添加如下两列:

  • tcpDelta = tcp.time_delta,表示在当前tcp连接中,当前包相对上一个包的时间差。
  • ack_rtt = tcp.analysis.ack_rtt,表示tcp中的ack包,相对其数据包的时间差。

如下,找耗时最大的包:

...

...

...

发现对于select sleep(2.0)这条SQL,服务端回复ack很快,而在回复数据包时变慢,说明是慢在MySQL处理上,而非网络里,因为如果网络慢的话,ack应该也会变慢的。

tshark#

tshark是wireshark工具的命令行版本,使用的方法与wireshark是类似的,如下:

# -i any 任意网卡的数据都抓取
# -f 指定抓什么协议,什么端口
# -d 类似wireshark的decode as,将3961解析为mysql协议
# -Y 类似wireshark上面的显示过滤器
# -T 指定数据输出格式,fields表示tab分隔格式
# -e 指定输出的字段
# -E header=y 指定输出标题行
$ sudo tshark -ni any -f 'tcp and port 3961' -d 'tcp.port==3961,mysql' \
-T fields -e frame.number -e frame.time_epoch -e frame.time_delta_displayed \
-e ip.src -e tcp.srcport -e tcp.dstport -e ip.dst -e tcp.stream -e tcp.len -e tcp.nxtseq \
-e tcp.time_delta -e tcp.analysis.ack_rtt \
-e _ws.col.Info -e mysql.query -E header=y > packets.tsv # 查看抓包数据
$ csvlook -It packets.tsv | less -iSFX
| frame.number | frame.time_epoch | frame.time_delta_displayed | ip.src | tcp.srcport | tcp.dstport | ip.dst | tcp.stream | tcp.len | tcp.nxtseq | tcp.time_delta | tcp.analysis.ack_rtt | _ws.col.Info | mysql.query |
| ------------ | -------------------- | -------------------------- | --------- | ----------- | ----------- | --------- | ---------- | ------- | ---------- | -------------- | -------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| 1 | 1639287428.374886956 | 0.000000000 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 5 | 6 | 0.000000000 | | Request Ping | |
| 2 | 1639287428.375043740 | 0.000156784 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 0 | 1 | 0.000156784 | 0.000156784 | 3961 → 39262 [ACK] Seq=1 Ack=6 Win=512 Len=0 TSval=696789627 TSecr=696789627 | |
| 3 | 1639287428.375268878 | 0.000225138 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 11 | 12 | 0.000225138 | | Response OK | |
| 4 | 1639287428.375289961 | 0.000021083 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 0 | 6 | 0.000021083 | 0.000021083 | 39262 → 3961 [ACK] Seq=6 Ack=12 Win=512 Len=0 TSval=696789627 TSecr=696789627 | |
| 5 | 1639287428.375886139 | 0.000596178 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 55 | 61 | 0.000596178 | | Request Query | select id from app_log al order by id desc limit 1 |
| 6 | 1639287428.375906403 | 0.000020264 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 0 | 12 | 0.000020264 | 0.000020264 | 3961 → 39262 [ACK] Seq=12 Ack=61 Win=512 Len=0 TSval=696789628 TSecr=696789628 | |
| 7 | 1639287428.377206294 | 0.001299891 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 76 | 88 | 0.001299891 | | Response | |
| 8 | 1639287428.377226652 | 0.000020358 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 0 | 61 | 0.000020358 | 0.000020358 | 39262 → 3961 [ACK] Seq=61 Ack=88 Win=512 Len=0 TSval=696789629 TSecr=696789629 | |
| 9 | 1639287428.378921659 | 0.001695007 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 84 | 145 | 0.001695007 | | Request Query | select id,log_info,create_time,update_time,add_time from app_log where id=27371 |
| 10 | 1639287428.378942384 | 0.000020725 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 0 | 88 | 0.000020725 | 0.000020725 | 3961 → 39262 [ACK] Seq=88 Ack=145 Win=512 Len=0 TSval=696789631 TSecr=696789631 | |
| 11 | 1639287428.380450661 | 0.001508277 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 412 | 500 | 0.001508277 | | Response | |
| 12 | 1639287428.380471636 | 0.000020975 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 0 | 145 | 0.000020975 | 0.000020975 | 39262 → 3961 [ACK] Seq=145 Ack=500 Win=509 Len=0 TSval=696789633 TSecr=696789633 | |
| 13 | 1639287430.051942681 | 1.671471045 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 22 | 167 | 1.671471045 | | Request Query | select sleep(2.0) |
| 14 | 1639287430.051972761 | 0.000030080 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 0 | 500 | 0.000030080 | 0.000030080 | 3961 → 39262 [ACK] Seq=500 Ack=167 Win=512 Len=0 TSval=696791304 TSecr=696791304 | |
| 15 | 1639287432.053394353 | 2.001421592 | 127.0.0.1 | 3961 | 39262 | 127.0.0.1 | 0 | 65 | 565 | 2.001421592 | | Response | |
| 16 | 1639287432.053520674 | 0.000126321 | 127.0.0.1 | 39262 | 3961 | 127.0.0.1 | 0 | 0 | 167 | 0.000126321 | 0.000126321 | 39262 → 3961 [ACK] Seq=167 Ack=565 Win=512 Len=0 TSval=696793306 TSecr=696793305 |

并且,tshark也可以直接分析tcpdump抓到的包数据,如下:

# -Y 类似于wireshark中的显示过滤器
$ tshark -d 'tcp.port==3961,mysql' -Y 'mysql.query contains "id=21"' -r target.cap -T fields -e frame.number -e mysql.query
5 select id,log_info,create_time,update_time,add_time from app_log where id=21527
13 select id,log_info,create_time,update_time,add_time from app_log where id=21518
25 select id,log_info,create_time,update_time,add_time from app_log where id=21007
52 select id,log_info,create_time,update_time,add_time from app_log where id=21505 # tshark包还附带一个editcap命令
# 可用于截取抓包数据的一段时间范围
$ editcap -F libpcap -A "2013-07-20 23:00:00" -B "2013-07-20 23:20:00" input.pcap output.pcap

pcap-filter与wireshark-filter#

ngreptcpdumptshark -f使用的都是pcap-filter语法,用于抓取网络包时,对抓到的网络包进行过滤,如下是tcpdump使用pcap-filter的一些常见语法。

# 抓取指定主机的数据包
$ tcpdump -ni any host 210.27.48.1
# 抓取来自210.27.48.1主机和23端口的tcp包
$ tcpdump -ni any tcp src host 210.27.48.1 and port 23
# 抓取来自网络10.234.10.0/24的主机发来的目的端口是80或8080的tcp包
$ tcpdump -ni any tcp src net 10.234.10.0/24 and dst port '(80 or 8080)'
# 抓tcp协议的rst包
$ tcpdump -ni any -s0 tcp and 'tcp[13] & 4 != 0 ' -vvv
# 抓tcp协议的fin包
$ tcpdump -ni any -s0 tcp and 'tcp[13] & 1 != 0 ' -vvv

详细语法可以man pcap-filter查看,或访问:https://wiki.wireshark.org/CaptureFilters

而wireshark界面上的显示过滤器,以及tshark -Y使用的都是wireshark-filter语法,用于对已抓取的数据包进行进一步过滤分析,如下是tshark使用wireshark-filter的一些常见语法。

# 过滤指定主机与指定端口数据包
$ tshark -Y 'ip.addr==127.0.0.1 and tcp.port==3961'
# 解析为http协议,并使用http协议字段过滤
$ tshark -d 'tcp.port==8080,http' -Y 'http.request.uri contains "/get"'
# 解析为mysql协议,并使用mysql协议字段过滤
$ tshark -d 'tcp.port==3961,mysql' -Y 'mysql.query contains "id=21"'

详细语法可以man wireshark-filter查看,或访问:https://wiki.wireshark.org/DisplayFilters

总结#

可见,使用ngrep、tcpdump、tshark分析网络问题是非常有帮助的,一定要在工作中多多尝试使用,熟悉它们的各种用法。

之前也写过一些文章,总结了Linux中常用的网络工具命令,如:ping、telnet、nslookup、curl等,感兴趣也可以看下:
常用网络命令总结
还在胡乱设置连接空闲时间?
我都调通了,为啥你不行?

往期内容#

Linux命令拾遗-入门篇
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑

[转帖] Linux命令拾遗-网络抓包工具的更多相关文章

  1. 跨平台网络抓包工具-Microsoft Message Analyzer

    Microsoft Message Analyzer (MMA 2013)是微软最受欢迎的Netmon的最新版本. 在Netmon网络跟踪和排除故障功能的基础上提供了更强大的跨平台网络分析追踪能力.园 ...

  2. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  3. 网络抓包工具-Wireshark学习资料

    wireshark一个非常牛逼的网络抓包工具.转载一系列博文 一站式学习Wireshark(一):Wireshark基本用法 一站式学习Wireshark(二):应用Wireshark观察基本网络协议 ...

  4. HttpWatch网络抓包工具的使用

    HttpWatch网络抓包工具是专为IE浏览器集成的一款网络拽包工具.   是一款强大的网页数据分析软件,是最好用的抓包工具,httpwatch可以抓到上传视屏图片的包,一般的抓包软件是抓不到的.打开 ...

  5. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布 来自官方日志的喜悦 被誉为全新开始的消息分析器 ...

  6. 网络抓包工具 Fiddler

    网络抓包工具 Fiddler 下载网址 http://www.telerik.com/fiddler 简单介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查全部你的电脑和互联网之间的 ...

  7. [工具]Mac平台开发几个网络抓包工具(sniffer)

    Cocoa Packet Analyzer http://www.tastycocoabytes.com/cpa/ Cocoa Packet Analyzer is a native Mac OS X ...

  8. Charles for Mac(HTTP 监视器和网络抓包工具)破解版安装

    1.软件简介    Charles 是在 Mac.Linux 或 Windows 下常用的 http 协议网络包截取工具,在平常的测试与调式过程中,掌握此工具就基本可以不用其他抓包工具了.Charle ...

  9. Charles 网络抓包工具

    1.Charles 简介 Charles 是在 Mac.Linux 或 Windows 下常用的 http 协议网络包截取工具,在平常的测试与调式过程中,掌握此工具就基本可以不用其他抓包工具了.Cha ...

  10. 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap

    最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...

随机推荐

  1. 详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE

    本文分享自华为云社区<GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE>,作者:Gauss松鼠会小助手2 . 一.前言 在数据库中,SQL作 ...

  2. 华为云数据库GaussDB(for openGauss):初次见面,认识一下

    摘要:本文从总体架构.主打场景.关键技术特性等方面进行介绍GaussDB(for openGauss). 1.背景介绍 3月16日,在华为云主办的GaussDB(for openGauss)系列技术第 ...

  3. 认识Java的整形数据结构

    摘要:java中一切都是对象,为什么int不用创建对象实例化,而可以直接使用? 本文分享自华为云社区<[Java]对基本类型-整型数据结构的认识>,作者: huahua.Dr . 整型数据 ...

  4. 万字详解什么是生成对抗网络GAN

    摘要:这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN.常用算法(CGAN.DCGAN.infoGAN.WGAN).发展历程.预备知识,并通过Keras搭建最简答的手写数字图片生成案. ...

  5. 火山引擎VeDI最新分享:消费行业的数据飞轮从“四更”开始

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 数据飞轮,正在为消费行业的数字化升级提供一套全新模式.   在刚刚结束的<全链路增长:数据飞轮转动消费新生力 ...

  6. ElasticSearch 实现分词全文检索 - filter查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  7. schedule 定时运行 Python 函数

    安装 pip install schedule 例子 每x分钟运行一次 import schedule import time def job(): print("I'm working.. ...

  8. 【MFC】CSingleLock的使用

    转载文章:CSingleLock的使用 // 先看看其代码: // 声明 class CSingleLock { // Constructors public: CSingleLock(CSyncOb ...

  9. SpringCloud学习 系列九、Ribbon

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  10. iview+vue 加载进度条

    效果:浏览器最上方出现一个进度条. main.js import Vue from 'vue' import ViewUI from 'view-design'; import router from ...