THRESH控制网桥netfilter规则执行流程

2023-12-19 10:58

本文主要是介绍THRESH控制网桥netfilter规则执行流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NF_HOOK_THRESH函数的参数thresh控制从何等优先级的hook函数开始执行,所以低于thresh优先级的函数将不会被遍历执行。hook函数的注册由nf_register_hook函数完成。priority的值越小优先级越高,所有注册的hook函数优先级由高到低排序。


int nf_register_hook(struct nf_hook_ops *reg)
{list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {if (reg->priority < elem->priority)break;}list_add_rcu(&reg->list, elem->list.prev);
}


THRESH初始

以下依据网桥bridge的NF_BR_PRE_ROUTING点为例,数据包首先进入网桥处理函数br_handle_frame,如果目的MAC不是链路本地地址(01:80:c2:00:00:0X),调用NF_HOOK进行NF_BR_PRE_ROUTING hook点的规则处理,NF_HOOK函数调用NF_HOOK_THRESH,此时传递的最后一个参数thresh为最小的有符号整数INT_MIN(0x80000000)。


static inline int NF_HOOK(uint8_t pf, unsigned int hook, ...)
{return NF_HOOK_THRESH(pf, hook, sk, skb, in, out, okfn, INT_MIN);
}
rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
{NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, NULL, skb,skb->dev, NULL, br_handle_frame_finish);
}


最终,thresh参数赋值给了nf_hook_state结构的变量state->thresh,查看hook点规则遍历函数nf_iterate可知,所有优先级大于阈值state->thresh的规则都将得到执行。由上可知,thresh的值为INT_MIN,已经是最小值了,所有注册的规则优先级都大于此值,都会执行。

unsigned int nf_iterate(struct list_head *head, struct sk_buff *skb, struct nf_hook_state *state, struct nf_hook_ops **elemp)
{list_for_each_entry_continue_rcu((*elemp), head, list) {if (state->thresh > (*elemp)->priority)continue;
}


网桥netfilter HOOK点的优先级定义,优先级的类型为有符号整数:

enum nf_br_hook_priorities {NF_BR_PRI_FIRST = INT_MIN,NF_BR_PRI_NAT_DST_BRIDGED = -300,NF_BR_PRI_FILTER_BRIDGED = -200,NF_BR_PRI_BRNF = 0,NF_BR_PRI_NAT_DST_OTHER = 100,NF_BR_PRI_FILTER_OTHER = 200,NF_BR_PRI_NAT_SRC = 300,NF_BR_PRI_LAST = INT_MAX,
};


THRESH值改变

阈值thresh在什么地方改变呢?这里其实会涉及到规则的嵌套查找。继续看NF_BR_PRE_ROUTING hook点的处理,当执行到NF_BR_PRI_BRNF优先级的规则时,内核在此注册了一个br_nf_pre_routing处理函数。此函数会调用IPv4的NF_INET_PRE_ROUTING hook点规则,调用完后最后由函数br_nf_pre_routing_finish处理。

static struct nf_hook_ops br_nf_ops[] __read_mostly = {{.hook = br_nf_pre_routing,.owner = THIS_MODULE,.pf = NFPROTO_BRIDGE,.hooknum = NF_BR_PRE_ROUTING,.priority = NF_BR_PRI_BRNF,},
}


调用上层IPv4的hook点处理后,返回NF_STOLEN,网桥NF_BR_PRE_ROUTING hook点的遍历将在此结束,难道意味着优先级在NF_BR_PRI_BRNF之后的规则都不会被执行。其实不然,在函数br_nf_pre_routing_finish中,内核会直接调用NF_HOOK_THRESH函数(非之前的NF_HOOK封装),此时thresh参数值传入1,根据上文介绍的函数nf_iterate可知,优先级大于1的规则将得到继续运行,即NF_BR_PRI_BRNF(=0)之后优先级的规则会执行。与br_handle_frame一致,遍历完成后交由br_handle_frame_finish处理。


static unsigned int br_nf_pre_routing(const struct nf_hook_ops *ops, ...)
{NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, state->sk, skb,skb->dev, NULL, br_nf_pre_routing_finish);return NF_STOLEN;
}static int br_nf_pre_routing_finish(struct sock *sk, struct sk_buff *skb)
{NF_HOOK_THRESH(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, sk, skb,skb->dev, NULL, br_handle_frame_finish, 1);
}


内核版本

linux-3.10.0



这篇关于THRESH控制网桥netfilter规则执行流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla