最近工作上有用到tcpdump的一个抓包工具,所以记录一下:

应用场景

在日常工作中遇到的很多网络问题都可以通过 tcpdump 优雅的解决:

  1. 相信大多数同学都遇到过 SSH 连接服务器缓慢,通过 tcpdump 抓包,可以快速定位到具体原因,一般都是因为 DNS 解析速度太慢。
  2. 当我们工程师与用户面对网络问题争执不下时,通过 tcpdump 抓包,可以快速定位故障原因,轻松甩锅,毫无压力。
  3. 当我们新开发的网络程序,没有按照预期工作时,通过 tcpdump 收集相关数据包,从包层面分析具体原因,让问题迎刃而解。
  4. 当我们的网络程序性能比较低时,通过 tcpdump 分析数据流特征,结合相关协议来进行网络参数优化,提高系统网络性能。
  5. 当我们学习网络协议时,通过 tcpdump 抓包,分析协议格式,帮助我们更直观、有效、快速的学习网络协议。
    上述只是简单罗列几种常见的应用场景,而 tcpdump 在网络诊断、网络优化、协议学习方面,确实是一款非常强大的网络工具,只要存在网络问题的地方,总能看到它的身影。
    熟练的运用 tcpdump,可以帮助我们解决工作中各种网络问题,下边我们先简单学习下它的工作原理。
    工作原理

tcpdump 是 Linux 系统中非常有用的网络工具,运行在用户态,本质上是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能。
图片
通过上图,我们可以很直观的看到,数据包到达网卡后,经过数据包过滤器(BPF)筛选后,拷贝至用户态的 tcpdump 程序,以供 tcpdump 工具进行后续的处理工作,输出或保存到 pcap 文件。
数据包过滤器(BPF)主要作用,就是根据用户输入的过滤规则,只将用户关心的数据包拷贝至 tcpdump,这样能够减少不必要的数据包拷贝,降低抓包带来的性能损耗。
思考:这里分享一个真实的面试题
面试官:如果某些数据包被 iptables 封禁,是否可以通过 tcpdump 抓到包?
通过上图,我们可以很轻易的回答此问题。
因为 Linux 系统中 netfilter 是工作在协议栈阶段的,tcpdump 的过滤器(BPF)工作位置在协议栈之前,所以当然是可以抓到包了!
我们理解了 tcpdump 基本原理之后,下边直接进入实战!
实战:基础用法

我们先通过几个简单的示例来介绍 tcpdump 基本用法。

  1. 不加任何参数,默认情况下将抓取第一个非 lo 网卡上所有的数据包
    $ tcpdump
  2. 抓取 eth0 网卡上的所有数据包
    $ tcpdump -i eth0
  3. 抓包时指定 -n 选项,不解析主机和端口名。这个参数很关键,会影响抓包的性能,一般抓包时都需要指定该选项。
    $ tcpdump -n -i eth0
  4. 抓取指定主机 192.168.1.100 的所有数据包
    $ tcpdump -ni eth0 host 192.168.1.100
  5. 抓取指定主机 10.1.1.2 发送的数据包
    $ tcpdump -ni eth0 src host 10.1.1.2
  6. 抓取发送给 10.1.1.2 的所有数据包
    $ tcpdump -ni eth0 dst host 10.1.1.2
  7. 抓取 eth0 网卡上发往指定主机的数据包,抓到 10 个包就停止,这个参数也比较常用
    $ tcpdump -ni eth0 -c 10 dst host 192.168.1.200
  8. 抓取 eth0 网卡上所有 SSH 请求数据包,SSH 默认端口是 22
    $ tcpdump -ni eth0 dst port 22
  9. 抓取 eth0 网卡上 5 个 ping 数据包
    $ tcpdump -ni eth0 -c 5 icmp
  10. 抓取 eth0 网卡上所有的 arp 数据包
    $ tcpdump -ni eth0 arp
  11. 使用十六进制输出,当你想检查数据包内容是否有问题时,十六进制输出会很有帮助。
    $ tcpdump -ni eth0 -c 1 arp -X
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    12:13:31.602995 ARP, Request who-has 172.17.92.133 tell 172.17.95.253, length 28
    0x0000: 0001 0800 0604 0001 eeff ffff ffff ac11 …
    0x0010: 5ffd 0000 0000 0000 ac11 5c85 _…
  12. 只抓取 eth0 网卡上 IPv6 的流量
    $ tcpdump -ni eth0 ip6
  13. 抓取指定端口范围的流量
    $ tcpdump -ni eth0 portrange 80-9000
  14. 抓取指定网段的流量
    $ tcpdump -ni eth0 net 192.168.1.0/24
    实战:高级进阶

