Linux Tcpdump抓包入门

Linux Tcpdump抓包入门
一、Tcpdump简介

tcpdump 是一个在Linux系统上用于网络分析和抓包的强大工具。它能够捕获网络数据包并提供详细的分析信息,有助于网络管理员和开发人员诊断网络问题和监控网络流量。

  1. 安装部署

    # 在Debian/Ubuntu上安装
    sudo apt-get install tcpdump# 在CentOS/RHEL上安装
    sudo yum install tcpdump
    
  2. 底层原理

    在这里插入图片描述

    1、tcpdump由C语言开发,主要功能通过libpcap库实现,而libpcap是linux平台下的一个网络数据包捕获功能包, 通过内核BPF技术实现数据过滤功能。tcpdump使用BPF虚拟机的指令集定义过滤器表达式,然后传递给内核,并由解释器执行,这使得包过滤可以在内核中进行,避免了向用户态进程复制全部数据包,从而提升数据包的过滤性能。tcpdump将包过滤指令注入到内核,返回按条件过滤的数据包,提供多种输出功能将抓取的报文格式化处理能力。
    2、tcpdump的包过滤指令由BPF代码实现,通过对libpcap库的调用可以把一个输入输出的逻辑表达式变为BPF代码,实现在用户输入的命令行和BPF代码之间的转换。tcpdump 程序支持使用 -d参数来 dump 出过滤规则转化后的BPF指令字节码。
    3、应用在接收报文的时候,硬件的硬中断首先触发内核的软中断,通过内核驱动程序进入网络设备层进行数据包的处理,然后数据包进入协议栈的网络层和传输层,最后被用户进程接收。而应用在发送报文时,首先经过内核的协议层,由邻居子系统实现L3层ip地址转化为L2层mac地址,然后进入网络设备层,数据包处理完成后,经驱动程序流转,最后由硬件将报文发出。tcpdump为了能抓取数据包,首先需要创建socket套接字,用于在应用系统接收和发送报文时获取抓取的数据包,然后将过滤条件也就是对应的BPF程序注入到内核网络设备层,获取过滤后的数据包后再进行格式化处理。
    

    在这里插入图片描述

  3. 其他

二、Tcpdump命令参数
  • 基本参数

    • 设置不解析域名提升速度

      -n:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
      -nn:不把协议和端口号转化成名字,速度也会快很多。
      -N:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’. 将抓取到的数据包保存为文件,可以借助wireshark进行分析
      
    • 从文件中读取包数据

      tcpdump icmp -r all.pcap
      
    • 输出控制参数-显示内容

      -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
      -vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。
      -vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
    • 输出控制参数-显示时间

      -t:在每行的输出中不输出时间
      -tt:在每行的输出中会输出时间戳
      -ttt:输出每两行打印的时间间隔(以毫秒为单位)
      -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
      
    • 输出控制参数-显示数据包头部

      -x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
      -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
      -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
      -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
      
    • 其他显示控制参数

      -i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any
      -Q:选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法
      -q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短
      -c : 捕获 count 个包 tcpdump 就退出
      -s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
      -S : 使用绝对序列号,而不是相对序列号
      -A : 显示格式为ASCII
      -C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=102410241,048,576)
      -F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.
      
  • 过滤参数

    • 指定ip地址过滤-host

      tcpdump host 192.168.10.100# 根据源ip进行过滤
      tcpdump -i eth2 src 192.168.10.100
      # 根据目标ip进行过滤
      tcpdump -i eth2 dst 192.168.10.200
    • 基于网段进行过滤:net

      tcpdump net 192.168.10.0/24# 根据源网段进行过滤
      tcpdump src net 192.168
      # 根据目标网段进行过滤
      tcpdump dst net 192.168
      
    • 基于端口进行过滤:port

      tcpdump port 8088
      # 根据源端口进行过滤
      tcpdump src port 8088# 根据目标端口进行过滤
      tcpdump dst port 8088#同时指定两个端口
      tcpdump port 80 or port 8088 #指定端口的范围
      tcpdump portrange 8000-8080
      tcpdump src portrange 8000-8080
      tcpdump dst portrange 8000-8080
      
    • 基于协议进行过滤:proto

      proto 后面跟的 的关键词是固定的,只能是 ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui 这里面的其中一个。

      tcpdump icmp#过滤IPV4数据包(友情提示:数字 6 表示的是 tcp 在ip报文中的编号。)
      tcpdump ip proto 6
      tcpdump ip protochain 6
      
    • 过滤条件基本语法

      • and:所有的条件都需要满足,也可以表示为 &&

      • or:只要有一个条件满足就可以,也可以表示为 ||

      • not:取反,也可以使用 !

      • =:判断二者相等

      • ==:判断二者相等

      • !=:判断二者不相等 tcpdump 还提供了一些关键字的接口来方便我们进行判断

      • if:表示网卡接口名、

      • proc:表示进程名

      • pid:表示进程 id

      • svc:表示 service class

      • dir:表示方向,in 和 out

      • eproc:表示 effective process name

      • epid:表示 effective process ID

        #过滤出源地址是1.1.1.1发往任意主机的3389端口的数据包
        tcpdump src 1.1.1.1 and dst port 3389#过滤出源地址是1.1.1.1发往任意主机的3389端口或者22端口的数据包
        tcpdump 'src 1.1.1.1 and (dst port 3389 or 22)'#过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"
        
    • 特殊过滤

      • 根据 tcpflags 进行过滤

        tcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0"
        
      • 基于包大小进行过滤

        tcpdump less 32 
        tcpdump greater 64 
        tcpdump <= 128
        
      • 根据 mac 地址进行过滤

        tcpdump ether host [ehost]
        tcpdump ether dst	[ehost]
        tcpdump ether src	[ehost]
        
      • 过滤广播/多播数据包

        tcpdump ether broadcast
        tcpdump ether multicasttcpdump ip broadcast
        tcpdump ip multicasttcpdump ip6 multicast
        
