文章目录

  • what
  • 网络包接收过程
  • 网络包发送过程
  • 工作原理
  • 基础用法
    • 不加任何参数,默认情况下将抓取第一个非 lo 网卡上所有的数据包
    • 抓取 eth0 网卡上的所有数据包
    • 抓包时指定 -n 选项,不解析主机和端口名。
    • 抓取指定主机 192.168.1.100 的所有数据包
    • 抓取指定主机 10.1.1.2 发送的数据包
    • 抓取发送给 10.1.1.2 的所有数据包
    • 抓取 eth0 网卡上发往指定主机的数据包,抓到 10 个包就停止
    • 抓取 eth0 网卡上所有 SSH 请求数据包,SSH 默认端口是 22
    • 抓取 eth0 网卡上 5 个 ping 数据包
    • 抓取 eth0 网卡上所有的 arp 数据包
    • 使用十六进制输出,当你想检查数据包内容是否有问题时,十六进制输出会很有帮助。
    • 只抓取 eth0 网卡上 IPv6 的流量
    • 抓取指定端口范围的流量
    • 抓取指定网段的流量
  • 高级进阶
    • 抓取指定客户端访问 ssh 的数据包
    • 抓取从某个网段来,到某个网段去的流量
    • 抓取来自某个主机,发往非 ssh 端口的流量
    • 当构建复杂查询的时候,你可能需要使用引号,单引号告诉 tcpdump 忽略特定的特殊字符,这里的 () 就是特殊符号,如果不用引号的话,就需要使用转义字符
    • 基于包大小进行筛选,如果你正在查看特定的包大小,可以使用这个参数
    • 过滤 TCP 特殊标记的数据包
    • 抓取所有非 ping 类型的 ICMP 包
    • 抓取端口是 80,网络层协议为 IPv4, 并且含有数据,而不是 SYN、FIN 以及 ACK 等不含数据的数据包
    • 抓取 HTTP 报文,0x4754 是 GET 前两字符的值,0x4854 是 HTTP 前两个字符的值
  • 常用选项
    • (一)基础选项
    • (二)输出选项
  • 过滤表达式
  • netfilter 过滤的包 tcpdump是否可以抓的到


what

tcpdump 网络工具, 通常用于故障诊断、网络分析 ,甩锅必备, 那还等什么


网络包接收过程


在接收包的过程中,数据包是先经过网络设备层然后才到协议层的。


假如我们设置了 netfilter 规则,在接收包的过程中,工作在网络设备层的 tcpdump 先开始工作。还没等 netfilter 过滤,tcpdump 就抓到包了!

所以,在接收包的过程中,netfilter 过滤并不会影响 tcpdump 的抓包!


网络包发送过程

在网络包的发送过程中,和接收过程恰好相反,是协议层先处理、网络设备层后处理。

如果 netfilter 设置了过滤规则,那么在协议层就直接过滤掉了。在下层网络设备层工作的 tcpdump 将无法再捕获到该网络包。


工作原理

tcpdump 是 Linux 系统中非常有用的网络工具,运行在用户态,本质上是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能.

用户态 tcpdump 命令是通过 socket 系统调用,在内核源码中用到的 ptype_all 中挂载了函数钩子上去。无论是在网络包接收过程中,还是在发送过程中,都会在网络设备层遍历 ptype_all 中的协议,并执行其中的回调。tcpdump 命令就是基于这个底层原理来工作的。

通过上图我们可以发现当数据包到达网卡后,经过数据包过滤器(BPF)筛选后,拷贝至用户态的 tcpdump 程序,以供 tcpdump 工具进行后续的处理工作,输出或保存到 pcap 文件。

数据包过滤器(BPF)主要作用,就是根据用户输入的过滤规则,只将用户关心的数据包拷贝至 tcpdump,这样能够减少不必要的数据包拷贝,降低抓包带来的性能损耗。


基础用法

不加任何参数,默认情况下将抓取第一个非 lo 网卡上所有的数据包

[root@VM-0-7-centos ~]# tcpdump

抓取 eth0 网卡上的所有数据包

