nf_queue改包

2023-11-23 23:30
文章标签 queue nf 改包

本文主要是介绍nf_queue改包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系统:centos 7

准备:安装libnetfilter_queue模块,可以yum安装,也可以网上下载rpm包安装

简介:使用iptables在NAT表上创建DNAT与SNAT规则,对数据包进行转发;在MANGLE表上的FORWARD链上创建NF_QUEUE规则对数据进行勾取并修改;(iptables只有mangle表可以修改数据)

 

示例规则:

//把到本机 50.24  8889端口的数据包,nat到50.4的8889端口
iptables -t nat -A PREROUTING -p udp -d 192.168.50.24 --dport 8889 -j DNAT --to 192.168.50.4  
iptables -t nat -A POSTROUTING -p udp -d 192.168.50.4 --dport 8889 -j SNAT --to 192.168.50.24//把目的地址50.4,目的端口8889的数据包,入队列 1
iptables -t mangle -A FORWARD -d 192.168.50.4 -p udp --dport 8889  -j NFQUEUE --queue-num 1


示例代码:

主线程DoListenIptablesThread负责对QUEUE队列数据的读取,读取到的数据通过回调PacketHandler方法解析处理,传入参数为  queue的 ID号

复制代码
static void *DoListenIptablesThread(void *pData)
{struct nfq_handle *h;struct nfq_q_handle *qh;struct nfnl_handle *nh;int fd;int rv;int i;pthread_t RecvPth[PthNUM];char buf[QUEUE_BUFSIZE];TCLEANFUNCT struTmp;int nTmpError = -1;int nNum = *(int *)pData;
   free(pData);
    pthread_detach(pthread_self());
memset(&struTmp, 0, sizeof(struTmp));zlog_debug(cat,"opening library handle, nNum[%d]", nNum);h = nfq_open();if (!h){nTmpError = errno;zlog_debug(cat,"error during nfq_open(), nNum[%d]", nNum);zlog_debug(cat,"nfq_open() errno[%d][%s]", nTmpError, strerror(nTmpError));pthread_exit(0);}zlog_debug(cat,"unbinding existing nf_queue handler for AF_INET (if any), nNum[%d]", nNum);if (nfq_unbind_pf(h, AF_INET) < 0){nTmpError = errno;zlog_debug(cat,"error during nfq_unbind_pf(), nNum[%d]", nNum);zlog_debug(cat,"nfq_unbind_pf() errno[%d][%s]", nTmpError, strerror(nTmpError));nfq_close(h);pthread_exit(0);}zlog_debug(cat,"binding nfnetlink_queue as nf_queue handler for AF_INET, nNum[%d]", nNum);if (nfq_bind_pf(h, AF_INET) < 0){nTmpError = errno;zlog_debug(cat,"error during nfq_bind_pf(), nNum[%d]", nNum);zlog_debug(cat,"nfq_bind_pf() errno[%d][%s]", nTmpError, strerror(nTmpError));nfq_close(h);pthread_exit(0);}zlog_debug(cat,"binding this socket to queue [%d]", nNum);qh = nfq_create_queue(h, nNum, &PacketHandler, &nNum);if (!qh){nTmpError = errno;zlog_debug(cat,"error during nfq_create_queue(), nNum[%d]", nNum);zlog_debug(cat,"nfq_create_queue() errno[%d][%s]", nTmpError, strerror(nTmpError));nfq_close(h);pthread_exit(0);}zlog_debug(cat,"setting copy_packet mode, nNum[%d]", nNum);if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0){nTmpError = errno;zlog_debug(cat,"can't set packet_copy mode, nNum[%d]", nNum);zlog_debug(cat,"nfq_set_mode() errno[%d][%s]", nTmpError, strerror(nTmpError));nfq_destroy_queue(qh);nfq_close(h);pthread_exit(0);}nh = nfq_nfnlh(h);fd =

这篇关于nf_queue改包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420848

相关文章

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

stack,queue, priority_queue

STL 中栈的使用方法(stack) #include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(queue) #i

HDU 1297 Children’s Queue

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1297 题解: D[n]表示有n个人时,满足排队要求的个数。 分类讨论: 1.第n个人为男生时,满足排队要求的个数等于D[n-1]. 2.第n个人为女生时,第n-1个必为女生,才满足要求。 此处还要进行一次分类: a.前n-2个满足排队要求时,个数为D[n-2]. b.前n-2个不满足

C++ STL-Queue容器概念及应用方法详解

1. 再谈队列 队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。 概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

Netfilter学习之NAT类型动态配置(八)nf_nat_proto_common.c代码解析

nf_nat_proto_common.c实现了对称型的端口改变,在此我决定对其代码进行分析,以便实现对对称型NAT的随意改动。    具体代码如下: #include <linux/types.h>#include <linux/random.h>#include <linux/netfilter.h>#include <linux/export.h>#include <net/n

HDU 3436 Queue-jumpers

题意: n个人站成一排  一开始是从1到n有序的  现在有三个操作  Top操作是将一个人排到队首  Query操作是询问某个人现在排第几  Rank操作是询问排某个位置的人是谁 思路: 将队伍扭来扭去…  很像splay的旋转吧(哪像了!!) 这是个不错的splay题… 首先  n很大  但是操作不多  想到离散化 离散化还有个技巧  我们发现只有top和query操作对单人进

消息队列 think-queue tp5.0

一 介绍 think-queue是tp框架消息队列插件,依赖框架框架核心版本,所以下载时需要选择对应框架核心的版本。 比如tp5.1用2.0的都可以,5.0的用1.1.6。其余版本参考composer。 composer地址:topthink/think-queue - Packagist 不同版本中项目结构不同,一般会说明插件的使用方法,比如配置文件位置。可以在项目中查找“queue.p