三、使用示例
  • 查看网卡ens33,端口9093,协议udp的流量信息,要求显示流量详情

    tcpdump udp -i ens33 port 9093 -XX -vvv -nn 
    
  • HTTP 请求头中提取 HTTP 的 User-Agent

    tcpdump -nn -A -s1500 -l | grep "User-Agent:"
    
  • 抓取 HTTP GET 请求包

    tcpdump -vvAls0 | grep 'GET'
    
  • 提取 HTTP 请求的主机名和路径

    tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
    
  • 将抓包信息保存到文件

     tcpdump -i eth0 -s 0 -n -w capture.pcap
    
  • 分别抓取所有tcp、udp、icmp流量

    sudo tcpdump -i eth0 -s 0 -n 'tcp'
    sudo tcpdump -i eth0 -s 0 -n 'udp
    sudo tcpdump -i eth0 -s 0 -n 'icmp'
    
  • 仅显示HTTP请求和响应的头信息:

    sudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[13] & 8!=0)'
    
  • 抓取指定主机(例如192.168.1.100)的HTTP流量,并保存到文件:

    tcpdump -i eth0 -s 0 -w http_traffic.pcap 'tcp and host 192.168.1.100 and (port 80 or port 443)'
    
四、参考资料
  • https://mp.weixin.qq.com/s/JouI946715kngfve0rzztw

  • https://mp.weixin.qq.com/s/KYkJjPkKvOvt8jXQFwtkXg

  • tcp flags通信标识

    Flags 标识符
    [S] : SYN(开始连接)
    [P] : PSH(推送数据)
    [F] : FIN (结束连接)
    [R] : RST(重置连接)
    [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)
    
  • 官方连接

    • https://www.tcpdump.org/manpages/tcpdump.1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络编程:UDP通信篇

目录 UDP协议 Java中的UDP通信 DatagramSocket DatagramPacket UDP客户端-服务端代码实现 UDP协议 对于UDP协议,这里简单做一下介绍: 在TCP/IP协议簇中,用户数据报协议(UDP)是传输层的一个主要协议之一&#xf…

3.Spring Cloud LoadBalancer 入门与使用

3.Spring Cloud LoadBalancer 入门与使用 1.什么是 LoadBalancer?1.1负载均衡分类1.2 常见负载均衡策略 2.为什么要学 LoadBalancer?3.如何使用?4.默认负载均衡策略5.随机负载均策略5.1 创建随机负载均衡器5.2 设置随机负载均衡器 (局部设置)5.3 设置全局负载均衡器 6.Nacos…

基础—SQL—DML(数据操作语言)修改和删除

一、引言 接着上次博客,这次讲解DML语句中的修改数据和删除数据操作。 二、DML—修改数据 UPDATE 表名 SET 字段名1值1 ,字段名2值2 , ...[ WHERE 条件]; 注意:修改语句的条件可以有,也可以没有。如果没有条件,则会修改整张表的…

为什么就是不显示呢?

为了练习JavaScript中函数的使用方法&#xff0c;写了下面的关于Date&#xff08;&#xff09;函数的使用&#xff0c;奇怪的是&#xff0c;网页中就是不显示相关内容&#xff0c;为什么呢&#xff1f;&#xff1f;&#xff1f; <!DOCTYPE html> <html lang"en&…

【更新】一次“问题反馈”,下定决心做了多约束多目标智能算法的“模板”

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 关注该代码的同学应该清楚&#xff0c;这个代码已经免费更新了两版了&#xff0c;修复和增加了一些约束内容&#xff0c;本次增加蓄电池初始时刻和终止时刻容量一致约束&#xff0c;可别小瞧这么简单的增加约…

