抓包神器:tcpdump!我还真没用过

点击上方蓝色字关注我们~

面试官

你说你会网络编程?你说你熟悉网络知识,那你使用过tcpdump吗?能给我讲下tcpdump是什么,或者你有用过tcpdump解决过实际问题吗?

如果你学过网络,甚至搞过网络编程,或者在分析网络情况等,那么对当前网络请求进行抓包诊断分析十分重要,可以帮助你理解网络的交互方式,特别是网络协议的原理,可以帮你更加好的理解tcp等原理和牢固的掌握。

掌握这项技能,对你是非常有帮助的!

PART

1

Linux抓包原理

Linux抓包 是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。

当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。


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

PART

2

tcpdump介绍

tcpdump 是Linux系统下的一款抓包命令集,工作原理是基于网卡抓取流动在网卡上的数据包。

在Linux系统中由于tcpdump命令的简单和强大,我们一般直接使用tcpdump命令来抓取数据包。

保存之后,拖下来在wireshark中分析。一般会在图形化界面的Linux(Ubuntu、CentOS等)上使用wireshark进行分析,也可以在Windows(Windows wireshark基于winpcap处理网络驱动层)上分析。

想了解如何使用wireshark分析,请看这篇文章 《抓包神器:Wireshark 实例分析TCP三次握手过程 》

默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。

如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言说就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。

一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。(ifconfig ens32 -promisc关闭)

简单的话 来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

PART

3

tcpdump使用

1、Linux安装tcpdump(一般Linux默认会有安装)

[root@verysu ~]# tcpdump -h
-bash: tcpdump: command not found

没有安装,那么使用yum进行安装

[root@verysu ~]# yum -y install tcpdump

安装完成:

2、tcpdump语法参数解释

[root@verysu ~]# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]

选项:

-A:以ASCII编码打印每个报文(不包括链路层的头),这对分析网页来说很方便;
-a:将网络地址和广播地址转变成名字;
-c<数据包数目>:在收到指定的包的数目后,tcpdump就会停止;
-C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
-d:将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd:将匹配信息包的代码以c语言程序段的格式给出;
-ddd:将匹配信息包的代码以十进制的形式给出;
-D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
-i<网络界面>:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),linux 2.2 内核及之后的版本支持 any 网卡,用于指代任意网卡;
-l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认);
-n:显示ip,而不是主机名;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q:快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生);

3、tcpdump实战

1、直接启动tcpdump,将监视第一个网络接口(eth0)上所有流过的数据包。

[root@verysu ~]# tcpdump // (第一个网卡)等价于 tcpdump -i:eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:43:59.281717 ARP, Request who-has 31.40.214.232 (Broadcast) tell 31.40.214.1, length 46
16:43:59.282425 IP verysu.53820 > a.resolvers.level3.net.domain: 50021+ PTR? 232.214.40.31.in-addr.arpa. (44)
16:43:59.282596 IP verysu.26077 > 223.74.151.95.27638: Flags [P.], seq 1775291690:1775291886, ack 2753427966, win 344, length 196
16:43:59.292276 ARP, Request who-has 212.103.62.170 (Broadcast) tell 212.103.62.1, length 46

也可以使用参数启动指定网卡:-i eth0//抓取通过eth0网卡的数据包,信息实时打印在屏幕上。-i表示指定哪个网卡接口,后面跟网卡名字,比如eth0或者lo

可以看到tcp协议的相关数据:seq、ack、win、length等。

2、监视指定主机的数据包

比如:监视Google,此时需要在主机上请求www.google.com地址,才能监测到网络数据包,进而被tcpdump抓取。

抓取该网卡eth0和www.google.com地址会话的数据包,实时打印在屏幕上,host后面跟IP地址或者域名。

[root@verysu ~]# tcpdump -i eth0 host www.google.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:56:23.145367 IP verysu.53310 > lax17s15-in-f4.1e100.net.http: Flags [S], seq 1283038515, win 29200, options [mss 1460,sackOK,TS val 3814323192 ecr 0,nop,wscale 7], length 0
16:56:23.145880 IP lax17s15-in-f4.1e100.net.http > verysu.53310: Flags [S.], seq 2651245619, ack 1283038516, win 60192, options [mss 1380,sackOK,TS val 2798935901 ecr 3814323192,nop,wscale 8], length 0
16:56:23.145906 IP verysu.53310 > lax17s15-in-f4.1e100.net.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 3814323192 ecr 2798935901], length 0
16:56:23.146062 IP verysu.53310 > lax17s15-in-f4.1e100.net.http: Flags [P.], seq 1:79, ack 1, win 229, options [nop,nop,TS val 3814323193 ecr 2798935901], length 78: HTTP: GET / HTTP/1.1
16:56:23.146402 IP lax17s15-in-f4.1e100.net.http > verysu.53310: Flags [.], ack 79, win 236, options [nop,nop,TS val 2798935902 ecr 3814323193], length 0
16:56:23.206977 IP lax17s15-in-f4.1e100.net.http > verysu.53310: Flags [.], seq 1:1419, ack 79, win 236, options [nop,nop,TS val 2798935962 ecr 3814323193], length 1418: HTTP: HTTP/1.1 200 OK
16:56:23.207008 IP verysu.53310 > lax17s15-in-f4.1e100.net.http: Flags [.], ack 1419, win 251, options [nop,nop,TS val 3814323253 ecr 2798935962], length 0
16:56:23.207036 IP lax17s15-in-f4.1e100.net.http > verysu.53310: Flags [.], seq 1419:7091, ack 79, win 236, options [nop,nop,TS val 2798935962 ecr 3814323193], length 5672: HTTP
16:56:23.207047 IP verysu.53310 > lax17s15-in-f4.1e100.net.http: Flags [.], ack 7091, win 339, options [nop,nop,TS val 3814323254 ecr 2798935962], length 0
16:56:23.207054 IP lax17s15-in-f4.1e100.net.http > verysu.53310: Flags [.], seq 7091:12763, ack 79, win 236, options [nop,nop,TS val 2798935962 ecr 3814323193], length 5672: HTTP
......

第一项是时间,如果命令加上-tttt参数,那么会显示年月日,但是大多数情况下用不到这个参数。

第二项是IP地址,我没有加-nn参数,所以这里服务器ip地址和服务器端口号被域名解析成了verysu.53310等,箭头是指数据发送方向。

第三项Flags,seq,ack等,是TCP协议的三次握手标识。

3、监视其它指定主机等使用方式的数据包

// 截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

// 打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios

// 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2

// 截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname

// 监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname

注意:如果通信进程都处于同一个主机上,无论IP地址是任何地址,其数据都是只经过lo,不会经过其他的网卡。


4、保存抓包数据

tcpdump tcp -w test.pcap

保存好抓包数据,之后可以使用wireshark进行分析了。

如何使用wireshark分析,请看这篇文章 《抓包神器:Wireshark 实例分析TCP三次握手过程 》

其它神器↓↓:

压测神器:jmeter压测 Dubbo RPC接口

高性能工具:JMH 微基准测试

开源神器:Java诊断利器Arthas

线上压测导流神器tcpcopy:导入线上流量进行功能和压力测试

参考资料:

1、https://blog.csdn.net/essity/article/details/82811199

2、https://www.jianshu.com/p/a62ed1bb5b20

3、https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

4、https://www.cnblogs.com/MasterBai2018/p/9287469.html

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章