进阶!高级网工必知的 Linux 抓包工具:tcpdump
我们都知道,想学会网络技术,人人都绕不开“抓包”这项技能。只有把设备之间交互的信息读透了,搞懂它,那么,你在网络世界里,就能游刃有余,如鱼得水。
相信,很多网工都抓过包,可能大部分初学者都是抓网络设备、电脑上的数据包,很少抓过 linux 服务器上的数据包,今天就与大家分享一下,linux 抓包工具:tcpdump
简介
Tcpdump 是著名的 sniffer,是一个被很多 UNIX 高手认为是一个专业的网络管理工具,记得以前 TsutomuShimomura,就是使用他自己修改过的 TCPDUMP 版本来记录了 KEVINMITNICK 攻击他系统的记录,后来就配合 FBI 抓住了 KEVINMITNICK。你能够利用这个工具检查访问你服务器中的文件包信息,监测你网络中的问题所在。
Linux 作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump 是 Linux 中强大的网络数据采集分析工具之一。用简单的话来定义 tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理员必备工具,tcpdump 以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。
百度百科
其实说白了,tcpdump 就类似我们经常在 window 客户端使用 wireshark,区别就是一个是图形界面,一个是命令形式。
安装 tcpdump
如果你的系统默认没有安装 tcpdump,那么你可以使用如下命令,进行安装:
yum install tcpdump -y
命令实例
为了方便大家直观理解,我简单画了个参数图,如下:
注释:
option:可选参数,可以指定相关参数,输出特定信息。
proto:类过滤器,指定某种协议的数据包。如 tcp。
direction:类过滤器,根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst。
type:类过滤器,可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。
在开始玩 tcpdump 时,读者应该有所了解报文结构,这样才能更好读懂 tcpdump 输出的信息。
1、抓取特定网卡 80 端口的链接情况:
我先用 ifconfig 查看网卡名称:
ifconfig
输入下来命令后,打开百度网页:
tcpdump -i ens33 port 80
可以捕获到如下信息,截取一部分:
21:31:34.422461 IP 221.5.75.35.http > localhost.localdomain.42884: Flags [P.], seq 1715:1720, ack 302, win 64240, length 5: HTTP
21:31:34.422473 IP localhost.localdomain.42884 > 221.5.75.35.http: Flags [.], ack 1720, win 33888, length 0
关于上面输出的内容,格式注释如下:
第一列:时分秒毫秒 21:31:34.422461
第二列:网络协议 IP
第三列:发送方的 ip 地址+端口号,其中 221.5.75.35 是 ip,而 http 是端口号,即 80
第四列:箭头 >, 表示数据流向
第五列:接收方的 ip 地址+端口号,其中 localhost.localdomain. 是 ip,本机,而 42884 是端口号。
第六列:冒号
第七列:数据包内容,包括 Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1。
其中 Flags 标识符有以下几种:
[S] : SYN(开始连接)
[P] : PSH(推送数据)
[F] : FIN (结束连接)
[R] : RST(重置连接)
[.] : 没有 Flag,由于除了 SYN 包外所有的数据包都有 ACK,所以一般这个标志也可表示 ACK
2、如果你觉得命令行不习惯,还是喜欢用 wireshark 来查看数据包,那么你还可以使用 tcpdump 来保存.cap 文件,然后导出 cap 文件,就可以用 wireshark 软件来打开查看了。
tcpdump -i ens33 port 80 -w ./20210616.cap
注释:
-w:参数指定将监听到的数据包写入文件中保存,file.cap 就是该文件。
./:保存的路径。
20210616.cap:保存的文件名。
通过 ls,可以看到该文件已生成:
接下来,我将用“Winscp”软件登录该 linux 服务器上把“20210616.cap”文件拷贝到 window 电脑上。
输入 linux 服务器 ip 地址(即我虚拟机的 ip 地址)、账号、密码
下载 cap 文件:
已下载到 window 物理机上了:
双击,我们就可以使用 wireshark 来查看数据包了:
3、基于协议进行过滤,比如就只抓起 icmp 报文。
tcpdump icmp
输完上述命令后,我打开网页,又进行了 ping 测试,先 ping8.8.8.8,然后中止了,再 ping 114.114.114.114.
来看看,命令输出的结果:
23:05:28.009283 IP public1.114dns.com > localhost.localdomain: ICMP echo reply, id 24125, seq 3, length 64
4、上述我们看到了,ping 114.114.114.114,tcpdump 输出显示是域名形式,如果我们希望显示 ip 地址,可以加一个参数:-n (即不把 ip 转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多)
tcpdump icmp -n
5、捕获特定的目的 IP 地址的数据包。
我在 linux 服务器上进行 ping 多个地址(114.114.114.114、223.5.5.5、223.6.6.6),然后我 tcpdump 只需 114.114.114.114 的。
tcpdump icmp -n and dst host 114.114.114.114
and:后面就是加了限制条件,只捕获指定的目的 ip 地址为 114.114.114.114 的报文。
本期就先分享这些了,相信初学者对 tcpdump 已经有所了解了。
感兴趣的同学,可以抽空专门深入研究一下该工具,其实该命令主要是了解它的语法规则,即过滤规则,以便后续工作中,能快速捕获自己想要的数据包,而不用捕获一堆无用的数据包,太多无用的数据包,一是占存储空间,二是视觉疲劳,效率低。