工控一体机10.1寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用

深入理解深度学习中的激活层&#xff1a;Sigmoid和Softmax作为非终结层的应用Sigmoid 和 Softmax 激活函数简介Sigmoid函数Softmax函数 Sigmoid 和 Softmax 作为非终结层多任务学习特征变换增加网络的非线性实际案例 注意事项结论 深入理解深度学习中的激活层&#xff1a;Sigmo…

【Python】 深入理解 Python 包管理器:pip vs conda

基本原理 在Python编程世界中&#xff0c;包管理器是一个不可或缺的工具。它帮助开发者安装、更新和管理Python库。目前&#xff0c;最流行的两个包管理器是pip和conda。了解它们之间的区别&#xff0c;对于Python开发者来说至关重要。 pip pip是Python的官方包管理器&#…

智慧农田视频监控技术应用:智能监管引领农业新时代

据新闻报道&#xff0c;5月24日合肥市公安局接到群众报警&#xff0c;反映自己辛苦种植的小麦有几十亩地被人偷偷用收割机盗割。公安机关迅速出警并立案侦查&#xff0c;通过查看监控视频得知&#xff0c;用户所在的公司租用了几千亩土地进行农业种植&#xff0c;因公司与村民之…

【C语言】9.C语言函数栈帧的创建和销毁

C语言函数栈帧的创建和销毁 看完本文你能了解什么? 局部变量是怎么创建的&#xff1f;为什么局部变量的值是随机值&#xff1f;函数是怎么传参的&#xff1f;传参的顺序是怎么样的&#xff1f;实参和形参是什么关系&#xff1f;函数调用是怎么做的&#xff1f;函数调用结束后怎…

LeetCode hot100-57-G

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。不会&#xff0c;放IDEA里执行了一下大概理解了流程 …

深圳比创达电子|EMC与EMI滤波器:电子设备的“电磁防护罩”

在电子科技日新月异的今天&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题越来越受到工程师和技术人员的关注。其中&#xff0c;电磁干扰&#xff08;EMI&#xff09;和电磁干扰抑制&#xff08;即EMI滤波器&#xff09;是实现良好EMC性能的关键技术之一。 一、EMC与E…

KineFX —— 简介

KineFX是绑定和动画的框架和工具集&#xff0c;可在SOP级别创建和编辑角色&#xff1b;可从头创建自己的KineFX角色&#xff0c;或使用特定的KineFX SOP和常规的SOP去编辑导入的角色和动画&#xff1b; 程序化绑定 KineFX构建与程序化绑定的原则上&#xff0c;可快速非破坏性迭…

AI绘画Stable Diffusion【艺术写真】:蒙版法图生图,局部重绘实现AI艺术写真

大家好&#xff0c;我是设计师阿威 之前我分享过几篇使用SD插件换脸方式实现AI写真的教程&#xff0c;主要存在2个大的问题。 &#xff08;1&#xff09;人脸相似度 &#xff08;2&#xff09;生成的图片整体色调有时候会比较怪异 对于上面的问题&#xff0c;在对图片质量要…

每天写两道(二)LRU缓存、数组中最大的第k个元素

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

多线程新手村3--多线程代码案例

1.1 单例模式 单例模式是设计模式中非常经典的一种。那么有同学肯定就会好奇了&#xff0c;什么是设计模式呢&#xff1f; 设计模式简单的说就是程序员的“棋谱”&#xff0c;我们下象棋时肯定或多或少都背过棋谱&#xff0c;例如当头炮、马后炮等&#xff0c;设计模式也是这…

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后&#xff0c;我们面临着一项关键任务&#xff1a;确保其在高压环境下稳定运行。于是&#xff0c;我们启动了一轮针对该接口的性能压力测试&#xff0c;利用JMeter工具模拟高负载场景。然而&#xff0c;在测试进行约一分钟之后&#xff0c;频繁出现了…

剧本杀小程序开发,探索市场发展新的商业机遇

剧本杀游戏作为一个新兴行业&#xff0c;经历了爆发式的增长&#xff0c;剧本杀游戏在市场中的热度不断升高。 不过&#xff0c;在市场的火热下&#xff0c;竞争也在逐渐加大。因此&#xff0c;在市场竞争下&#xff0c;成本低、主题多样、有趣的线上剧本杀小程序成为了创业者…

竹云董事长在第二届ICT技术发展与企业数字化转型高峰论坛作主题演讲

5月25日&#xff0c;由中国服务贸易协会指导&#xff0c;中国服务贸易协会信息技术服务委员会主办的 “第二届ICT技术发展与企业数字化转型高峰论坛” 在北京隆重召开。 本次论坛以 “数据驱动&#xff0c;AI引领&#xff0c;打造新质生产力” 为主题&#xff0c;特邀业内200余…