tcpdump实战详解
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 280x0000: 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
【文章福利】需要学习资料扫描文章最后的二维码(资料包括C/C++,Linux,,Nginx,ZeroMQ,MySQL,Redis,,MongoDB,ZK,K8S,Docker,TCP/IP,协程,DPDK,等)
实战:高级进阶
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实战详解相关推荐
- 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例
本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...
- R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等
R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录
- R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- R语言tidyr包separate()函数实战详解:一列裂变为多列
R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列
- 《oracle大型数据库系统在AIX/unix上的实战详解》讨论31: oracle、sybase 数据库的不同访问...
<Oracle大型数据库系统在AIX/UNIX上的实战详解> 讨论31: oracle.sybase 数据库的不同访问方式 文平. 用户来信要求更细节比较一下Oracle和sybas ...
- 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...
最新文章
- Django视图层总结
- 常见数据结构与算法:拆分数字(暴力递归,动态规划)
- dw网页设计期末设计一个网页_制作网站与设计网页可以用什么软件?
- 北京林业大学c语言题库,2016年北京林业大学信息学院数据结构考研复试题库
- orm2 中文文档 5. 同步和删除模型
- Steam游戏Hacknet部分命令备份
- Moto X的谷歌基因
- Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp
- java数组使用实验报告_Java实验报告二数组.doc
- ansys命令流——坐标系与工作平面(基础操作)
- Linux下基于LDAP统一用户认证的研究
- 用 Python 实现电影订票系统 | 内附源码
- 泰坦尼克号幸存者预测
- RecyclerView系列:GridLayoutManager的构造函数中的orientation理解
- DHCP server和DHCP relay配置
- laravel 分页样式
- 从删库到跑路,论运维的自我修养
- 2012版辅助开发工具包(ADT)新功能特性介绍及安装使用
- OpenCV 微信QRCode二维码
- 已解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart. Verify that you have su
热门文章
- 强迫症告辞!三星Galaxy S11这“凌乱”的后置5摄,感受下
- 苹果被咬一大口!高通获得45亿美元和解金 下一个目标是华为?
- 新iPhone销量将持续走低 因为旧iPhone够用好几年
- 支持向量回归预测怎么做_机器学习如何在油气开发预测中发挥作用?
- python读什么文件最快的软件_这些方法,能够让你的 Python 程序快如闪电
- mysql sql 一部分记录_MySQL性能优化实践(很全面,值得收藏)
- rtp发送h264和h265
- 李迟2022年2月知识总结
- 我的内核学习笔记7:Intel LPC驱动lpc_ich分析
- 常遇问题及一些可能的解决方案