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