合并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;
此条目发表在net分类目录。将固定链接加入收藏夹。