当前位置: 首页 > news >正文

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种,分别是读文件、网口监听(af-packet原始套接字)。两种方式在包获取上,都是通过读文件的形式;存在文件io操作,在专门处理大流量的情境下, 我们复用wireshark去做功能开发是不适合的,在文件io这部分很消耗性能。

此前什么iptables和转发nat需要配置

准备工作

../build/CMakeFiles/tshark.dir/link.txt 链接-lnetfilter_queue库

通过iptables提供数据包,跳过文件读写的过程,可以大大提升性能(没有进行性能测试)

一、将iptables加到收包方式中

在原始代码中,real_main接口为tshark工具的入口函数,前半部分都是参数解析(我们不关注),在中间部分找到,收包代码;

其中第一个条件if (cf_name)这里是读文件的形式,使用是通过-r *.pcap判断的,第二个else位置,里面是capture用来监听网口通过-I eth0使用。

追加第三个iptables收包方式。

直接固定通过iptables收包。

cf_init_iptables接口完成初始化工作,cf是全局的数据,数据包信息,数据包状态相关,比如处理多少,丢掉多少,提供的解码工具等外来数据。里面还加了一个wtap空间,这里是关联到每个数据包的,保存数据包内容。

cf_status_t

cf_init_iptables(capture_file *cf,unsigned int type, gboolean is_tempfile, int *err)

{

  wtap  *wth;

  gchar *err_info;

  wth = iptables_get_wtap_init();

 

  /* The open succeeded.  Fill in the information for this file. */

  /* Create new epan session for dissection. */

  epan_free(cf->epan);

  cf->epan = tshark_epan_new(cf);

  cf->provider.wth = wth;

  cf->f_datalen = 0; /* not used, but set it anyway */

  /* Set the file name because we need it to set the follow stream filter.

     XXX - is that still true?  We need it for other reasons, though,

     in any case. */

  /* Indicate whether it's a permanent or temporary file. */

  cf->is_tempfile = is_tempfile;

  /* No user changes yet. */

  cf->unsaved_changes = FALSE;

  cf->cd_t      = WTAP_FILE_TYPE_SUBTYPE_PCAP;

  cf->open_type = type;

  cf->count     = 0;

  cf->drops_known = FALSE;

  cf->drops     = 0;

  cf->snap      = 262144;

  nstime_set_zero(&cf->elapsed_time);

  cf->provider.ref = NULL;

  cf->provider.prev_dis = NULL;

  cf->provider.prev_cap = NULL;

  cf->state = FILE_READ_IN_PROGRESS;

  wtap_set_cb_new_ipv4(cf->provider.wth, add_ipv4_name);

  wtap_set_cb_new_ipv6(cf->provider.wth, (wtap_new_ipv6_callback_t) add_ipv6_name);

  // 输出格式初始化

  write_preamble(cf);

  return CF_OK;

}

running_get_pkt_from_nfqueue0接口完成iptables初始化,创建接收队列数据包的回调,将数据包接入到tshrak的解密解码逻辑。

void running_get_pkt_from_nfqueue0(void)

{

struct nfq_handle *h;

struct nfq_q_handle *qh;

struct nfnl_handle *nh;

int fd;

int rv;

char buf[4096] __attribute__ ((aligned));

printf("opening library handle\n");

h = nfq_open();//创建 netfilter_queue

if (!h) {//创建失败

fprintf(stderr, "error during nfq_open()\n");

exit(1);

}

printf("unbinding existing nf_queue handler for AF_INET (if any)\n");//解绑已经存在的队列

if (nfq_unbind_pf(h, AF_INET) < 0) {

fprintf(stderr, "error during nfq_unbind_pf()\n");

exit(1);

}

printf("binding nfnetlink_queue as nf_queue handler for AF_INET\n");//绑定上我们创建的队列

if (nfq_bind_pf(h, AF_INET) < 0) {

fprintf(stderr, "error during nfq_bind_pf()\n");

exit(1);

}

printf("binding this socket to queue '0'\n");//cb是回调函数

qh = nfq_create_queue(h,  0, &cb, NULL);

if (!qh) {

fprintf(stderr, "error during nfq_create_queue()\n");

exit(1);

}

printf("setting copy_packet mode\n");

if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {//设置的包处理模式

fprintf(stderr, "can't set packet_copy mode\n");

exit(1);

}

fd = nfq_fd(h);

for (;;) {

if ((rv = recv(fd, buf, sizeof(buf), 0)) >= 0) {

//printf("pkt received\n");

nfq_handle_packet(h, buf, rv);

continue;

}

/* if your application is too slow to digest the packets that

 * are sent from kernel-space, the socket buffer that we use

 * to enqueue packets may fill up returning ENOBUFS. Depending

 * on your application, this error may be ignored. Please, see

 * the doxygen documentation of this library on how to improve

 * this situation.

 */

if (rv < 0 && errno == ENOBUFS) {

printf("losing packets!\n");

continue;

}

perror("recv failed");

break;

}

printf("unbinding from queue 0\n");

nfq_destroy_queue(qh);//摧毁队列,退出

#ifdef INSANE

/* normally, applications SHOULD NOT issue this command, since

 * it detaches other programs/sockets from AF_INET, too ! */

printf("unbinding from AF_INET\n");

nfq_unbind_pf(h, AF_INET);

#endif

printf("closing library handle\n");

nfq_close(h);

exit(0);

}

