一、 大家都知道,可以通过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