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

2024-09-05 05:32

本文主要是介绍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/netfilter/nf_nat.h>
#include <net/netfilter/nf_nat_core.h>
#include <net/netfilter/nf_nat_l3proto.h>
#include <net/netfilter/nf_nat_l4proto.h>/* 判断端口是否在可用范围内*/
bool nf_nat_l4proto_in_range(const struct nf_conntrack_tuple *tuple,enum nf_nat_manip_type maniptype,const union nf_conntrack_man_proto *min,const union nf_conntrack_man_proto *max)
{__be16 port;/*根据SNAT和DNAT的不同取不同的值*/if (maniptype == NF_NAT_MANIP_SRC)port = tuple->src.u.all;elseport = tuple->dst.u.all;return ntohs(port) >= ntohs(min->all) &&ntohs(port) <= ntohs(max->all);
}
EXPORT_SYMBOL_GPL(nf_nat_l4proto_in_range);/*对称型的NAT端口变化关键算法*/
void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto,struct nf_conntrack_tuple *tuple,const struct nf_nat_range *range,enum nf_nat_manip_type maniptype,const struct nf_conn *ct,u16 *rover)
{unsigned int range_size, min, i;__be16 *portptr;u_int16_t off;/*根据SNAT和DNAT的不同取不同的值*/if (maniptype == NF_NAT_MANIP_SRC)portptr = &tuple->src.u.all;elseportptr = &tuple->dst.u.all;/* If no range specified... */if (!(range->flags & NF_NAT_RANGE_PROTO_SPECIFIED)) {/* If it's dst rewrite, can't change port */if (maniptype == NF_NAT_MANIP_DST)return;/*首先取一个min的值*/if (ntohs(*portptr) < 1024) {/* Loose convention: >> 512 is credential passing */if (ntohs(*portptr) < 512) {min = 1;range_size = 511 - min + 1;} else {min = 600;range_size = 1023 - min + 1;}} else {min = 1024;range_size = 65535 - 1024 + 1;}} else {min = ntohs(range->min_proto.all);range_size = ntohs(range->max_proto.all) - min + 1;}/*设置偏移量off值*/if (range->flags & NF_NAT_RANGE_PROTO_RANDOM) {off = l3proto->secure_port(tuple, maniptype == NF_NAT_MANIP_SRC? tuple->dst.u.all: tuple->src.u.all);} else if (range->flags & NF_NAT_RANGE_PROTO_RANDOM_FULLY) {off = prandom_u32();} else {off = *rover;}/*不断增加端口号直到找到可用的端口*/for (i = 0; ; ++off) {*portptr = htons(min + off % range_size);if (++i != range_size && nf_nat_used_tuple(tuple, ct))continue;if (!(range->flags & NF_NAT_RANGE_PROTO_RANDOM_ALL))*rover = off;return;}
}
EXPORT_SYMBOL_GPL(nf_nat_l4proto_unique_tuple);#if IS_ENABLED(CONFIG_NF_CT_NETLINK)
int nf_nat_l4proto_nlattr_to_range(struct nlattr *tb[],struct nf_nat_range *range)
{if (tb[CTA_PROTONAT_PORT_MIN]) {range->min_proto.all = nla_get_be16(tb[CTA_PROTONAT_PORT_MIN]);range->max_proto.all = range->min_proto.all;range->flags |= NF_NAT_RANGE_PROTO_SPECIFIED;}if (tb[CTA_PROTONAT_PORT_MAX]) {range->max_proto.all = nla_get_be16(tb[CTA_PROTONAT_PORT_MAX]);range->flags |= NF_NAT_RANGE_PROTO_SPECIFIED;}return 0;
}
EXPORT_SYMBOL_GPL(nf_nat_l4proto_nlattr_to_range);
#endif

   由代码我们可以看到,其实这里控制分为三部分:
   (1)min值的设定
   (2)off值得设定
   (3)寻找合适端口

   源码中off++即增量对称型NAT,每次端口尝试+1,阻塞则再增加。由此,我们可以对其进行改变以做出不同类型的对称型NAT。

   通过修改off的值可以改变每次新端口的跳变,通过修改off++为加某个固定值可以改为增量型对称型NAT,改为随机则变为随机增量对称型NAT。


欢迎关注本人公众号,公众号会更新一些不一样的内容,相信一定会有所收获。
在这里插入图片描述

这篇关于Netfilter学习之NAT类型动态配置(八)nf_nat_proto_common.c代码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作