tcpdump命令实战使用指南

1. tcpdump命令是什么

其实tcpdump就好像一个神探,它有着夜视的绝技,在毫无光亮的环境中,也可以看到所有的东西。(好像在编美剧hero一般);在介绍tcpdump之前,要确认好几个关键前提,否则的话,往后的内容看起来会非常困难。

  • 了解和使用过Linux
  • 掌握网络七层协议及其作用
  • 熟悉各层协议头,重点是以太网/IP/TCP/UDP
  • 了解交换机、路由器所对应的协议层,并知道两者的异同点。

如果有些忘记了,那么强烈建议翻出《计算机网络》教材,先好好回忆一下,然后再进入到下面的内容…

 

通俗的说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包。

形象的说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是要入境和出境的集装箱,海关人员总要打开箱子看看里面都装了点啥。

学术的说,tcpdump是一种嗅探器(sniffer),利用以太网的特性,通过将网卡适配器(NIC)置于混杂模式(promiscuous)来获取传输在网络中的信息包。

 

2. tcpdump命令语法说明

tcpdump可以分为三大部分内容:

第一是“选项”,第二是“过滤表达式”,第三是“输出信息”。

  • tcpdump选项:

专门数了一下,总共有50个之多。在下面内容中,实在很难全都覆盖,尽量挑选重要且常用的选项来讲解,一些不常用的选项,大家抽空可以自己去了解一下。

  • tcpdump过滤表达式:

可以给tcpdump传送“过滤表达式”来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式,从这一点来说tcpdump还是很大肚能容的。当你传入的过滤表达式含有shell通配符时,别忘使用单引号把表达式括起来,以防shell自作主张的把含有通配符的表达式先进行了解释和通配。

 

如果希望自行研究“过滤表达式”,研究方法就是: man pcap-filter

会发现,过滤表达式大体可以分成三种过滤条件,“类型”、“方向”和“协议”,这三种条件的搭配组合就构成了真正的过滤表达式。

 

3. tcpdump命令实践说明

选项参数实例说明:

选项参数说明:
-i是interface的含义

是指我们有义务告诉tcpdump希望去监听哪一个网卡。这在一台服务器有多块网卡时很有必要

-nn意思是说当tcpdump遇到协议号或端口号时,不要将这些号码转换成对应的协议名称或端口名称。

比如,众所周知21端口是FTP端口,我们希望显示21,而非tcpdump自作聪明的将它显示成FTP。

-X告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

如果不进行原本的显示输出,当将收到的信息放入到其它专业分析包软件中分析时会有问题

-c是Count的含义

这设置了我们希望tcpdump帮我们抓几个包。设置的是1,所以tcpdump不会帮我再多抓哪怕一个包回来

-w将流量保存到文件中

tcpdump的-w方式是把raw packets(原始网络包)直接存储到文件中了,也就是存储的都是结构体形式,

而非是分析之后的文本格式的信息,因此是无法直接通过less命令查看的。

-r读取raw packets文件

 

实例1:tcpdump命令抓取人生第一个数据包:

要用tcpdump抓包,请记住,一定要切换到root账户下,因为只有root才有权限将网卡变更为“混杂模式”。然后用ifconfig的方法查看好你的服务器的网卡名称。

# tcpdump -i eth0 -nn -X 'port 53' -c 1   

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:57:14.598548 IP 10.0.0.1.58157 > 223.5.5.5.53: 30677+ A? www.baidu.com. (31)
         0x0000:  4500 003b 6fce 4000 4011 dcd8 0a00 0001 E..;o.@.@.......
         0x0010:  df05 0505 e32d 0035 0027 ee43 77d5 0100       .....-.5.'.Cw...
         0x0020:  0001 0000 0000 0000 0377 7777 0562 6169      .........www.bai
         0x0030:  6475 0363 6f6d 0000 0100 01              du.com.....
1 packets captured
1 packets received by filter
0 packets dropped by kernel

说明:从混混乱乱的输出中,隐约的能看到www.baidu.com,是的,抓到的这个包,其实是DNS解析的

第一个包,也就是发出解析请求的包。

port 53表示只关心源端口或目标端口是53的数据包,其它的数据包不用进行显示

 

 实例2:tcpdump命令-w/-r参数应用说明:

做过网络流量分析的同学,或许都有一个共同的需求,那就是“流量保存”和“流量回放”

这就恰好对应了要讲解的-w选项和-r选项。

“流量保存”就是把抓到的网络包能存储到磁盘上,保存下来,为后续使用。

“流量回放”就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。

 

# tcpdump -i eth0 -w flowdata 

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C5 packets captured
6 packets received by filter
0 packets dropped by kernel

说明:通过上面的例子可以看到,通过-w选项将流量都存储在了flowdata文件中了。

 

# less flowdata

"flowdata" may be a binary file.  See it anyway?

 

说明:抓包保存文件都是二进制格式的,无法直接通过文本方式查看。因为tcpdump的-w方式是把

raw packets(原始网络包)直接存储到文件中了,也就是存储的都是结构体形式,

而非是分析之后的文本格式的信息,因此大家是无法直接通过less命令查看的。

 

做过网络流量分析的同学,或许都有一个共同的需求,那就是“流量保存”和“流量回放”

这就恰好对应了要讲解的-w选项和-r选项。

“流量保存”就是把抓到的网络包能存储到磁盘上,保存下来,为后续使用。

“流量回放”就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。

# tcpdump -r flowdata 
reading from file flowdata, link-type EN10MB (Ethernet)
16:58:08.039145 IP git-01.ssh > 10.0.0.253.51422: Flags [P.], seq 3649256158:3649256334, ack 1677533269, win 53, length 176
16:58:08.039274 IP 10.0.0.253.51422 > git-01.ssh: Flags [.], ack 176, win 256, length 0
16:58:10.495293 ARP, Request who-has git-01 (00:0c:29:44:90:b8 (oui Unknown)) tell 10.0.0.253, length 46
16:58:10.495329 ARP, Reply git-01 is-at 00:0c:29:44:90:b8 (oui Unknown), length 28
16:58:17.218037 IP 10.0.0.253.51422 > git-01.ssh: Flags [P.], seq 1:97, ack 176, win 256, length 96

 

说明:其实上面的命令就是在不知不觉中进行了“流量回放”,你会发现网络包被“抓”的速度都按照历史

进行了回放,真像一个“时光机”啊!由于是按raw packets来存储的,所以你完全可以使用-e、-l

和过滤表达式来对输出信息进行控制,十分方便。

赞赏

微信赞赏支付宝赞赏

Linux基础

TCP的三次握手与四次挥手理解(附相关面试题)

2019-12-13 10:08:09

Linux基础

Linux如何配置SVN

2019-12-24 10:41:03

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索