[root@VM-0-7-centos ~]# tcpdump  -i eth0

抓包时指定 -n 选项,不解析主机和端口名。

这个参数很关键,会影响抓包的性能,一般抓包时都需要指定该选项。

[root@VM-0-7-centos ~]#  tcpdump -n -i eth0

抓取指定主机 192.168.1.100 的所有数据包

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 host 192.168.1.100

抓取指定主机 10.1.1.2 发送的数据包

[root@VM-0-7-centos ~]# tcpdump -ni eth0 src host 10.1.1.2

抓取发送给 10.1.1.2 的所有数据包

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 dst host 10.1.1.2

抓取 eth0 网卡上发往指定主机的数据包,抓到 10 个包就停止

这个参数也比较常用

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 -c 10 dst host 192.168.1.200

抓取 eth0 网卡上所有 SSH 请求数据包,SSH 默认端口是 22

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 dst port 22

抓取 eth0 网卡上 5 个 ping 数据包

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 -c 5 icmp

抓取 eth0 网卡上所有的 arp 数据包

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 arp

使用十六进制输出,当你想检查数据包内容是否有问题时,十六进制输出会很有帮助。

[root@VM-0-7-centos ~]#  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            _.........\.

只抓取 eth0 网卡上 IPv6 的流量

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 ip6

抓取指定端口范围的流量

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 portrange 80-9000

抓取指定网段的流量

[root@VM-0-7-centos ~]#  tcpdump -ni eth0 net 192.168.1.0/24

高级进阶

tcpdump 强大的功能和灵活的策略,主要体现在过滤器(BPF)强大的表达式组合能力。

抓取指定客户端访问 ssh 的数据包

$ tcpdump -ni eth0 src 192.168.1.100 and dst port 22

抓取从某个网段来,到某个网段去的流量

$ tcpdump -ni eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

抓取来自某个主机,发往非 ssh 端口的流量

$ tcpdump -ni eth0 src 10.0.2.4 and not dst port 22

当构建复杂查询的时候,你可能需要使用引号,单引号告诉 tcpdump 忽略特定的特殊字符,这里的 () 就是特殊符号,如果不用引号的话,就需要使用转义字符

$ tcpdump -ni eth0 'src 10.0.2.4 and (dst port 3389 or 22)'

基于包大小进行筛选,如果你正在查看特定的包大小,可以使用这个参数

小于等于 64 字节:

$ tcpdump -ni less 64

大于等于 64 字节:

$ tcpdump -ni eth0 greater 64

等于 64 字节:

$ tcpdump -ni eth0 length == 64

过滤 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'

抓取所有非 ping 类型的 ICMP 包

$ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

抓取端口是 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 协议

抓取 HTTP 报文,0x4754 是 GET 前两字符的值,0x4854 是 HTTP 前两个字符的值

$ tcpdump  -ni eth0 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854'

常用选项

(一)基础选项

-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:表示非操作


netfilter 过滤的包 tcpdump是否可以抓的到

关于这个问题,得分接收和发送过程分别来看。

在网络包接收的过程中,由于 tcpdump 近水楼台,所以完全可以捕获到命中 netfilter 过滤规则的包。

但是在发送的过程中,恰恰相反。网络包先经过协议层,这时候被 netfilter 过滤掉的话,底层工作的 tcpdump 还没等看见就啥也没了。