回调函数,这里需要做个额外的事情,因为iptables是一个三层工具,拿不到mac信息,所以这里需要加一个mac头,位置看注释。将数据包发给处理函数

int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,

          struct nfq_data *nfa, void *data) {

//printf("entering callback\n");

struct nfqnl_msg_packet_hdr *ph;

int id = 0;

ph = nfq_get_msg_packet_hdr(nfa);

if (ph) {

    id = ntohl(ph->packet_id);

}

struct iphdr *ip_header;

unsigned char *data_buf;

int data_len = nfq_get_payload(nfa, &data_buf);

if (data_len > 0) {

    ip_header = (struct iphdr *)data_buf;

    //printf("Source IP: %s\n", inet_ntoa(*(struct in_addr *)&ip_header->saddr));

    //printf("Destination IP: %s\n", inet_ntoa(*(struct in_addr *)&ip_header->daddr));

// 构造新的缓冲区

    int new_buf_len = 14 + data_len;

    unsigned char *new_buf = (unsigned char *)malloc(new_buf_len);

    if (new_buf == NULL) {

        perror("malloc");

        return nfq_set_verdict(qh, id, NF_DROP, 0, NULL);

    }

    // 将MAC头复制到新的缓冲区

    memcpy(new_buf, temp_mac_header, 14);

    // 将data_buf复制到新的缓冲区中紧随MAC头的位置

    memcpy(new_buf + 14, data_buf, data_len);

process_iptables_queue_packet_signle(new_buf_len,new_buf);

  

   free(new_buf);

}

    return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);

}

处理函数,初始化一个空间,数据包的所有内容保存在这里,用完释放

void process_iptables_queue_packet_signle(int datalen, unsigned char *data)

{

capture_file *cf = &cfile;

int create_proto_tree = 1; // 是否生成解析树

int print_detile = 1;      // 是否打印详细信息

epan_dissect_t *edt = epan_dissect_new(cf->epan, create_proto_tree, print_detile);

iptables_set_wth_rec_values(cf->provider.wth,datalen);

process_packet_single_pass(cf,edt,0,wtap_get_rec(cf->provider.wth),data,0);

if (edt) {

      epan_dissect_free(edt);

      edt = NULL;

    }

}

这里对iptables的patch就完成了,试验一下

Run/tshark执行,提示绑定队列

重放数据包正常打印解析结果

相关文章:

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种&#xff0c;分别是读文件、网口监听&#xff08;af-packet原始套接字&#xff09;。两种方式在包获取上&#xff0c;都是通过读文件的形式&#xff1b;存在文件io操作&#xff0c;在专门处理大流量的情境下&#xff0c; 我们复用wireshark去做…...

快团团团长如何批量退款可自定义退款金额(批量退差价)?

快团团团长如何批量退款可自定义退款金额&#xff08;批量退差价&#xff09;&#xff1f; 在售后处理中&#xff0c;经常会出现需要给某一商品退差价的场景&#xff0c;因此在批量退款时需要自定义退款金额。现快团团已支持批量退自定义金额&#xff0c;操作方法和注意事项如…...

MySQL——事务ACID原则、脏读、不可重复读、幻读

什么是事务 要么都成功&#xff0c;要么都失败 一一一一一一一 1. SQL执行&#xff1a;A给B转账 A 1000 ---->200 B 200 2. SQL执行&#xff1a;B收到A的钱 A 800 B 400 一一一一一一一 将一组SQL放在一个批次中去执行~ 事务原则&#xff1a;ACI…...

洗衣机水龙头要买有止逆阀的,多花几十元能省掉几万,值了

问大家一下&#xff0c;你家洗衣机水龙头用的是什么样的&#xff1f;      可能有业主会说我家买的是纯铜的&#xff0c;质量挺好的。      如果你家选的洗衣机水龙头仅仅是纯铜的&#xff0c;并没有其他的功能&#xff0c;你还是选做错了。      因为洗衣机水龙头…...

Android 蓝牙开发全面指南

Android 平台的蓝牙功能提供了丰富的API和工具&#xff0c;使开发者能够轻松实现从基本连接到复杂数据交换的各种蓝牙功能。蓝牙技术已经成为智能手机和其他设备间通信的重要方式&#xff0c;尤其在物联网和智能家居应用中有广泛应用。 关键词总结 Android 蓝牙开发涉及多个关…...

Hadoop3:Yarn框架的三种调度算法

一、概述 目前&#xff0c;Hadoop作业调度器主要有三种&#xff1a;FIFO、容量&#xff08;Capacity Scheduler&#xff09;和公平&#xff08;Fair Scheduler&#xff09;。Apache Hadoop3.1.3默认的资源调度器是Capacity Scheduler。 CDH框架默认调度器是Fair Scheduler。 …...

