运维之道 | tcpdump抓包工具

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

如果不指定srcdst,那么来源或者目标是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.11192.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章