Linux 网络分析必备技能:tcpdump 实战详解
大家好,我是肖邦,这是我的第 11 篇原创文章。

今天要分享的是 tcpdump,它是 Linux 系统中特别有用的网络工具,通常用于故障诊断、网络分析,功能非常的强大。
相对于其它 Linux 工具而言,tcpdump 是复杂的。当然我也不推荐你去学习它的全部,学以致用,能够解决工作中的问题才是关键。
本文会从应用场景和基础原理出发,提供丰富的实践案例,让你快速的掌握 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 的话,默认是 hostdir:表示传输的方向,可取的方式为: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 常用方法,就足以应付工作中大部分网络相关的疑难杂症了。
推荐阅读
推荐阅读:
写给 Linux 初学者的一封信 全网最详尽的负载均衡原理图解 上古神器 sed 教程详解,小白也能看的懂 Linux 三剑客之 grep 教程详解 Linux 文件搜索神器 find 实战详解,建议收藏!
本次分享就到这里了,谢谢大家的阅读,我是肖邦。关注我的公众号「编程修养」,大量的干货文章等你来!
公众号后台回复「1024」有惊喜!

欢迎各位老铁,加肖邦的个人微信,技术交流!!

Linux 网络分析必备技能:tcpdump 实战详解的更多相关文章
- linux抓包命令-tcpdump命令详解
最近调试支付接口的时候,遇到了一个奇怪的问题:我按照支付接口文档,对接支付通道,当消费业务正常后,调试查余和冲正的时候,支付通道的对接技术告诉我,系统没有我们支付系统的请求报文,数据库和日志中都没有, ...
- Linux 文件搜索神器 find 实战详解,建议收藏!
大家好,我是肖邦,这是我的第 10 篇原创文章. 在 Linux 系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过 200M 文件,查看近 7 天系统中哪些文件被修改过,找出所有子目录中的 ...
- Linux抓包工具tcpdump命令详解
1.简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中 ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
- Linux中用postfix搭建邮件服务器实战详解
Linux中用postfix搭建邮件服务器实战详解 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.Postfix试图更快.更容易管理.更安全,同时 ...
- Linux中Nginx安装与配置详解
转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- 《iOS 7 应用开发实战详解》
<iOS 7 应用开发实战详解> 基本信息 作者: 朱元波 管蕾 出版社:人民邮电出版社 ISBN:9787115343697 上架时间:2014-4-25 出版日期:2014 年5 ...
随机推荐
- nginx详解、反向代理、负载均衡和LNMP架构
资源池 nginx官方网站:http://nginx.org/ nginx官方文档:http://nginx.org/en/docs/ 本章资源: 点击这里 资源提取码:u2jv 1.nginx简介 ...
- MIT 6.S081 聊聊xv6中的文件系统(上)
前言 Lab一做一晚上,blog一写能写两天,比做Lab的时间还长( 这篇博文是半夜才写完的,本来打算写完后立刻发出来,但由于今天发现白天发博点击量会高点,就睡了一觉后才发(几十的点击量也是点击量啊T ...
- centos 7 部署nginx及libfastcommon
1.编译环境 (centos)yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib- ...
- JDK中jps、jinfo、jstat、jstack、jmap、jconsole等命令简介
JDK提供了几个很实用的工具,如下: jinfo:观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数,java class path等信息.命令格式:jinf ...
- HDU 6264 (深搜,数论)
题目链接 题意 求\(\sum_{d|n}\phi (d) \times {n\over d}\),其中\(\phi(n) = n\prod_{p|n}({1-{1\over p}})\) 分析 将\ ...
- c语言文件的读取和写入
文件打开类型: 文件打开输出就用: 1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp = NULL; 6 7 fp = fopen(&q ...
- Bone Collector II HDU - 2639 01背包第k最大值
题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...
- Linux 设置简单密码
centos: echo 密码 | passwd --stdin 用户名 ubuntu:(需先设置一个密码) sudo passwd username https://blog.csdn.net/mi ...
- 记一次基于springboot+aop实现日志记录实战
1. 为什么要记录日志 好处: a. 可以对一些重要功能进行记录,方便以后跟踪是谁操作此功能的. b. 在操作某些功能时可能会发生异常,但每次出现异常我们想定位日志都要去服务器查看我们的日志.有了日志 ...
- k8s二进制部署 - traefik安装
配置traefik资源清单rbac.yaml 配置traefik资源清单 rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: t ...