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