Netfilter与FreeBSD的网络包过滤

简介:
在Linux中,使用Netflter来进行包过滤,所有的逻辑都要挂接在Netfilter的某个或者某些HOOK点上,并且实现成该HOOK点上的一个或者多个hook函数,这在Netfilter框架中是用nf_hook_ops结构体来表示的,整个Netfilter的框架如下图所示:


上图中有一部分被称为“过滤”模块,这在Netfilter中是通过filter表来实现的,filter表被划分为一条条的rule,被挂在FORWARD/INPUT/OUTPUT这三个HOOK点上,其nf_hook_ops结构体是:
static struct nf_hook_ops ipt_ops[] __read_mostly = {     {         .hook        = ipt_local_in_hook,         .owner        = THIS_MODULE,         .pf        = NFPROTO_IPV4,         .hooknum    = NF_INET_LOCAL_IN,         .priority    = NF_IP_PRI_FILTER,     },     {         .hook        = ipt_hook,         .owner        = THIS_MODULE,         .pf        = NFPROTO_IPV4,         .hooknum    = NF_INET_FORWARD,         .priority    = NF_IP_PRI_FILTER,     },     {         .hook        = ipt_local_out_hook,         .owner        = THIS_MODULE,         .pf        = NFPROTO_IPV4,         .hooknum    = NF_INET_LOCAL_OUT,         .priority    = NF_IP_PRI_FILTER,     }, };
其hook函数内部调用ipt_do_table来实现rule的遍历匹配。
        前面几篇文章提到了FreeBSD的Netgraph,它相比Netfilter更加独立,因为它除了一个_p回调函数和标准协议栈相关之外,并不和协议栈有任何联系。事实上,你将会发现,在FreeBSD的包过滤模块中,Netgraph仅仅扮演了Netfilter的类似nf_hook_ops的概念,而不是Netfilter本身,那么FreeBSD中谁来扮演Netfilter呢?答案是:没有!你会发现,FreeBSD的协议栈都是通过单一的回调函数来被扩展的,包括包过滤也不例外的。回调函数可以最大限度的解除和标准协议栈的耦合。不像Netfilter,是Netfilter本身决定了各个hook函数按照什么顺序被调用,而Netfilter本身何时被调用是标准协议栈来决定的。从下图展示的FreeBSD的协议栈扩展框架可见一斑。


可以看出,Netgraph可以直接挂在标准协议栈上,还可以被挂在另外的扩展模块上,非常灵活(故而上图中部分连接线使用更加柔和的曲线来画出)。在代码实现上,FreeBSD几乎和Netfilter没有任何区别,我们看一下ip_input函数:
void ip_input(struct mbuf *m) {     ...     if (!PFIL_HOOKED(&V_inet_pfil_hook))         goto passin;     odst = ip->ip_dst;     if (pfil_run_hooks(&V_inet_pfil_hook, &m, ifp, PFIL_IN, NULL) != 0)         return;     if (m == NULL)                  /* consumed by filter */         return;     ... }
pfil_run_hooks在这里接管了一切,其作用很类似Netfilter的NF_HOOK。差别仅仅在于由于Netfilter是内嵌进标准协议栈的,因此只要被Netfilter砍断的函数都主动的分为了两个阶段:XXX以及XXX_finish,而FreeBSD并没有这样。FreeBSD的pfil也有Netfilter的nf_hook_ops的对应概念:
struct packet_filter_hook {     TAILQ_ENTRY(packet_filter_hook) pfil_link;     int     (*pfil_func)(void *, struct mbuf **, struct ifnet *, int,             struct inpcb *);     void    *pfil_arg; };
所谓的pfil_run_hooks函数其实就是遍历一个链表并调用每一个节点上的回调函数,该类链表在FreeBSD的协议栈中有好几个,非常类似于Netfilter的HOOK点的概念,不同的链表hook执行不是按照事先定义好优先级的方式进行的。

        说到这,可能有点晕了,ipfw,ipf,netgraph的关系到底是什么啊!实际上它们之间可以任意组合,这些模块之间以及它们和标准协议栈之间可以进行任意你喜欢的组合方式,协议栈只是在“某些固定”的地方设置了一些hook,不同于Netfilter,这些hook并没有规定你必须做什么和必须不能做什么,并且这些hook点之间是互相独立的,你可以直接使用netgraph,也可以将一张graph挂在一个filter上。正是这种灵活性使得FreeBSD成为了网络定制的首选。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1268978


相关文章
|
网络协议 测试技术 网络安全
|
7天前
|
安全 网络安全 数据库
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第1天】 随着互联网的普及,网络安全和信息安全问题日益突出。本文将介绍网络安全漏洞、加密技术和安全意识等方面的知识,帮助读者更好地了解网络安全的重要性,提高网络安全防护能力。
107 50
|
1天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的探讨
【9月更文挑战第5天】云计算作为一种新兴的计算模式,已经在全球范围内得到了广泛的应用。然而,随着云计算的快速发展,网络安全问题也日益凸显。本文将从云服务、网络安全、信息安全等方面对云计算与网络安全进行探讨。
26 15
|
2天前
|
安全 算法 网络安全
网络安全与信息安全:漏洞、加密与安全意识的三重奏
【9月更文挑战第4天】在数字时代的交响乐中,网络安全与信息安全是不可或缺的乐章。本文将深入探讨网络安全的脆弱性,揭示那些隐藏在光鲜表面下的潜在风险。我们将一同穿梭于加密技术的迷宫,解锁保护数据的神秘钥匙。更重要的是,本文将点亮一盏灯,照亮培养个人和组织安全意识的道路。通过深入浅出的分析与生动的案例,我们将共同见证网络安全的复杂性、加密技术的力量以及安全意识的重要性。让我们携手,为这场数字交响乐谱写一曲无懈可击的安全篇章。
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第5天】在数字化时代,网络安全和信息安全已成为全球关注的焦点。本文将探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解网络安全的重要性,并提高自己的网络安全防护能力。我们将通过分析网络安全漏洞的原因和影响,介绍加密技术的基本原理和应用,以及强调安全意识在防范网络攻击中的关键作用。最后,我们将提供一些实用的建议,帮助读者保护自己的网络安全。
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第4天】在数字化时代,网络安全和信息安全已成为全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及提升安全意识的重要性。我们将通过深入浅出的方式,解析网络安全的基础知识,并提供实用的代码示例,帮助读者更好地理解并应对网络安全挑战。
|
3天前
|
监控 安全 网络安全
云计算与网络安全的融合之路:探索云服务中的信息安全实践
【9月更文挑战第3天】在数字化转型的浪潮中,云计算已成为现代企业不可或缺的技术基石。然而,随着数据和应用逐渐迁移至云端,网络安全和信息安全的挑战亦随之升级。本文将深入探讨云计算环境下的网络安全挑战,并分享如何通过策略和技术手段加强云服务的安全防护,确保企业资产与数据的完整性、可用性和保密性。
17 5
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第4天】在数字化时代,网络安全和信息安全已经成为了我们生活中不可或缺的一部分。然而,随着网络技术的不断发展,网络安全漏洞也越来越多,给我们的生活带来了诸多不便。本文将介绍网络安全漏洞、加密技术和安全意识等方面的知识,帮助读者更好地了解网络安全的重要性,提高自己的安全防护能力。
|
2天前
|
存储 安全 算法
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第4天】随着互联网的普及和发展,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范意识。通过分析常见的网络攻击手段和防御策略,介绍加密技术的基本原理和应用,以及强调培养良好的安全习惯和意识的重要性。希望读者能够从中受益,增强自身的网络安全能力。
下一篇
DDNS