NetFilter (1)

        以高效网络著称的 Linux,网络安全当然也不容忽视,如何能以高效强大的手段对网络数据包的处理进行配置也就显得尤为重要,而 NetFilter 就是承担这一重任的组件。
        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(&reg->list, elem->list.prev);
	mutex_unlock(&nf_hook_mutex);
	return 0;
}

        nf_register_hook 就是为你提供便利的函数,代码中可见,我们注册的回调,会连接到 nf_hooks 上,这个全局变量就记录了,不同网络类型,不同挂载点的所有回调函数,到时候数据包经过相应的点时,遍历一下就可以依次处理所有注册的回调了。
        当然,你也可以自己注册一个自己的回调,来做一个自己的防火墙功能。 (未完待续)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。