[原创]bind DNS IP列表的精确获取 - LSX - 博客园
公司准备自己实施CDN的项目:
这里有个关键的问题:
如何来实现智能化判断,智能化程度到市级别,当然精确度及考虑实用性,经过仔细的揣摩,改省级别,也就是智能DNS可以判断出来用户的访问是从那过来,具体到省的级别,其他公司的智能DNS最多也就能判断是:电信还是 网通 还是铁通,这只是线路的判断,今天所说的是更具体的识别方式,在网上找了几家做DNS的发现,他们都无法误别,我当时在想一些做CDN的如何来判断的呢,我百思不得其解,当然我的技术圈也不大,没有这方面的高人指点,所以只能根据自己的网络知识来做相关的技术分析,当然中间遇到很多问题,但最终还是成功了,这时我才明白,原来没有高人指点,也可以搞的定。
大家都知道关键的问题是IP的列表问题如何解决,当然这个问题,也是让我头痛了许久的问题,当时因为判断失误,我是到各个网站去查找相关的资料,到APNIC官网,下载相关的IP分配信息,当然APNIC的官网IP分配信息库也是挺大的,要一时的整理出来每一个IP是那个地区,更是一个体力话,当然也看到网上有通过相关代码实现IP归属地的方法,但识别的级别也只能到电信网通 各个ISP运营商之间,要想识别到省的级别那误差就相当大了,和没有误别差不了多少,最后我还是放弃了这条路,于是呼,开始到网上查相关的DNS列表,下载,当时想着,应该会有这方面的资料,毕竟CDN还是很多人用的,总要有人共享一下吧,可现实打击了我幼小的心灵,没有找到,郁闷。
经过头痛式的思考,我想到了纯真IP库,这东西引导我进入了一个正确方向,打开发现IP信息很多,准确度也相当的高,不定期的更新,总算看到太阳了,很美,开始想如何把这些列表都提取出来,归类,当然不可能手动一个一个复制,那就让计算机搞定吧,开始拿出来百年不用的MFC和C# 功底,头痛式的编程,程序搞定后那就开始提取列表了,很快,很舒服。
用户访问网址的原理:
用户请求DNS--DNS服务器查找本机如果没有则会转发请求让另外的DNS服务器来应答,一直到查到,最后查找到则DNS服务器会返回记录,当时我理解错误,以为是用户的本机IP会请求DNS,这里不要搞错,DNS的请求机制,要控制用户访问的服务器,还要从DNS入手,DNS服务器的IP很重要,有列表,犹如令牌。
本文章分为二个部分
第一部分为根据纯真IP库对全国地方包括港奥台地区所属IP进行格式转换,这部分是12年整理的。
第二部分是针对BIND的访问日志里面的记录进行整理获取的列表,这部分为10年整理的。
关于如何安装,配置,不在本文的讨论范围内(网上资料多的很)
第一部分
基本上这部分都是软件的使用说明
1、 下载纯真IP库
http://www.crsky.com/soft/2611.html
如何下载安装不在本文章讨论范围之内如果不会请问度娘(百度)
在非凡软件站下载并安装然后更新到最新版本界面如图
2、 解压IP库到文本文件
3、 用EiditPlus打开这个文本拖动到最后几行,删除多余的东西
删除尾部的这些就行了
上图是删除后的效果,记得保存
4、 导入到Access数据库
我用的是Access2010版本,其它的版本原理一样,选择外部数据,点文本文件,然后出来一框框,浏览我们刚才导出的那个文本文件即可。
5、 然后点确定进入下图
点击过确定会出现如图的情况,然后点高级,把字段3的那个宽度调整的大一点,因为这一列是地区信息,比较长,然后点确定,然后再点下一步,进入下图
再点下一步
再点下一步
选择,不要主键,再点下一步
这一步,点完成,等一会,导入完成,如图所示
会发现多了一个表,这个表名,记得一定要是ip这个名字,因为时间比较急,所以不是太友好,记得保存,还要记得保存成2003的格式。
保存即可,2010的另存为成2003的地方还真不好找。
上面的是几个文件
第一个是转换程序
第二个是纯真IP库程序
第三个是导出的IP库转换成Access的数据库
第四个是IP库的文本文件
第五个是纯真IP库的专用数据格式
第六个是我写的这个文章的文件
其中我们只需要二个文件
第一个和第三个其它你可以删除
6、 下面是程序转换使用
这是程序运行界面
生成方式:
全自动,会生成34个省份,四条线路的信息
自定义:就是自己选择要生成的地区,或者线路
其它的我想就不用我解释了,一看就知道了
第一步
确认生成方式,这里我选择全自动
然后选择数据库文件就是刚才我们导出的那个2003格式的数据库
然后点生成即可
生成中的图,采用多线程,所以界面不会卡死
然后会在这个程序的当前目录生成一个ACL的目录里面就是各地区的IP信息了,一个文件一个地区,一个文件里面会包含四个线路。
上图就是生成后的各个省份的文件
下图是打开一个最少的地区文件看一下结构,澳门地区的
然后大家就可以根据这些文件导入到bind里面了,如果这再不会,我就真没有办法了,不过另外要说的是,这是我最新的研究生成结果,还没有来得急测试,bind引入几M的文件会不会查询速度慢,或者启动慢,当我想,bind因为是加载到内存里面的,我想速度上面不会有太大差距,大家快快测试引入吧,一个精确的智能DNS就是这么的简单。
第二部分
以下内容,是对以上内容的初充,如果你在运行一段时间发现IP库还不全,就可以用以下方法,分析 DNS的日志来补充和生成这些列表信息
步骤如下:
一:从DNS日志里面提取other(就是没有识别出来的IP) 生成列表
#!/bin/bash
cp /etc/named/log/dns-query.log ~/
cat ~/dns-query.log|grep other|cut -f4 -d':'|cut -f1 -d'#'|cut -f3 -d' '>./DnsList.txt
cat /dev/null >/etc/named/log/dns-query.log
cat /dev/null >/etc/named/log/dns-alllogs
cat /dev/null >/etc/named/log/dns-logs
cat /dev/null >/etc/named/log/dns-warning
rm ~/dns-query.log解释如下:
第一行#!/bin/bash 我想不用说大家都知道
第二行复制日志到用户目录
第三行生成列表,这一句话是最关键的
第四、五、六、七、行清空日志
第八行移除用户目录日志文件因为这时我们不需它了
最后生成的列表样子如下:
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
文件名:DnsList.txt
这是下载到WINDOWS下面用UltraEdit打开的效果
只有是这样的格式,下面的程序才可以进行处理
代码可能冗余,当然也很简单,大家可以看看原理
这时我们已经有了无法识别的IP了,现在就要做这些IP列表进行分类了,拿出我的杀手剑:MFC处理程序
二:处理IP列表
这是程序运行的界面
原理:http://www.ip138.com/ips.asp?ip=查询IP&action=2对这个地址进行提交然后在返回的数据里面程序搜索相关的位置信息归类保存
当然这个东西对于高手而言,是很低级的东西,今天我也是冒死一分享
自己整的不好看了,功能有就行了,看点文档编写程序,我是够菜的了,因为没时间看线程方面的东西,所以就没有采用线程方式处理文件,在处理文件时可能界面会假死,只要不管它就行了,运行完自动停止
第二步:点击开始
生成三个文件夹:
文件夹里面是按地区进行归类的文本文件
里面内容如下
当然这些列表都是DNS服务器的地址,可以手动添加到bind的acl里面
我的ACL的格式如下:
每个省一个文件
文件里面的格式如下:
识别三个运营商
当然这个HeNan.acl的文件我以前都是手动创建的,最近感觉这样太傻冒了,于是升级了一下,用shell脚本自动化创建文件,效果非常不错。
虽然没有达到一键OK但这个效果我还是比较满意的
下面我们继续谈如何生成acl 文件
三:
1、创建data文件夹(这个文件夹和脚本有关系) 把cnc telcom tietong 三个文件夹放到里面用7-zip 压缩data文件夹,文件名为:data.tar
上传到LINUX服务器
红字是压缩包,tar xvf data.tar 解压到目录
里面的
0mysql.opt是操作数据库的
1list.create 是创建DnsList.txt的脚本
2db.import 是把IP列表存到数据库时面,这些都是贵重资源啊
3acl.create 这个就是创建acl的脚本
这些文件同样我也会一并上传,倡导:开源,开源,再开源,免费,免费,再免费
data 目录就是存放的按地区分类的文本文件了,可以称为数据源
./2db.import 执行
这时脚本会自动读取data文件夹下面的数据,并写入到数据库里面这是写入
./3acl.create 执行
这时脚本会自动读取数据库里面的数据,并保存为acl
note:有人会问,你为什么要多一步了,写到数据库里面,一来呢,我要保存以备以后使用,二来呢,我要靠数据库的unique约束来避免有重复的IP
这几步一执行就OK了,基本上是不用干体力活了。只是操作,操作流程
注意:
这里的数据库的生成脚本我也会一并上传,如果有什么地方不理解的大家也可以提问,如果那里写的比较低级的,大家不要骂我,我也是初级玩家,总要给我点机会改过吧,到此结束。
附件下载地址: