在 Linux 命令行中使用 tcpdump 抓包的一些功能
tcpdump是一款灵活、功能强大的抓包工具,能有效地帮助排查网络故障问题。
以我作为管理员的经验,在网络连接中经常遇到十分难以排查的故障问题。对于这类情况,tcpdump便能派上用场。
tcpdump是一个命令行实用工具,允许你抓取和分析经过系统的流量数据包。它通常被用作于网络故障分析工具以及安全工具。
tcpdump是一款强大的工具,支持多种选项和过滤规则,适用场景十分广泛。由于它是命令行工具,因此适用于在远程服务器或者没有图形界面的设备中收集数据包以便于事后分析。它可以在后台启动,也可以用cron等定时工具创建定时任务启用它。
本文中,我们将讨论tcpdump最常用的一些功能。
1、在Linux中安装tcpdump
tcpdump支持多种Linux发行版,所以你的系统中很有可能已经安装了它。用下面的命令检查一下是否已经安装了tcpdump:
$whichtcpdump /usr/sbin/tcpdump
如果还没有安装tcpdump,你可以用软件包管理器安装它。例如,在CentOS或者RedHatEnterprise系统中,用如下命令安装tcpdump:
$sudoyuminstall-ytcpdump
tcpdump依赖于libpcap,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。
现在你可以开始抓包了。
2、用tcpdump抓包
使用tcpdump抓包,需要管理员权限,因此下面的示例中绝大多数命令都是以sudo开头。
首先,先用tcpdump-D命令列出可以抓包的网络接口:
$sudotcpdump-D eth0 virbr0 eth1 any(Pseudo-devicethatcapturesonallinterfaces) lo[Loopback]
如上所示,可以看到我的机器中所有可以抓包的网络接口。其中特殊接口any可用于抓取所有活动的网络接口的数据包。
我们就用如下命令先对any接口进行抓包:
$sudotcpdump-iany tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 09:56:18.293641IPrhel75.localdomain.ssh>192.168.64.1.56322:Flags[P.],seq3770820720:3770820916,ack3503648727,win309,options[nop,nop,TSval76577898ecr510770929],length196 09:56:18.293794IP192.168.64.1.56322>rhel75.localdomain.ssh:Flags[.],ack196,win391,options[nop,nop,TSval510771017ecr76577898],length0 09:56:18.295058IPrhel75.59883>gateway.domain:2486+PTR?1.64.168.192.in-addr.arpa.(43) 09:56:18.310225IPgateway.domain>rhel75.59883:2486NXDomain*0/1/0(102) 09:56:18.312482IPrhel75.49685>gateway.domain:34242+PTR?28.64.168.192.in-addr.arpa.(44) 09:56:18.322425IPgateway.domain>rhel75.49685:34242NXDomain*0/1/0(103) 09:56:18.323164IPrhel75.56631>gateway.domain:29904+PTR?1.122.168.192.in-addr.arpa.(44) 09:56:18.323342IPrhel75.localdomain.ssh>192.168.64.1.56322:Flags[P.],seq196:584,ack1,win309,options[nop,nop,TSval76577928ecr510771017],length388 09:56:18.323563IP192.168.64.1.56322>rhel75.localdomain.ssh:Flags[.],ack584,win411,options[nop,nop,TSval510771047ecr76577928],length0 09:56:18.335569IPgateway.domain>rhel75.56631:29904NXDomain*0/1/0(103) 09:56:18.336429IPrhel75.44007>gateway.domain:61677+PTR?98.122.168.192.in-addr.arpa.(45) 09:56:18.336655IPgateway.domain>rhel75.44007:61677*1/0/0PTRrhel75.(65) 09:56:18.337177IPrhel75.localdomain.ssh>192.168.64.1.56322:Flags[P.],seq584:1644,ack1,win309,options[nop,nop,TSval76577942ecr510771047],length1060 ----SKIPPINGLONGOUTPUT----- 09:56:19.342939IP192.168.64.1.56322>rhel75.localdomain.ssh:Flags[.],ack1752016,win1444,options[nop,nop,TSval510772067ecr76578948],length0 ^C 9003packetscaptured 9010packetsreceivedbyfilter 7packetsdroppedbykernel $
tcpdump会持续抓包直到收到中断信号。你可以按Ctrl+C来停止抓包。正如上面示例所示,tcpdump抓取了超过9000个数据包。在这个示例中,由于我是通过ssh连接到服务器,所以tcpdump也捕获了所有这类数据包。-c选项可以用于限制tcpdump抓包的数量:
$sudotcpdump-iany-c5 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 11:21:30.242740IPrhel75.localdomain.ssh>192.168.64.1.56322:Flags[P.],seq3772575680:3772575876,ack3503651743,win309,options[nop,nop,TSval81689848ecr515883153],length196 11:21:30.242906IP192.168.64.1.56322>rhel75.localdomain.ssh:Flags[.],ack196,win1443,options[nop,nop,TSval515883235ecr81689848],length0 11:21:30.244442IPrhel75.43634>gateway.domain:57680+PTR?1.64.168.192.in-addr.arpa.(43) 11:21:30.244829IPgateway.domain>rhel75.43634:57680NXDomain0/0/0(43) 11:21:30.247048IPrhel75.33696>gateway.domain:37429+PTR?28.64.168.192.in-addr.arpa.(44) 5packetscaptured 12packetsreceivedbyfilter 0packetsdroppedbykernel $
如上所示,tcpdump在抓取5个数据包后自动停止了抓包。这在有些场景中十分有用——比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包(如下所示)时,-c的作用就十分突出了。
在上面示例中,tcpdump默认是将IP地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中,使用IP地址和端口号更便于分析问题;用-n选项显示IP地址,-nn选项显示端口号:
$sudotcpdump-iany-c5-nn tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 23:56:24.292206IP192.168.64.28.22>192.168.64.1.35110:Flags[P.],seq166198580:166198776,ack2414541257,win309,options[nop,nop,TSval615664ecr540031155],length196 23:56:24.292357IP192.168.64.1.35110>192.168.64.28.22:Flags[.],ack196,win1377,options[nop,nop,TSval540031229ecr615664],length0 23:56:24.292570IP192.168.64.28.22>192.168.64.1.35110:Flags[P.],seq196:568,ack1,win309,options[nop,nop,TSval615664ecr540031229],length372 23:56:24.292655IP192.168.64.1.35110>192.168.64.28.22:Flags[.],ack568,win1400,options[nop,nop,TSval540031229ecr615664],length0 23:56:24.292752IP192.168.64.28.22>192.168.64.1.35110:Flags[P.],seq568:908,ack1,win309,options[nop,nop,TSval615664ecr540031229],length340 5packetscaptured 6packetsreceivedbyfilter 0packetsdroppedbykernel
如上所示,抓取的数据包中显示IP地址和端口号。这样还可以阻止tcpdump发出DNS查找,有助于在网络故障排查中减少数据流量。
现在你已经会抓包了,让我们来分析一下这些抓包输出的含义吧。
3、理解抓取的报文
tcpdump能够抓取并解码多种协议类型的数据报文,如TCP、UDP、ICMP等等。虽然这里我们不可能介绍所有的数据报文类型,但可以分析下TCP类型的数据报文,来帮助你入门。更多有关tcpdump的详细介绍可以参考其帮助手册。tcpdump抓取的TCP报文看起来如下:
08:41:13.729687IP192.168.64.28.22>192.168.64.1.41916:Flags[P.],seq196:568,ack1,win309,options[nop,nop,TSval117964079ecr816509256],length372
具体的字段根据不同的报文类型会有不同,但上面这个例子是一般的格式形式。
第一个字段08:41:13.729687是该数据报文被抓取的系统本地时间戳。
然后,IP是网络层协议类型,这里是IPv4,如果是IPv6协议,该字段值是IP6。
192.168.64.28.22是源ip地址和端口号,紧跟其后的是目的ip地址和其端口号,这里是192.168.64.1.41916。
在源IP和目的IP之后,可以看到是TCP报文标记段Flags[P.]。该字段通常取值如下:
该字段也可以是这些值的组合,例如[S.]代表SYN-ACK数据包。
接下来是该数据包中数据的序列号。对于抓取的第一个数据包,该字段值是一个绝对数字,后续包使用相对数值,以便更容易查询跟踪。例如此处seq196:568代表该数据包包含该数据流的第196到568字节。
接下来是ack值:ack1。该数据包是数据发送方,ack值为1。在数据接收方,该字段代表数据流上的下一个预期字节数据,例如,该数据流中下一个数据包的ack值应该是568。
接下来字段是接收窗口大小win309,它表示接收缓冲区中可用的字节数,后跟TCP选项如MSS(最大段大小)或者窗口比例值。更详尽的TCP协议内容请参考TransmissionControlProtocol(TCP)Parameters。
最后,length372代表数据包有效载荷字节长度。这个长度和seq序列号中字节数值长度是不一样的。
现在让我们学习如何过滤数据报文以便更容易的分析定位问题。
4、过滤数据包
正如上面所提,tcpdump可以抓取很多种类型的数据报文,其中很多可能和我们需要查找的问题并没有关系。举个例子,假设你正在定位一个与web服务器连接的网络问题,就不必关系SSH数据报文,因此在抓包结果中过滤掉SSH报文可能更便于你分析问题。
tcpdump有很多参数选项可以设置数据包过滤规则,例如根据源IP以及目的IP地址,端口号,协议等等规则来过滤数据包。
下面就介绍一些最常用的过滤方法。
协议
在命令中指定协议便可以按照协议类型来筛选数据包。比方说用如下命令只要抓取ICMP报文:
$sudotcpdump-iany-c5icmp tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes
然后再打开一个终端,去ping另一台机器:
$pingopensource.com PINGopensource.com(54.204.39.132)56(84)bytesofdata. 64bytesfromec2-54-204-39-132.compute-1.amazonaws.com(54.204.39.132):icmp_seq=1ttl=47time=39.6ms
回到运行tcpdump命令的终端中,可以看到它筛选出了ICMP报文。这里tcpdump并没有显示有关opensource.com的域名解析数据包:
09:34:20.136766IPrhel75>ec2-54-204-39-132.compute-1.amazonaws.com:ICMPechorequest,id20361,seq1,length64 09:34:20.176402IPec2-54-204-39-132.compute-1.amazonaws.com>rhel75:ICMPechoreply,id20361,seq1,length64 09:34:21.140230IPrhel75>ec2-54-204-39-132.compute-1.amazonaws.com:ICMPechorequest,id20361,seq2,length64 09:34:21.180020IPec2-54-204-39-132.compute-1.amazonaws.com>rhel75:ICMPechoreply,id20361,seq2,length64 09:34:22.141777IPrhel75>ec2-54-204-39-132.compute-1.amazonaws.com:ICMPechorequest,id20361,seq3,length64 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
主机
用host参数只抓取和特定主机相关的数据包:
$sudotcpdump-iany-c5-nnhost54.204.39.132 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 09:54:20.042023IP192.168.122.98.39326>54.204.39.132.80:Flags[S],seq1375157070,win29200,options[mss1460,sackOK,TSval122350391ecr0,nop,wscale7],length0 09:54:20.088127IP54.204.39.132.80>192.168.122.98.39326:Flags[S.],seq1935542841,ack1375157071,win28960,options[mss1460,sackOK,TSval522713542ecr122350391,nop,wscale9],length0 09:54:20.088204IP192.168.122.98.39326>54.204.39.132.80:Flags[.],ack1,win229,options[nop,nop,TSval122350437ecr522713542],length0 09:54:20.088734IP192.168.122.98.39326>54.204.39.132.80:Flags[P.],seq1:113,ack1,win229,options[nop,nop,TSval122350438ecr522713542],length112:HTTP:GET/HTTP/1.1 09:54:20.129733IP54.204.39.132.80>192.168.122.98.39326:Flags[.],ack113,win57,options[nop,nop,TSval522713552ecr122350438],length0 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
如上所示,只抓取和显示与54.204.39.132有关的数据包。
端口号
tcpdump可以根据服务类型或者端口号来筛选数据包。例如,抓取和HTTP服务相关的数据包:
$sudotcpdump-iany-c5-nnport80 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 09:58:28.790548IP192.168.122.98.39330>54.204.39.132.80:Flags[S],seq1745665159,win29200,options[mss1460,sackOK,TSval122599140ecr0,nop,wscale7],length0 09:58:28.834026IP54.204.39.132.80>192.168.122.98.39330:Flags[S.],seq4063583040,ack1745665160,win28960,options[mss1460,sackOK,TSval522775728ecr122599140,nop,wscale9],length0 09:58:28.834093IP192.168.122.98.39330>54.204.39.132.80:Flags[.],ack1,win229,options[nop,nop,TSval122599183ecr522775728],length0 09:58:28.834588IP192.168.122.98.39330>54.204.39.132.80:Flags[P.],seq1:113,ack1,win229,options[nop,nop,TSval122599184ecr522775728],length112:HTTP:GET/HTTP/1.1 09:58:28.878445IP54.204.39.132.80>192.168.122.98.39330:Flags[.],ack113,win57,options[nop,nop,TSval522775739ecr122599184],length0 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
IP地址/主机名
同样,你也可以根据源IP地址或者目的IP地址或者主机名来筛选数据包。例如抓取源IP地址为192.168.122.98的数据包:
$sudotcpdump-iany-c5-nnsrc192.168.122.98 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 10:02:15.220824IP192.168.122.98.39436>192.168.122.1.53:59332+A?opensource.com.(32) 10:02:15.220862IP192.168.122.98.39436>192.168.122.1.53:20749+AAAA?opensource.com.(32) 10:02:15.364062IP192.168.122.98.39334>54.204.39.132.80:Flags[S],seq1108640533,win29200,options[mss1460,sackOK,TSval122825713ecr0,nop,wscale7],length0 10:02:15.409229IP192.168.122.98.39334>54.204.39.132.80:Flags[.],ack669337581,win229,options[nop,nop,TSval122825758ecr522832372],length0 10:02:15.409667IP192.168.122.98.39334>54.204.39.132.80:Flags[P.],seq0:112,ack1,win229,options[nop,nop,TSval122825759ecr522832372],length112:HTTP:GET/HTTP/1.1 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
注意此处示例中抓取了来自源IP地址192.168.122.98的53端口以及80端口的数据包,它们的应答包没有显示出来因为那些包的源IP地址已经变了。
相对的,使用dst就是按目的IP/主机名来筛选数据包。
$sudotcpdump-iany-c5-nndst192.168.122.98 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 10:05:03.572931IP192.168.122.1.53>192.168.122.98.47049:22481/0/0A54.204.39.132(48) 10:05:03.572944IP192.168.122.1.53>192.168.122.98.47049:337700/0/0(32) 10:05:03.621833IP54.204.39.132.80>192.168.122.98.39338:Flags[S.],seq3474204576,ack3256851264,win28960,options[mss1460,sackOK,TSval522874425ecr122993922,nop,wscale9],length0 10:05:03.667767IP54.204.39.132.80>192.168.122.98.39338:Flags[.],ack113,win57,options[nop,nop,TSval522874436ecr122993972],length0 10:05:03.672221IP54.204.39.132.80>192.168.122.98.39338:Flags[P.],seq1:643,ack113,win57,options[nop,nop,TSval522874437ecr122993972],length642:HTTP:HTTP/1.1302Found 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
多条件筛选
当然,可以使用多条件组合来筛选数据包,使用and以及or逻辑操作符来创建过滤规则。例如,筛选来自源IP地址192.168.122.98的HTTP数据包:
$sudotcpdump-iany-c5-nnsrc192.168.122.98andport80 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 10:08:00.472696IP192.168.122.98.39342>54.204.39.132.80:Flags[S],seq2712685325,win29200,options[mss1460,sackOK,TSval123170822ecr0,nop,wscale7],length0 10:08:00.516118IP192.168.122.98.39342>54.204.39.132.80:Flags[.],ack268723504,win229,options[nop,nop,TSval123170865ecr522918648],length0 10:08:00.516583IP192.168.122.98.39342>54.204.39.132.80:Flags[P.],seq0:112,ack1,win229,options[nop,nop,TSval123170866ecr522918648],length112:HTTP:GET/HTTP/1.1 10:08:00.567044IP192.168.122.98.39342>54.204.39.132.80:Flags[.],ack643,win239,options[nop,nop,TSval123170916ecr522918661],length0 10:08:00.788153IP192.168.122.98.39342>54.204.39.132.80:Flags[F.],seq112,ack643,win239,options[nop,nop,TSval123171137ecr522918661],length0 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
你也可以使用括号来创建更为复杂的过滤规则,但在shell中请用引号包含你的过滤规则以防止被识别为shell表达式:
$sudotcpdump-iany-c5-nn"port80and(src192.168.122.98orsrc54.204.39.132)" tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 10:10:37.602214IP192.168.122.98.39346>54.204.39.132.80:Flags[S],seq871108679,win29200,options[mss1460,sackOK,TSval123327951ecr0,nop,wscale7],length0 10:10:37.650651IP54.204.39.132.80>192.168.122.98.39346:Flags[S.],seq854753193,ack871108680,win28960,options[mss1460,sackOK,TSval522957932ecr123327951,nop,wscale9],length0 10:10:37.650708IP192.168.122.98.39346>54.204.39.132.80:Flags[.],ack1,win229,options[nop,nop,TSval123328000ecr522957932],length0 10:10:37.651097IP192.168.122.98.39346>54.204.39.132.80:Flags[P.],seq1:113,ack1,win229,options[nop,nop,TSval123328000ecr522957932],length112:HTTP:GET/HTTP/1.1 10:10:37.692900IP54.204.39.132.80>192.168.122.98.39346:Flags[.],ack113,win57,options[nop,nop,TSval522957942ecr123328000],length0 5packetscaptured 5packetsreceivedbyfilter 0packetsdroppedbykernel
该例子中我们只抓取了来自源IP为192.168.122.98或者54.204.39.132的HTTP(端口号80)的数据包。使用该方法就很容易抓取到数据流中交互双方的数据包了。
5、检查数据包内容
在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。tcpdump提供了两个选项可以查看数据包内容,-X以十六进制打印出数据报文内容,-A打印数据报文的ASCII值。
例如,HTTP请求报文内容如下:
$sudotcpdump-iany-c10-nn-Aport80 tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecode listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 13:02:14.871803IP192.168.122.98.39366>54.204.39.132.80:Flags[S],seq2546602048,win29200,options[mss1460,sackOK,TSval133625221ecr0,nop,wscale7],length0 E..<..@.@.....zb6.'....P...@......r............ ............................ 13:02:14.910734IP54.204.39.132.80>192.168.122.98.39366:Flags[S.],seq1877348646,ack2546602049,win28960,options[mss1460,sackOK,TSval525532247ecr133625221,nop,wscale9],length0 E..<..@./..a6.'...zb.P..o..&...A..qa.......... .R.W....................... 13:02:14.910832IP192.168.122.98.39366>54.204.39.132.80:Flags[.],ack1,win229,options[nop,nop,TSval133625260ecr525532247],length0 E..4..@.@.....zb6.'....P...Ao..'........... .....R.W................ 13:02:14.911808IP192.168.122.98.39366>54.204.39.132.80:Flags[P.],seq1:113,ack1,win229,options[nop,nop,TSval133625261ecr525532247],length112:HTTP:GET/HTTP/1.1 E.....@.@..1..zb6.'....P...Ao..'........... .....R.WGET/HTTP/1.1 User-Agent:Wget/1.14(linux-gnu) Accept:*/* Host:opensource.com Connection:Keep-Alive ................ 13:02:14.951199IP54.204.39.132.80>192.168.122.98.39366:Flags[.],ack113,win57,options[nop,nop,TSval525532257ecr133625261],length0 E..4.F@./.."6.'...zb.P..o..'.......9.2..... .R.a.................... 13:02:14.955030IP54.204.39.132.80>192.168.122.98.39366:Flags[P.],seq1:643,ack113,win57,options[nop,nop,TSval525532258ecr133625261],length642:HTTP:HTTP/1.1302Found E....G@./...6.'...zb.P..o..'.......9....... .R.b....HTTP/1.1302Found Server:nginx Date:Sun,23Sep201817:02:14GMT Content-Type:text/html;charset=iso-8859-1 Content-Length:207 X-Content-Type-Options:nosniff Location:https://opensource.com/ Cache-Control:max-age=1209600 Expires:Sun,07Oct201817:02:14GMT X-Request-ID:v-6baa3acc-bf52-11e8-9195-22000ab8cf2d X-Varnish:632951979 Age:0 Via:1.1varnish(Varnish/5.2) X-Cache:MISS Connection:keep-alive
302Found Found
Thedocumenthasmoved
................ 13:02:14.955083IP192.168.122.98.39366>54.204.39.132.80:Flags[.],ack643,win239,options[nop,nop,TSval133625304ecr525532258],length0 E..4..@.@.....zb6.'....P....o.............. .....R.b................ 13:02:15.195524IP192.168.122.98.39366>54.204.39.132.80:Flags[F.],seq113,ack643,win239,options[nop,nop,TSval133625545ecr525532258],length0 E..4..@.@.....zb6.'....P....o.............. .....R.b................ 13:02:15.236592IP54.204.39.132.80>192.168.122.98.39366:Flags[F.],seq643,ack114,win57,options[nop,nop,TSval525532329ecr133625545],length0 E..4.H@./..6.'...zb.P..o..........9.I..... .R...................... 13:02:15.236656IP192.168.122.98.39366>54.204.39.132.80:Flags[.],ack644,win239,options[nop,nop,TSval133625586ecr525532329],length0 E..4..@.@.....zb6.'....P....o.............. .....R.................. 10packetscaptured 10packetsreceivedbyfilter 0packetsdroppedbykernelhere.
这对定位一些普通HTTP调用API接口的问题很有用。当然如果是加密报文,这个输出也就没多大用了。
6、保存抓包数据
tcpdump提供了保存抓包数据的功能以便后续分析数据包。例如,你可以夜里让它在那里抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。
使用-w选项来保存数据包而不是在屏幕上显示出抓取的数据包:
$sudotcpdump-iany-c10-nn-wwebserver.pcapport80 [sudo]passwordforricardo: tcpdump:listeningonany,link-typeLINUX_SLL(Linuxcooked),capturesize262144bytes 10packetscaptured 10packetsreceivedbyfilter 0packetsdroppedbykernel
该命令将抓取的数据包保存到文件webserver.pcap。后缀名pcap表示文件是抓取的数据包格式。
正如示例中所示,保存数据包到文件中时屏幕上就没有任何有关数据报文的输出,其中-c10表示抓取到10个数据包后就停止抓包。如果想有一些反馈来提示确实抓取到了数据包,可以使用-v选项。
tcpdump将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用-r选项参数来阅读该文件中的报文内容:
$tcpdump-nn-rwebserver.pcap readingfromfilewebserver.pcap,link-typeLINUX_SLL(Linuxcooked) 13:36:57.679494IP192.168.122.98.39378>54.204.39.132.80:Flags[S],seq3709732619,win29200,options[mss1460,sackOK,TSval135708029ecr0,nop,wscale7],length0 13:36:57.718932IP54.204.39.132.80>192.168.122.98.39378:Flags[S.],seq1999298316,ack3709732620,win28960,options[mss1460,sackOK,TSval526052949ecr135708029,nop,wscale9],length0 13:36:57.719005IP192.168.122.98.39378>54.204.39.132.80:Flags[.],ack1,win229,options[nop,nop,TSval135708068ecr526052949],length0 13:36:57.719186IP192.168.122.98.39378>54.204.39.132.80:Flags[P.],seq1:113,ack1,win229,options[nop,nop,TSval135708068ecr526052949],length112:HTTP:GET/HTTP/1.1 13:36:57.756979IP54.204.39.132.80>192.168.122.98.39378:Flags[.],ack113,win57,options[nop,nop,TSval526052959ecr135708068],length0 13:36:57.760122IP54.204.39.132.80>192.168.122.98.39378:Flags[P.],seq1:643,ack113,win57,options[nop,nop,TSval526052959ecr135708068],length642:HTTP:HTTP/1.1302Found 13:36:57.760182IP192.168.122.98.39378>54.204.39.132.80:Flags[.],ack643,win239,options[nop,nop,TSval135708109ecr526052959],length0 13:36:57.977602IP192.168.122.98.39378>54.204.39.132.80:Flags[F.],seq113,ack643,win239,options[nop,nop,TSval135708327ecr526052959],length0 13:36:58.022089IP54.204.39.132.80>192.168.122.98.39378:Flags[F.],seq643,ack114,win57,options[nop,nop,TSval526053025ecr135708327],length0 13:36:58.022132IP192.168.122.98.39378>54.204.39.132.80:Flags[.],ack644,win239,options[nop,nop,TSval135708371ecr526053025],length0 $
这里不需要管理员权限sudo了,因为此刻并不是在网络接口处抓包。
你还可以使用我们讨论过的任何过滤规则来过滤文件中的内容,就像使用实时数据一样。例如,通过执行以下命令从源IP地址54.204.39.132检查文件中的数据包:
$tcpdump-nn-rwebserver.pcapsrc54.204.39.132 readingfromfilewebserver.pcap,link-typeLINUX_SLL(Linuxcooked) 13:36:57.718932IP54.204.39.132.80>192.168.122.98.39378:Flags[S.],seq1999298316,ack3709732620,win28960,options[mss1460,sackOK,TSval526052949ecr135708029,nop,wscale9],length0 13:36:57.756979IP54.204.39.132.80>192.168.122.98.39378:Flags[.],ack113,win57,options[nop,nop,TSval526052959ecr135708068],length0 13:36:57.760122IP54.204.39.132.80>192.168.122.98.39378:Flags[P.],seq1:643,ack113,win57,options[nop,nop,TSval526052959ecr135708068],length642:HTTP:HTTP/1.1302Found 13:36:58.022089IP54.204.39.132.80>192.168.122.98.39378:Flags[F.],seq643,ack114,win57,options[nop,nop,TSval526053025ecr135708327],length0
下一步做什么?
以上的基本功能已经可以帮助你使用强大的tcpdump抓包工具了。更多的内容请参考tcpdump网站以及它的帮助文件。
tcpdump命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考Wireshark。
Wireshark还可以用来读取tcpdump保存的pcap文件。你可以使用tcpdump命令行在没有GUI界面的远程机器上抓包然后在Wireshark中分析数据包。
via:https://opensource.com/article/18/10/introduction-tcpdump
总结
以上所述是小编给大家介绍的在Linux命令行中使用tcpdump抓包的一些功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!