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 multicast
        
        tcpdump ip broadcast
        tcpdump ip multicast
        
        tcpdump 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Perfetto 解读一帧的生产消费流程 Android >= S Qualcomm

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 1.这个流程里面的东西如果展开其实是有很多的 内容其实还是比较浅显的 sf处就不贴源码了 关一个Vsync就有的解释 当然笔者在流程上先形成一个思维闭环 2.如有小伙伴需要 笔…

C++完成特色旅游管理信息系统

背景: 继C完成淄博烧烤节管理系统后,我们来到了特色旅游管理信息系统的代码编写,历史链接点下方。 C完成淄博烧烤节管理系统_淄博烧烤总账管理系统的-CSDN博客 问题描述: 为了更好的管理各个服务小组,开发相应的管…

C# 拓展方法(涉及Linq)

拓展方法 定义一个扩展方法使用扩展方法例如再举个例子终极例子 注意事项与Linq 在C#中,扩展方法是一种特殊的静态方法,允许开发者向现有类型“添加”新的方法,而无需修改该类型的源代码或创建新的派生类型。这种机制提供了一种更为灵活的方式…

结构化开发方法(数据流图)

一、系统设计基本原理 二、系统总体结构设计 三、数据流图 数据流图

出口加工园区gis三维可视化系统全面整合了企业线上线下资源与服务

园区作为产业协同和经济推动的关键节点,承载着企业生产、物流和服务等多种功能,数字孪生三维可视化技术的出现,通过数字孪生和3D可视化的方式,对园区情况和运营实现实时监测和管理,提高了运营效率和协同性。 园区数字孪…

STM32 学习——1. STM32最小系统

这是一个最小系统的测试,LED灯会进行闪烁。选用PC13口,因为STM32F103C8T6 硬件开发板中,这个端口是一个LED 1. proteus8.15 原理图 2. cubemx 新建工程 3. keil 代码 while (1){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);HAL_Delay(100);…

Css 提高 - 获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标:能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法: document.querySelector(css选择…

一套MES系统源码,技术架构springboot + vue-element-plus-admin

一、系统概述 MES全称Manufacturing Execution System,即制造执行系统,它是一套面向生产车间的管理系统。MES系统可用于实现制造业自动化和数字化转型,它可以帮助车间管理人员监控、跟踪、记录和控制从原材料到成品的产品制造流程&#xff0…

掌握Python基本语法的终极指南【基本语法部分】

一、基本语法部分 1.简单数据类型 1.1字符串类型及操作 字符串访问: 1.索引访问 mystr"Hello world" #索引访问 print(mystr[0]) #H print(mystr[-1]) #d print(mystr[-7]) #o print(mystr[6]) #w 2.切片访问 [头下标:尾下标] &#x…

基于Java、SpringBoot和uniapp在线考试系统安卓APP和微信小程序

摘要 基于Java、SpringBoot和uniapp的在线考试系统安卓APP微信小程序是一种结合了现代Web开发技术和移动应用技术的解决方案,旨在为教育机构提供一个方便、高效和灵活的在线考试平台。该系统采用Java语言进行后端开发,使用SpringBoot框架简化企业级应用…

储能服务系统架构:实现能源可持续利用的科技之路

随着可再生能源的快速发展和能源系统的智能化需求增加,储能技术作为能源转型和可持续发展的关键支撑之一,备受各界关注。储能服务系统架构的设计和实现将对能源行业产生深远影响。本文将探讨储能服务系统架构的重要性和关键组成部分,旨在为相…

【C++高阶(一)】继承

目录 一、继承的概念 1.继承的基本概念 2.继承的定义和语法 3.继承基类成员访问方式的变化 ​编辑 4.总结 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 1.派生类中的默认构造函数 2.派生类中的拷贝构造函数 3.派生类中的移动构造函数…

二维轮廓自动添加屋顶

1、背景介绍 在提取建筑物轮廓点后,对轮廓点进行简化得到建筑物轮廓线。将轮廓线进行拉伸,变可得到建筑物白膜,如下图所示。这种形状比较简单,所重建模型实质上就是一个个立方体盒子,缺少屋顶细节,视觉观感…

玩转盲盒潮流:从0到1搭建小程序平台

在当前的消费市场中,盲盒已成为一种炙手可热的消费模式,凭借其神秘性和随机性,迅速俘获了年轻消费者的心。作为一位有志于创新并紧跟市场趋势的创业者,你可能会想:如何从0到1搭建一个属于自己的盲盒小程序平台&#xf…

SpringBoot高级原理详解

文章目录 1 SpringBoot自动化配置原理01-SpringBoot2高级-starter依赖管理机制02-SpringBoot2高级-自动化配置初体验03-SpringBoot2高级-底层原理-Configuration配置注解04-SpringBoot2高级-底层原理-Import注解使用105-SpringBoot2高级-底层原理-Import注解使用206-SpringBoot…

linux---线程控制

线程和进程 以前我们要同时跑多个程序,可以通过fork()多个子进程,然后通过系统函数进行程序的替换,但是创建进程代价大,不仅要拷贝一份父进程的地址空间,页表,文件表述符表等。但是线程不需要因为是进程的…

frp搭建内网流量转发

前提条件 有一台外网服务器 背景介绍 外网服务器linux内网客户端Windows 10下载frp软件安装包 下载地址:https://github.com/fatedier/frp/releases 服务端软件包下载 客户端软件包下载 服务端部署 解压软件包 tar xzvf frp_0.58.0_linux_amd64.tar.gz修复加压后文件夹名…

TemperMonkey在百度搜索页面,提供跳转其他平台搜索、与批量打开搜索结果的功能的脚本代码

代码 // UserScript // name 百度搜索。链接其他搜索。跳转功能。 // namespace http://tampermonkey.net/ // version 0.1(2020-6-24 17:37:27) // description try to take over the world! // author gwd // match https://www.baidu.com/s?…

深度学习中的优化算法一(Pytorch 18)

一 优化和深度学习 优化算法 使我们能够 继续更新模型参数, 并使损失函数的值最小化。这就像在训练集上评估一样。事实上,任何满足于将优化视为黑盒装置,以在简 单的设置中最小化目标函数的人,都可能会知道存在着一系列此类“咒…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…