linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)
什么是Netfilter/iptable
Netfilter/iptables是Linux内核内置的报文过滤框架,程序可以通过该框架完成报文过滤、地址转换(NAT)以及连接跟踪等功能。
Netfilter/iptables由两部分组成,一部分是Netfilter的"钩子(hook)",这些"钩子"由Linux内核协议栈提供,内核模块可以通过注册"钩子"来完成各种各样的功能。 另一部分是iptables的规则,这些规则规定了"钩子"如何工作。
下图很直观的说明了用户空间的iptables和内核空间的ip_tables模块、Netfilter之间的关系。
Netfilter
Netfilter是嵌入Linux内核协议栈的,设置在报文处理路径上的一系列调用入口。 Netfilter一共有5个"钩子"设置在IP协议栈的报文处理路径上,这5个"钩子"就是内嵌在内核协议栈的检查点。 我们可以把处理函数注册到各个检查点,当报文经过各个检查点时,就可以通过"钩子"函数对报文进行处理完成相应功能。
下图说明了5个"钩子"在内核协议栈的位置。
"钩子"的存储及管理机制
在内核中,"钩子"函数由一个全局二维数组nf_hooks按照协议族归类存储,在每个协议族中,根据钩子点顺序排列,在钩子点内则根据钩子函数的优先级排列。 例如ipv4和ipv6就是两个协议族,每个协议族都包含5个"钩子",每个"钩子"下面保存了注册在这个"钩子"上的函数地址。
这个二维数组的每一项代表了一个钩子被调用的点,NF_PROTO代表协议栈,NF_HOOK代表协议栈中某个路径点。
所有模块都可以通过nf_register_hook()函数将一个钩子函数挂入想要被调用点的链表中(通过Protocol和hook指定一个点)。 这样,该钩子函数就能够处理从指定Protocol和指定hook点流过的数据包。
Netfilter在不同协议栈的不同点上放置钩子函数,当数据包经过某个协议栈(NF_PROTO)的某个点(NF_HOOK)时,该协议栈会通过NF_HOOK()函数调用对应钩子链表(nf_hooks[NF_PROTO][NF_HOOK])中注册的每一个钩子项来处理该数据包。
Netfilter定义了每个钩子函数的返回值,每个钩子函数只能返回下面的返回值,而不能自定义返回值。
NF_DROP(0):数据包被丢弃,即不被下一个钩子函数处理,同时也不再被协议栈处理,并释放数据包。
NF_ACCEPT(1):数据包被接受,即交给下一个钩子或协议栈继续处理。
NF_STOLEN(2):数据包被停止处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,但不释放数据包。
NF_QUEUE(3):将数据包交给nf_queue子系统处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,也不释放数据包。
NF_REPEAT(4):数据包将被该返回值的钩子函数再次处理一遍。
NF_STOP(5): 数据包停止被该HOOK点的后续钩子函数处理,交给协议栈继续处理。
"钩子"的使用方法
"钩子"的使用首先实例化一个nf_hook_ops对象,然后对其进行必要的初始化设置,最后通过nf_register_hook()函数将其注册到二维数组nf_hooks中。 我们首先初始化nf_hook_ops中的常用字段:
static struct nf_hook_ops nf_hook_test_ops =
{
.hook = test_hook_func;
.hooknum = NF_INET_PRE_ROUTING;
.pf = PF_INET;
.owner = THIS_MODULE;
.priority = NF_IP_PRI_FIRST;
}
其中:
hook是钩子函数
hooknum是钩子点
pf是协议栈
priority是钩子函数的优先级
然后在模块加载和退出函数中注册和移除钩子函数:
int init_module(void)
{
nf_register_hook(&nf_hook_test_ops);
}
void cleanup_module()
{
nf_unregister_hook(&nf_hook_test_ops);
}
下面是回调函数的声明:
static unsigned int test_hook(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff*)
从上述过程可以看出,钩子函数的使用与iptables没有任何关系,也就是说如果某个模块需要对协议栈的报文进行处理,但不需要用户空间的参数,那么完全可以只注册钩子函数,而不需要编写iptables的模块。
即使需要用户空间的参数,也可以通过proc或者netlink等其他用户态和内核态通信方式来传递参数,这样就可以更灵活的使用Netfilter了。
参考资料:
linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)相关推荐
- 基于linux的netfilter处理数据包的过程分析,基于Linux的Netfilter处理数据包的过程分析...
基于Linux的Netfilter处理数据包的过程分析 防火墙技术在保护网络安全方面的作用越来越明显.相比较window,Linux有更好的网络性能,因此基于Linux的Netfilter技术 (本文 ...
- linux过滤数据包,用Tcpdump过滤数据包
对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过嗅探器来分析原因,找出造成网络阻塞的根源.Tcpdump就是Linux平台下一个以命令行方式运行的网络流量 ...
- Linux内核网络数据包发送(三)——IP协议层分析
Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...
- linux如何查看丢弃数据包,导致Linux服务器丢弃数据包?
我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处 ...
- Linux系统捕获数据包流程
Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...
- Linux内核网络数据包发送(四)——Linux netdevice 子系统
Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...
- Linux内核网络数据包发送(二)——UDP协议层分析
Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...
- Linux内核网络数据包发送(一)
Linux内核网络数据包发送(一) 1. 前言 2. 数据包发送宏观视角 3. 协议层注册 4. 通过 socket 发送网络数据 4.1 `sock_sendmsg`, `__sock_sendms ...
- linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记
关于 SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq 一直没有找到seq 不清楚在那里初始化了,就 ...
- 在Wireshark中过滤数据包
介绍 数据包过滤可让你专注于你感兴趣的确定数据集.如你所见,Wireshark 默认会抓取所有数据包.这可能会妨碍你寻找具体的数据. Wireshark 提供了两个功能强大的过滤工具,让你简单而无痛地 ...
最新文章
- 基于点云强度的3D激光雷达与相机的外参标定
- 《大道至简》一书第三版,与编辑就本书写作风格的讨论
- [YTU]_2803( 判断字符串是否为回文)
- python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能
- python中函数和方法的区别
- 膜拜大佬!不同层级的Android开发者的不同行为,社招面试心得
- 阿里云、腾讯云和华为云618活动细节对比
- 【Python】学习笔记2-数据类型:数组、数组循环切片
- 固定再计算机主机箱,一种计算机主机放置箱架的制作方法
- pioneer软件VoLTE测试步骤,世纪鼎利Pioneer连接移动平台进行VoLTE测试操作说明综述...
- houdini大神自诉:为什么我要放弃maya I
- ubuntu设置变暗时间
- 如何优雅地使用 Sublime Text
- C#比较两字符串是否相等,忽略大小写
- 2020湖南省技能竞赛获奖名单_雄安新区网络安全技能竞赛举办!9人获奖!
- 技术创业者必读:从验证想法到技术产品商业化的全方位解析
- 调用对象 “ha-datastoresystem”的“HostDatastoreSystem.QueryVmfsDatastoreCreateOptions” 失败。...
- [原创]FineUI秘密花园(六) — 表单控件
- Avaya交换机呼叫中心解决方案
- U盘重新量产,PE与ubuntu共存
热门文章
- vagrant 环境配置
- 吉哥系列故事——恨7不成妻(数位 DP)
- Georgia and Bob(Poj 1704)Nim 博弈
- #530. 「LibreOJ β Round #5」最小倍数 二分 + 数论
- D - Counting Stars HDU - 7059
- Code Names
- 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
- 合成小丹(dp+二进制按位或+结论)
- 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】
- YbtOJ#463-序列划分【二分答案,线段树,dp】