简单点来讲,防火墙其实就是在恰当的点,来接过 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;
}
原文:http://blog.csdn.net/henzox/article/details/43762263