最近由于需要用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;