NetFilter (1)
Linux 的了火墙发展至今,已经更新换代至由 NetFilter 作为核心来完成内核态的功能。我们知道,在用户态,iptables 工具可以很方便地进行防火墙的配置,但它只是提供一些人性化的配置命令,然后下发给内核空间读取,在内核态 NetFilter 就会根据用户的配置来进行匹配及执行操作。
本文以 ipv4 包的处理为例来讲解,且只讲原理,不触及细节,在了解大致原理及框架后,要想知道细节,源码将会告诉你答案。基于 Linux 2.6.27.62.
简单点来讲,防火墙其实就是在恰当的点,来接过 ip 包的处理,然后根据配置的规则来决定采取怎样的处理。那么问题来了,如何选择恰当的点呢。见下图:
上图是摘抄了网络上的一张图,其中的五个位置,就是 Linux 支持的几个拦截点,那么问题的第一步就变得非常简单了,在这些位置的函数实现中 hook 一下就可以了。这样当数据包经过这些函数处理时,就可以调用到我们的函数,我们就有机会去处理了,NetFilter 也不能免俗,幸好,内核的网络部分与 NetFilter 完美兼容,它提供出了注册机制,只要表明一下自己的网络类型以及想要 hook 的地点,那么你的回调函数就将有机会在 hook 被执行。
extern struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]; int nf_register_hook(struct nf_hook_ops *reg) { struct nf_hook_ops *elem; int err; err = mutex_lock_interruptible(&nf_hook_mutex); if (err < 0) return err; list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { if (reg->priority < elem->priority) break; } list_add_rcu(®->list, elem->list.prev); mutex_unlock(&nf_hook_mutex); return 0; }
nf_register_hook 就是为你提供便利的函数,代码中可见,我们注册的回调,会连接到 nf_hooks 上,这个全局变量就记录了,不同网络类型,不同挂载点的所有回调函数,到时候数据包经过相应的点时,遍历一下就可以依次处理所有注册的回调了。
当然,你也可以自己注册一个自己的回调,来做一个自己的防火墙功能。 (未完待续)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。