我们知道在用户层的防火墙配置工具 iptables 中,有四个表五条链的说法,五条链其实就是上一篇中讲到的五个不同的拦截点,那四个表呢,分表中 Filter, Nat, Mangle, Raw,从名字上就可以看出它们的作用,这里不讲,也就是说,当你添加包的匹配规则时,需要指定添加到哪张表的哪个拦截点上,当然并不是所有的表都支持所有的拦截点,下图是它们各自支持的拦截点的对应关系:
添加规则时需要指出哪张表的哪个拦截点,这其实也是 NetFilter 在内核中组织匹配规则的方式,我们首先看一下整个 NetFilter 存储规则的结构:
(图解,图中的虚线箭头表示将上一个结构体的部分放大。实线代表指针。)
从上图中,可以清晰地看到,在网络的命令空间中, xt 指向一个表的数组,它包括所有网络类型的表的链表头,其中 AF_INET 表示 Internet 防火墙,也就是 NetFilter 中所有的表的链表头,当然网络系统中的代码足够灵活,它提供了接口来注册表,
struct xt_table *xt_register_table(struct net *net, struct xt_table *table, struct xt_table_info *bootstrap, struct xt_table_info *newinfo)每个表的规则,则存储在 xt_table.private 中,它是一个 xt_table_info 的结构体,而后者存储了该表中的所有匹配规则。某张表的所有规则是存放在一块连续内存中的,由于每个表都可能有五个拦截点,所以 hook_entry 记录了所有拦截中规则的偏移,而 entries 则给出了所有规则的起始地址,这样,想要查找某个拦截点配置的规则,就可以通过 base + offset 的得到该拦截点的规则了。
#include <sys/types.h> #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);来进行通信的,为了便于扩展,它只定义了框架,每个防火墙定义自己的 get 和 set 方法,ipv4 则调用 nf_register_sockopt(&ipt_sockopts) 来完成这两个函数的注册,这样就可以完成自己规则的配置工作了。
原文地址:http://blog.csdn.net/henzox/article/details/43763073