JDBC链接kerberos认证的impala数据库报错问题解决

先上代码 public static Connection connectToImpala() {try {log.info("ketTabPath:" ketTabPath);log.info("krb5Path:" krb5Path);System.setProperty("java.security.krb5.conf", krb5Path);System.setProperty("sun.security.krb5.…...

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务&#xff08;firewalld.service&#xff09;&#xff0c;可以通过 systemctl 进行启动、停止和重启&#xff0c;而iptables 本身并不是一个…...

施耐德全新EtherCAT运动控制器M310介绍

在制造业的蓬勃发展下&#xff0c;高性能运动控制器成为提升生产效率、保障产品质量的关键设备之一。M310是施耐德电气新一代高性能运动控制器&#xff0c;它基于Intel X86硬件平台和Codesys V3.5 SP19软件平台开发&#xff0c;支持EtherCAT总线&#xff0c;拥有强大算力、高易…...

Springboot Mybatis 多数据源配置以及使用

在Spring Boot中配置MyBatis的多数据源是一个常见需求&#xff0c;尤其是在需要连接多个数据库时&#xff0c;下面是详细的步骤指南。 引入依赖 首先&#xff0c;在你的pom.xml文件中添加Spring Boot、MyBatis和数据库连接的相关依赖。例如&#xff0c;如果你使用的是MySQL数…...

Android启动时间分析

在Android启动过程中,“NHLOS” 和 “LK” 是两个与启动时间相关的术语,它们分别指的是: 各阶段时间 I Minidump: Enabled with max number of regions 200 I KPI : Bootloader start count = 59264 I KPI : Bootloader end count = 101746 I KPI : Boo…...

智能洗车管理系统设计

智能洗车管理系统设计的核心在于整合先进的信息技术与自动化设备&#xff0c;以提升洗车服务的效率、降低成本并增强客户体验。以下是一个概括性的设计框架&#xff1a; 1. 系统需求分析 用户需求&#xff1a;了解车主对于快速、便捷、高质量洗车服务的需求。业务需求&#xf…...

vue3弹窗usehook

说明 个人记录保存。 import {ref} from "vue";export default function useDialog(opts) {const visible ref(false)const loading ref(false)const open (v) > {visible.value truetypeof opts.onOpen "function" && opts.onOpen(v)}c…...

上帝之眼(BEVSee):多相机间无需标定,将各自目标统一到同一坐标系下(代码开源,提供数据集)

Abstract 我们解决了一个新的问题&#xff0c;即在鸟瞰视角&#xff08;BEV&#xff09;中无需预先给定相机校准的多视角相机和目标注册问题。这将多视角目标注册问题提升到一个新的无需校准的阶段&#xff0c;从而极大地缓解了许多实际应用中的限制。然而&#xff0c;这是一个…...

imagesc函数 纵坐标翻转 colormap “set” “jet“

纵坐标默认上小下大 翻转&#xff1a; 在Matlab中&#xff0c;使用imagesc函数绘制的图像的纵坐标默认是从上到下递增的&#xff0c;即下面的值较大&#xff0c;上面的值较小。如果想要翻转纵坐标&#xff0c;使之从上到下递增&#xff0c;可以通过设置坐标轴的YDir属性为’n…...

Postman接口测试工具的原理及应用详解(二)

本系列文章简介: 在当今软件开发的世界中,接口测试作为保证软件质量的重要一环,其重要性不言而喻。随着前后端分离开发模式的普及,接口测试已成为连接前后端开发的桥梁,确保前后端之间的数据交互准确无误。在这样的背景下,Postman作为一款功能强大、易于使用的接口测试工…...

IPython脚本加载秘籍:探索脚本魔法的艺术

IPython脚本加载秘籍&#xff1a;探索脚本魔法的艺术 IPython&#xff0c;这个强大的交互式Python解释器&#xff0c;不仅提供了丰富的交互式编程功能&#xff0c;还允许用户加载和运行Python脚本。这一功能极大地扩展了IPython的实用性&#xff0c;使得用户可以在IPython环境…...

使用shell脚本进行clang-tidy静态代码分析

文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言 clang-tidy 是基于 Clang 的工具&#xff0c;提供了丰富的代码检查功能&#xff0c;可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang…...

PHP和phpSpider:如何应对网站变动导致的数据爬取失败?

php和phpspider&#xff1a;如何应对网站变动导致的数据爬取失败&#xff1f; 导语&#xff1a; 网络爬虫是一种自动化程序&#xff0c;用于从网站上获取数据并进行处理。PHP是一种广泛使用的编程语言&#xff0c;而phpSpider是一个基于PHP的开源网络爬虫框架。然而&#xff0…...

聊聊etsy平台,一个年入百万的项目

聊聊etsy平台&#xff0c;一个年入百万的项目 什么是etsy,这是怎样一个平台&#xff0c;怎样盈利的&#xff1f;相信现在大家满脑子都是这些疑问。 这个平台也是无意间一个学员提到的&#xff0c;据说他朋友靠这个平台年赚好几百万。苦于门槛太高&#xff0c;他也做不了。今天…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...