简单点来讲,防火墙其实就是在恰当的点,来接过 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