tcpdump 强大的功能和灵活的策略,主要体现在过滤器(BPF)强大的表达式组合能力。
本节主要分享一些常见的所谓高级用法,希望读者能够举一反三,根据自己实际需求,来灵活使用它。

  1. 抓取指定客户端访问 ssh 的数据包
    $ tcpdump -ni eth0 src 192.168.1.100 and dst port 22
  2. 抓取从某个网段来,到某个网段去的流量
    $ tcpdump -ni eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
  3. 抓取来自某个主机,发往非 ssh 端口的流量
    $ tcpdump -ni eth0 src 10.0.2.4 and not dst port 22
  4. 当构建复杂查询的时候,你可能需要使用引号,单引号告诉 tcpdump 忽略特定的特殊字符,这里的 () 就是特殊符号,如果不用引号的话,就需要使用转义字符
    $ tcpdump -ni eth0 'src 10.0.2.4 and (dst port 3389 or 22)'
  5. 基于包大小进行筛选,如果你正在查看特定的包大小,可以使用这个参数
    小于等于 64 字节:
    $ tcpdump -ni less 64
    大于等于 64 字节:
    $ tcpdump -ni eth0 greater 64
    等于 64 字节:
    $ tcpdump -ni eth0 length == 64
  6. 过滤 TCP 特殊标记的数据包
    抓取某主机发送的 RST 数据包:
    $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-rst) != 0’
    抓取某主机发送的 SYN 数据包:
    $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-syn) != 0’
    抓取某主机发送的 FIN 数据包:
    $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-fin) != 0’
    抓取 TCP 连接中的 SYN 或 FIN 包
    $ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0’
  7. 抓取所有非 ping 类型的 ICMP 包
    $ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’
  8. 抓取端口是 80,网络层协议为 IPv4, 并且含有数据,而不是 SYN、FIN 以及 ACK 等不含数据的数据包
    $ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    解释一下这个复杂的表达式,具体含义就是,整个 IP 数据包长度减去 IP 头长度,再减去 TCP 头的长度,结果不为 0,就表示数据包有 data,如果还不是很理解,需要自行补一下 tcp/ip 协议
  9. 抓取 HTTP 报文,0x4754 是 GET 前两字符的值,0x4854 是 HTTP 前两个字符的值
    $ tcpdump -ni eth0 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854’
    常用选项

通过上述的实战案例,相信大家已经掌握的 tcpdump 基本用法,在这里来详细总结一下常用的选项参数。
(一)基础选项
-i:指定接口
-D:列出可用于抓包的接口
-s:指定数据包抓取的长度
-c:指定要抓取的数据包的数量
-w:将抓包数据保存在文件中
-r:从文件中读取数据
-C:指定文件大小,与 -w 配合使用
-F:从文件中读取抓包的表达式
-n:不解析主机和端口号,这个参数很重要,一般都需要加上
-P:指定要抓取的包是流入还是流出的包,可以指定的值 in、out、inout
(二)输出选项
-e:输出信息中包含数据链路层头部信息
-t:显示时间戳,tttt 显示更详细的时间
-X:显示十六进制格式
-v:显示详细的报文信息,尝试 -vvv,v 越多显示越详细
过滤表达式

tcpdump 强大的功能和灵活的策略,主要体现在过滤器(BPF)强大的表达式组合能力。
(一)操作对象
表达式中可以操作的对象有如下几种:
type,表示对象的类型,比如:host、net、port、portrange,如果不指定 type 的话,默认是 host
dir:表示传输的方向,可取的方式为:src、dst。
proto:表示协议,可选的协议有:ether、ip、ip6、arp、icmp、tcp、udp。
(二)条件组合
表达对象之间还可以通过关键字 and、or、not 进行连接,组成功能更强大的表达式。
or:表示或操作
and:表示与操作
not:表示非操作
建议看到这里后,再回头去看实战篇章的示例,相信必定会有更深的理解。如果是这样,那就达到了我预期的效果了!
经验

到这里就不再加新知识点了,分享一些工作中总结的经验:

  1. 我们要知道 tcpdump 不是万能药,并不能解决所有的网络问题。
  2. 在高流量场景下,抓包可能会影响系统性能,如果是在生产环境,请谨慎使用!
  3. 在高流量场景下,tcpdump 并不适合做流量统计,如果需要,可以使用交换机镜像的方式去分析统计。
  4. 在 Linux 上使用 tcpdump 抓包,结合 wireshark 工具进行数据分析,能事半功倍。
  5. 抓包时,尽可能不要使用 any 接口来抓包。
  6. 抓包时,尽可能指定详细的数据包过滤表达式,减少无用数据包的拷贝。
  7. 抓包时,尽量指定 -n 选项,减少解析主机和端口带来的性能开销。
    最后

通过上述内容,我们知道 tcpdump 是一款功能强大的故障诊断、网络分析工具。在我们的日常工作中,遇到的网络问题总是能够通过 tcpdump 来解决。
不过 tcpdump 相对于其它 Linux 命令来说,会复杂很多,但鉴于它强大功能的诱惑力,我们多花一些时间是值得的。要想很好地掌握 tcpdump,需要对网络报文(TCP/IP协议)有一定的了解。
当然,对于简单的使用来说,只要有网络基础概念就行,掌握了 tcpdump 常用方法,就足以应付工作中大部分网络相关的疑难杂症了。

