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
和过滤表达式来对输出信息进行控制,十分方便。
赞赏微信赞赏
支付宝赞赏