BIND9源码分析之acl 的实现
2013-10-29 00:30
330 查看
BIND配置中一大堆一大堆的acl,什么allow-query, allow-recursion, allow-update还有view的match-clients等等等等。
acl中的主要存储的就是IP,可以把acl当做是一个IP池,在需要验证的时候就从这个IP池中查找该IP是否存在。那么BIND中如何实现这个非常常用的IP池的呢?
BIND中的acl用数据结构dns_acl来表示:
其中的iptable本质上就是一个radix tree(中文名叫基数树)。
radix tree简直就是为IP路由存储和查找而生的(实际上IP路由查找正是radix tree最常用的领域之一)。在存储IP数据,尤其是CIDR的时候,radix退化成一种二叉树,左右子树分别表示IP的二进制表示的1或者0,所以对于IPv4,radix 树的最大高度是32。对于CIDR的存储,只需要存储前缀位就可以了,比如存储130.50.30.40/18,只需要存储前18位即可,后面的14位不用存储,因为在查找ACL的时候,只要对比到第18位就可以确定是否让此IP通过验证。
BIND9中radix tree的实现比较复杂,可能是处于需要兼容IPv4和IPv6,以及IP地址的先后关系的考虑。
nginx中的geo模块也用radix tree存储CIDR形式的IP,core/ngx_radix_tree.c的实现还是相当短小精悍的。
acl中的主要存储的就是IP,可以把acl当做是一个IP池,在需要验证的时候就从这个IP池中查找该IP是否存在。那么BIND中如何实现这个非常常用的IP池的呢?
BIND中的acl用数据结构dns_acl来表示:
struct dns_acl { unsigned int magic; isc_mem_t *mctx; isc_refcount_t refcount; dns_iptable_t *iptable; #define node_count iptable->radix->num_added_node dns_aclelement_t *elements; isc_boolean_t has_negatives; unsigned int alloc; /*%< Elements allocated */ unsigned int length; /*%< Elements initialized */ char *name; /*%< Temporary use only */ ISC_LINK(dns_acl_t) nextincache; /*%< Ditto */ };
其中的iptable本质上就是一个radix tree(中文名叫基数树)。
radix tree简直就是为IP路由存储和查找而生的(实际上IP路由查找正是radix tree最常用的领域之一)。在存储IP数据,尤其是CIDR的时候,radix退化成一种二叉树,左右子树分别表示IP的二进制表示的1或者0,所以对于IPv4,radix 树的最大高度是32。对于CIDR的存储,只需要存储前缀位就可以了,比如存储130.50.30.40/18,只需要存储前18位即可,后面的14位不用存储,因为在查找ACL的时候,只要对比到第18位就可以确定是否让此IP通过验证。
BIND9中radix tree的实现比较复杂,可能是处于需要兼容IPv4和IPv6,以及IP地址的先后关系的考虑。
nginx中的geo模块也用radix tree存储CIDR形式的IP,core/ngx_radix_tree.c的实现还是相当短小精悍的。
相关文章推荐
- Launcher3源码分析 — bindWorkspaceItems的具体实现
- [Android源码分析]L2CAP的bind分析以及psm和cid的介绍和实现
- Win32 守护进程实现-- ACL 源码分析
- Launcher3源码分析 — bindScreen的具体实现
- ThreadPoolExecutor的应用和实现分析(下)—— 生命周期相关源码分析
- HashMap实现原理及源码分析
- 第二人生的源码分析(六十三)类Multi实现多请求
- 开放源代码的全文检索引擎Lucene――介绍、系统结构与源码实现分析
- 阿里巴巴Dubbo实现的源码分析
- HashMap实现原理及源码分析
- HashMap内部实现及源码分析
- nginx源码分析之hash的实现
- 第二人生的源码分析(三十二)消息解包的实现
- 阿里巴巴Dubbo实现的源码分析[转]
- 刷投票软件 --分析 -- 实现 ---源码
- BitSet数据结构以及jdk中实现源码分析
- Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(2)
- block实现源码分析3-深入研究Block捕获外部变量和__block实现原理
- struts2源码分析-IOC容器的实现机制(上篇)
- android仿iPhone滚轮控件实现及源码分析