DNS:配置智能DNS时如何取得联通及北方公司的IP地址段(2011-04-19 17:14:19)

一、 大家都知道,可以通过bind9的DNS view功能来实现站点IP的智能解析。通过智能DNS,把用户引导到距他们最近的IDC机房去。电信的用户通过智能DNS能解到站点的电信机房,联通的用户则会解到站点的联通机房,南方的用户解到南方的机房,北方的用户解到北方的机房。要实现这个功能,最重要也是最难的一点是如何把联通及非电信的北方公司的IP地址段给抓出来。

在这里要说明的是,我们不是做CDN的,不会也没有必要把IP段细分到各个运营商及各个城市。因为我们的站点不会放到如此多的机房去。一般的情况是,我们的站点会各放到1~2个电信和联通机房里,以加快电信和联通用户的访问速度。

二、 下面说一下我们的思路,如何把联通的IP地址段及非电信的北方省份的地址段给找出来。只要把这些IP地址段给找出来,解析到联通站点,其它的IP解析到电信站点就可以了。当然,如果你有铁通的机房,下在的方法也可以把铁通的IP地址段给找出来。

1、到APNIC获取最新的IP段列表。

2、从这个列表中找出国内的IP地址段。

3、用whois从国内的地址段中找出联通、电信、铁通等各运营商,如果用whois无法分类,通过ASN号及名字来区别,进一步加强分类的准确性。

4、通过ip138找出各IP段所在的地理位置,跟据这些信息,找出非电信的北方省份或公司的地址段,这些也可以划到联通的ACL中去,进一步加强分类的准确性。

三、 最后,来说一下具体的实现方式。

1、到APNIC获取最新的国内IP段地址段。

   使用脚本:


cmdHome=dirname $0
apnicFile=$cmdHome/apnic
apnicCnFile=$cmdHome/apnic.cn
apnicUrl=’http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
wget $apnicUrl -O $apnicFile

2、从这个列表中找出国内的IP地址段

使用脚本:


cat $apnicFile | grep ‘apnic|CN|ipv4|’ | awk -F’|’ ‘{print $4”,”$5}’ > $apnicCnFile

function log2
{       
        let result=$1
        if [ "$result" -le 1 ] 
        then
                echo $pw
        else    
                let pw--
        log2 "(($result/2))"
         fi
 }

 for i in `cat $apnicCnFile | awk -F, '{print $2}' | sort -u`
do
        cnt=$i;
        pw=32
        mask=`log2 $i`
        cat $apnicCnFile | sed -e "s/$cnt/$mask,$cnt/g" > $apnicCnFile.raw
        cat $apnicCnFile.raw > $apnicCnFile 
done


脚本说明:

   1)把文件中属于中国的IP段和Count数两列取出来,放到$apnicCnFile文件中

   2)生成一个log2的子程序,用于把Count数转化成Mask,这个子程序使用的递归,非常经典 

   3)把$apnicCnFile文件中的内容转化成IP,MASK,COUNT格式

3、用whois从国内的地址段中找出联通、电信、铁通等各运营商或其它公司名,如果用whois无法分类,通过ASN号及名字来区别,进一步加强分类的准确性。   

  使用脚本:

> $cmdHome/IP

function getNetname
{
        ip=`echo $1 | awk -F',' '{print $1"/"$2}'`
        cnt=`echo $1 | awk -F',' '{print $3}'`
        netname=`whois $ip | grep 'netname:' | head -1 | sed -e "s/netname: \+//g"`
        asn=`whois $ip -h whois.cymru.com | grep -v 'AS Name' | tail -1| sed -e "s/ \+| \+/,/g" | awk -F',' '{print $1}'`
        as_str=`whois AS$asn | grep as-name | head -1 | sed -e "s/as-name: \+//g"`
        echo $i,$netname,$asn,$as_str
}    

for i in `cat $apnicCnFile`
do
        getNetname "$i" >> $cmdHome/IP 
done


脚本说明:

     1)getNetname子程序用$apnicCnFile文件中的IP和mask通过 whois来获取运营商信息、ASN号、ASN string。

      通过脚本中的netname,asn,asn_str已经可以确认90%以上的IP段运营商信息了,如果还有一些不能确认,我们再做下面的操作。

4、 通过ip138找出各IP段所在的地理位置,跟据这些信息,找出非电信的北方省份或公司的地址段,这些也可以划到联通的ACL中去,进一步加强分类的准确性。 

  使用脚本 :


function getInfo
{
wget ‘http://www.ip138.com/ips8.asp‘ –post-data=”action=2&ip=$1” -O - 2> /dev/null | grep “本站点数据” | sed -e “s/ +//g” -e “s/\t+//g “ | awk -F “£º” ‘{print $2}’ | awk -F “<” ‘{print $1}’
}

> IPinfo.txt
for i in `cat IP `
do
        ip=`echo $i | awk -F, '{print $1}'`
        mask=`echo $i | awk -F, '{print $2}'`
        cnt=`echo $i | awk -F, '{print $3}'`
        ispname=`echo $i | awk -F, '{print $4}'`
        asname=`echo $i | awk -F, '{print $6}'`
        echo  $ip,$mask,$cnt,$ispname,$asname,`getInfo $ip` >> IPinfo.txt &
done


脚本说明:

     1)getInfo子程序用于根据IP段,到ip138来查找IP相关的地理及运营商中文信息。

   IPinfo.txt输出内容举例:

     27.115.0.0,17,32768,UNICOM-SH,CNCGROUP-SH,上海市联通
这样,我们就有了APNIC的ispname信息,whois.cymru.com的asname信息,ip138的中文信息,有这三个信息,我们可以确认95%以上的联通IP段及非电信的北方IP段了。我看了一下,从APNIC下来的国内IP段有3386个,要从这3千多条信息中整理出你想要信息的,可能会花点时间,但还是可行的。如果相关信息相冲突,基本的原则是APNIC>IP138>cymru
坚持原创技术分享,您的支持将鼓励我继续创作!