其实这个标题名字不规范,应该叫做how to deaggregate ip ranges in linux
但是deaggregate ip ranges这个语句实在是不好翻译啊。
我先说下需求把,我们从纯真数据库中获得了这样的IP地址信息:
58.63.253.0 58.63.253.255 广东省广州市 世纪互联
59.151.0.0 59.151.53.255 北京市 世纪互联IDC机房
119.37.0.0 119.37.191.255 上海市 世纪互联
120.132.128.0 120.132.150.93 北京市 世纪互联(国际信息中心机房)
120.132.150.95 120.135.255.255 北京市 世纪互联(国际信息中心机房)
我们现在需要把它变成这种形式:
58.63.253.0/24 这种标准形式,这样就可以在iptables里面加相关策略了。
一开始,我们想到了将IP地址转变为数字,然后数字做加减,最后再将得到的数字转换为IP,这样就可以得到0.0.0.255这样的反掩码[Wildcard Mask],之后将反掩码变换成掩码就可以了。
在php中有个函数ip2long可以实现。以下使部分代码:
<!--?php
$IP1="58.63.253.0";
$low=ip2long($IP1);
$IP2="58.63.253.255";
$high=ip2long($IP2);
$result=$high-$low;
echo $result; echo "\n";
echo long2ip($result);
?-->
还是有些麻烦,于是继续搜索资料,终于我们发现了一个叫做ipcalc的程序。
这个程序并不是Linux自带的ipcalc,因为RedhatLinux自带的这个ipcalc功能太少,满足不了我们的需求。
我们从ipcalc官网下载了新版http://jodies.de/ipcalc-archive/
其实ipcalc就是一个perl文件,可以直接使用vi编辑的。
ipcalc带有的Deaggregate address range.功能可以实现我们的需求。
于是就有了这样的方法:
将IP地址文件变成如下格式(中间带减号sed实现):
58.63.253.0 – 58.63.253.255
59.151.0.0 – 59.151.53.255
然后,我们从网上找到了很NB的语句
#cat ipranges.txt
213.87.86.160-213.87.86.193
213.87.87.0-213.87.88.255
91.135.210.0-91.135.210.255
#/bin/grep - ipranges.txt | while read line; do ipcalc $line ; done | grep -v deag
213.87.86.160/27
213.87.86.192/31
213.87.87.0/24
213.87.88.0/24
91.135.210.0/24
好了,就是这样了。
上面语句的出处是:
http://www.commandlinefu.com/commands/view/5420/deaggregate-ip-ranges
转载请注明:IPCPU-网络之路 » linux如何实现IP地址汇总,以掩码方式显示