抓包tcpdump,看这一篇足够了相关推荐

  1. 头疼Android APP 抓包?看这一篇就够了!(不是)

    目录 0.前言 1.归因 2.抓不到 2.1 路由重定向+透明代理 2.2 强制全局代理 2.3 VPN 3.抓到了,然后呢? 3.1 系统校验证书 3.2 App自校验证书 3.3 双向校验 4.其 ...

  2. 服务器专栏——服务器抓包-tcpdump抓包

    文章目录 1.确认服务器网卡有IP地址: 2.服务器抓包-tcpdump抓包命令 1.确认服务器网卡有IP地址: linux系统:ifconfig,查看网卡ip 1.如果网卡没有ip则不能使用含有此网 ...

  3. Linux日常运维管理技巧(一)监控系统状态、监控网卡流量、监控IO性能、查看系统进程、查看网络状态、Linux下抓包tcpdump、Linux网络相关、DNS配置

    目录 监控系统状态 监控网卡流量 监控IO性能 查看系统进程 查看网络状态 Linux下抓包 Linux网络相关 监控系统状态 w/uptime查看系统负载 [root@zyshanlinux-01 ...

  4. Linux统计进程网络,查看磁盘io、内存free、系统进程ps、网络状态netstat、Linux抓包tcpdump...

    查看磁盘io性能状态 iostat -x 查看磁盘使用(安装包与sar的安装包一起) 主要查看%util [root@shu-test ~]# iostat -x Linux 3.10.0-693.e ...

  5. linux udp 端口 抓包,tcpdump之UDP抓包

    摘要 使用tcpdump抓UDP包,过滤过滤IP和port,并且自动拆分片段. 安装tcpdump yum install -y tcpdump 使用方法 tcpdump -i bond0 udp p ...

  6. 【网络】抓包tcpdump

    tcpdump 参数 -a:将网络地址和广播地址转变成名字: -d:将匹配信息包的代码以人们能够理解的汇编格式给出: -dd:将匹配信息包的代码以c语言程序段的格式给出: -ddd:将匹配信息包的代码 ...

  7. Fiddler抓包1-查看get与post请求

    转载:https://www.cnblogs.com/yoyoketang/p/6719717.html 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出哪些是get,哪 ...

  8. linux监控某个端口流量抓包,tcpdump命令 – 监听网络流量

    tcpdump命令是一款sniffer工具,是linux上的抓包工具,嗅探器:它可以打印出所有经过网络接口的数据包的头信息. tcpdump命令工作时先要把网卡的工作模式切换到混杂模式.所以tcpdu ...

  9. Android中利用手机抓包的方法,经典篇

    在移动逆向分析以及 App 开发的时候,总会需要对其网络行为进行监控测试,本文总结一些抓包思路,并对其使用方法进行实践 笔者认为在抓包界,Wireshark 应该算是综合排名第一的工具(其实 Wire ...

最新文章

  1. python数据结构与算法(二)
  2. [pytorch、学习] - 3.11 模型选择、欠拟合和过拟合
  3. iOS 两种易混淆的存储路径
  4. 再回首Java第二天
  5. js判断数组中重复元素并找出_javascript查找数组中重复元素的方法
  6. 从零开始的数模学习(7):插值方法(预测类模型)
  7. MAC下的SVN工具
  8. 2022茶艺师(中级)考试题及答案
  9. CSS 的相对单位 em 与 ex
  10. 语音计算机在线算使用方法,计算器在线计算
  11. 磕碰,擦伤了,紧急处理方法
  12. 查看当前python环境_python-环境
  13. AspCms程序PC端生成静态,手机端动态运行
  14. 面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?
  15. Python requests模块高级用法
  16. ntp设置开机自启动后,重启没有起来问题
  17. 单片机/树莓派扩展双串口(TTL和RS485)
  18. UCOS/UCOSII基础知识
  19. 产品方法论—如何竞品分析
  20. 湖泊遥感研究进展(概述)

热门文章

  1. 移动硬盘(U盘)拒绝访问(无法双击打开)的解决方案 (转)
  2. 无盘服务器开机显示器无显示,电脑显示器无信号修复方法 | 专业网吧维护
  3. HTPC知识普及第四讲:解码需软硬兼施2
  4. 精选优美英文短文2——Here's to the Crazy Ones(致疯狂的人)
  5. Mathematica定义函数
  6. memset 用法 linux,bzero, memset ,setmem 区别
  7. 夹娃娃动画Android,手机模拟抓娃娃
  8. OpenCV 实现基于边界的模板匹配-适用部分覆盖和光照变化情况
  9. ATE 测试及IC测试原理之 IDD测试
  10. 如何快速区分空气盘和氦气盘?