tcpdump命令:抓取数据包
tcpdump命令是一款抓取数据包的工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w
选项将数据包保存到文件中,方便以后分析
常用选项:
-a
:尝试将网络和广播地址转换成名称;-c
:<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;-d
:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;-dd
:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;-ddd
:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;-e
:在每列倾倒资料上显示连接层级的文件头;-f
:用数字显示网际网络地址;-F
:<表达文件>:指定内含表达方式的文件;-i
:<网络界面>:使用指定的网络截面送出数据包;-l
:使用标准输出列的缓冲区;-n
:不把主机的网络地址转换成名字;-N
:不列出域名;-O
:不将数据包编码最佳化;-p
:不让网络界面进入混杂模式;-q
:快速输出,仅列出少数的传输协议信息;-r
:<数据包文件>:从指定的文件读取数据包数据;-s
:<数据包大小>:设置每个数据包的大小;-S
:用绝对而非相对数值列出TCP关联数;-t
:在每列倾倒资料上不显示时间戳记;-tt
:在每列倾倒资料上显示未经格式化的时间戳记;-T
:<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;-v
:详细显示指令执行过程;-vv
:更详细显示指令执行过程;-x
:用十六进制字码列出数据包资料;-w
:<数据包文件>:把数据包数据写入指定的文件
例子:
- 不指定任何参数
监听第一块网卡上经过的数据包。主机上可能有不止一块网卡,所以经常需要指定网卡
tcpdump
- 监听指定网卡
tcpdump -i ens33
- 监听指定主机
例子:监听本机跟主机192.168.182.11之间往来的通信包,出、入的包都会被监听
tcpdump host 192.168.182.11
- 特定来源、目标地址的通信
特定来源地址
tcpdump src host 192.168.182.11
特定目标地址
tcpdump dst host 192.168.182.11
如果不指定src
跟dst
,那么来源或者目标是hostname
的通信都会被监听
tcpdump host 192.168.182.11
- 指定端口
tcpdump port 8080
- 监听TCP/UDP
服务器上不同服务分别用了TCP、UDP
作为传输层,假如只想监听TCP的数据包
tcpdump tcp
- 来源主机+端口+TCP
监听来自主机192.168.182.11
在端口22
上的TCP
数据包
tcpdump tcp port 22 and src host 192.168.182.11
- 监听特定主机之间的通信
抓取192.168.182.11
和192.168.182.12
主机之间的通信数据
tcpdump ip host 192.168.182.11 and 192.168.182.12
抓取192.168.182.11
和除了192.168.182.12
之外的主机之间的通信
tcpdump ip host 192.168.182.11 and ! 192.168.182.12
- 综合实例
tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w tcpdump.cap
tcp
: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型-i ens33
: 只抓经过接口eth1的包-t
: 不显示时间戳-s 0
: 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包-c 100
: 只抓取100个数据包dst port ! 22
: 不抓取目标端口是22的数据包src net 192.168.1.0/24
: 数据包的源网络地址为192.168.1.0/24-w tcpdump.cap
: 保存成cap文件,方便用ethereal(即wireshark)分析
tcpdump -r tcpdump.cap # 使用-r 参数查看保存文件数据
实战例子
先看下面一个比较常见的部署方式,在服务器上部署了nodejs server
,监听3000
端口。nginx反向代理监听80端口,并将请求转发给nodejs server(127.0.0.1:3000)。
浏览器 -> nginx反向代理 -> nodejs server
问题:假设用户(183.14.132.117)访问浏览器,发现请求没有返回,该怎么排查呢?
步骤一:查看请求是否到达nodejs server -> 可通过日志查看。
步骤二:查看nginx是否将请求转发给nodejs server。
tcpdump port 8383
复制代码这时你会发现没有任何输出,即使nodejs server已经收到了请求。因为nginx转发到的地址是127.0.0.1,用的不是默认的interface,此时需要显示指定interface
tcpdump port 8383 -i lo
复制代码备注:配置nginx,让nginx带上请求侧的host,不然nodejs server无法获取 src host,也就是说,下面的监听是无效的,因为此时对于nodejs server来说,src host 都是 127.0.0.1
tcpdump port 8383 -i lo and src host 183.14.132.117
复制代码步骤三:查看请求是否达到服务器
tcpdump -n tcp port 8383 -i lo and src host 183.14.132.117