每日一博 - tcpdump小技巧相关推荐

  1. 每日一个 ChatGPT 使用小技巧系列之2 - 用 ChatGPT 研读 SAP ABAP BAPI 的实现源代码

    本系列之前的文章: 与其整天担心 AI 会取代程序员,不如先让 AI 帮助自己变得更强大 每日一个 ChatGPT 使用小技巧系列之1 - 给出提纲或者素材,让 ChatGPT 帮你写作 正好昨天有朋 ...

  2. 写博客小技巧推荐(有简易版动图教程)

    文章目录 颜色 表情 背景 插入图片 思维导图 数学公式 动图 。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚ 事先说明:这篇博客不太适合刚接触markdown的新手. 基础的用法不会提到,本文篇幅也不会长, ...

  3. 每天5个Python小技巧(day1)

    每日5个Python小技巧-day1 1. 断言assert (1)用法 assert expression, 'message' ​ 当expression语句不满足的时候会raise一个Asser ...

  4. 【小技巧】当你在写博客时突然误删或覆盖原文时怎么办?

    写了几个小时的博文,一朝回到解放前,心里苦啊,找了点资料知道了这个小技巧,因为之前博主的有点旧了,现在我再重新完善一下,之前的方法参考自https://blog.csdn.net/wwlcsdn000 ...

  5. 玩转博客园的5个小技巧

    转载自:http://www.cnblogs.com/lloydsheng/archive/2010/05/17/1737267.html 写博客也有几年了,现在能找到的第一篇博文发布时间是2007年 ...

  6. 每日小技巧——教你用一行Python代码去除照片背景

    哈喽~大家好,我是恰恰!欢迎来到周一的每日小技巧,今天来教大家如何使用Python去除照片背景,说到去除照片背景的方法,可能不会Python的小伙伴首先想到的是美图秀秀,或者使用photoshop,也 ...

  7. 坚果云 android 操作历史,#坚果云每日小技巧分享# 你也该学会使用文件历史版本了...

    原标题:#坚果云每日小技巧分享# 你也该学会使用文件历史版本了 文件历史版本是坚果云一直重点推荐的内容,很多人虽然没有使用过或者极少使用过,但是你一旦有了使用它的机会你就会发现文件历史版本功能可以帮助 ...

  8. 坚果云同步linux,#坚果云每日小技巧分享# 你们要的“选择性同步”越狱啦!

    原标题:#坚果云每日小技巧分享# 你们要的"选择性同步"越狱啦! 自从坚果云同步盘推出云桥模式之后,选择性同步被我们的产品经理关进了大牢,这让我们很多选择性同步的用户感到不适应,并 ...

  9. 坚果云与服务器同步数据,#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据?...

    原标题:#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据? 我们有很多用户利用坚果云在服务器之间同步数据,因为数据格式原因,出现了不少问题,影响用户体验. 其实,微软本身就推出了robo ...

最新文章

  1. Boosting、Adaboost、AdaBoost模型的优缺点、提升树、梯度提升树GBDT
  2. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
  3. 《漫画算法2》源码整理-9 股票交易最大收益
  4. 聚类算法(五)--层次聚类(系统聚类)及超易懂实例分析
  5. [Python人工智能] 五.theano实现神经网络正规化Regularization处理
  6. Vue2+WebPack2使用css/sass+postcss的autoprefixer
  7. mongodb副本集修改配置问题
  8. cf黑机器多久解除_“黑电镀厂”偷排工业废水被捣毁,老板被警方刑拘
  9. OpenCV for Android开发环境Win7平台搭建(转)
  10. Unity Camera
  11. c语言三个矩阵乘法,c语言矩阵相乘
  12. SecureCRT 64位 破解版v8.1.4及安装
  13. android怎么监听多点触摸_Android笔记:触摸事件的分析与总结----多点触控
  14. git rebase 命令 常用_git命令之git rebase 的用法
  15. Android Verified Boot dm-verity 优化和实战2
  16. 《自控力》读书笔记及实践
  17. USB摄像头驱动分析
  18. 大数据与云计算学习:Python网络数据采集
  19. php插入数据含有特殊符号的处理方法
  20. AI顶会ACL发榜,腾讯30篇论文入选

热门文章

  1. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量
  2. linux系统硬盘坏道,如何在 Linux 系统下检测硬盘上的坏道和坏块
  3. 如何判断强化学习训练是否在收敛?
  4. 在 tensorflow 和numpy 中矩阵的加法
  5. pyspark 连接mysql
  6. pyspark DataFrame 转RDD
  7. elasticsearch最大节点数_Elasticsearch选举原理之Bully算法
  8. Leetcode 67. 二进制求和 (每日一题 20210826)
  9. NTU 课程: MAS714(3) DFS BFS(搜索算法)
  10. LeetCode-二叉树-144. 二叉树的前序遍历