合并CIDR地址段

最近由于需要用iptables设置一些过滤规则,也有bind里配置acl的时候有合并地址段的需求。看了下cpan里有个现成的模块,几行代码就可以做这个合并工作。

#!/usr/bin/perl  
use strict;  
use warnings;  
use Net::CIDR::Lite;  
my $cidr = Net::CIDR::Lite->new;  
while (my $line=<>) {  
$cidr->add($line);  
}  
foreach my $line( @{$cidr->list} ) {  
print "$line\n";  
}

试了下把之前100多W个段合并到5K多个段。
另外如果习惯使用python的话也可以使用cidrize模块进行ip段的合并操作。

#!/usr/bin/env python  
import cidrize  
import sys  
import string  
def ipmerge(str):  
obj=cidrize.optimize_network_range(str)  
return ";\n".join(cidrize.output_str(obj).split(", "))+";"  
def main():  
if len(sys.argv)!=2:  
print "./ipmerge.py ipfile.txt"  
sys.exit(1)  
try:  
fd=open(sys.argv[1],"r")  
except IOError as e:  
print "open ip file failed,",e  
lines=""  
for line in fd:  
lines += line.rstrip(";\n")+","  
lines=lines.rstrip(",")  
print ipmerge(lines)  
if __name__ == "__main__":  
main()

测试输入的文件

192.168.1.3/30;  
192.168.1.6/30;  
192.168.3.3;  
  
pm@debian:~/temp$ ./ipmerge.py iplist  
192.168.1.0/29;  
192.168.3.3/32;