Last active
December 22, 2015 01:29
-
-
Save informationsea/6397225 to your computer and use it in GitHub Desktop.
Make IP address list of Japan
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# Copyright (C) 2013 Yasunobu OKAMURA | |
# GPLv3 or later | |
import argparse | |
import ipaddress # pip install py2-ipaddress | |
def inverse_range(addr_range): | |
""" | |
Arguments: | |
- `addr_range`: | |
""" | |
num_range = list() | |
last = None | |
for one in addr_range: | |
start = int(one[0]) | |
end = int(one[-1]) | |
#print one[0], one[-1], ipaddress.IPv4Address(end+1) | |
if len(num_range) > 0 and num_range[-1][1]+1 >= start: | |
num_range[-1] = (num_range[-1][0], end) | |
else: | |
num_range += [(start, end)] | |
last = one | |
new_addr_range = list() | |
START = 0 | |
END = (1 << 32)-1 | |
last_end = START | |
for one in num_range: | |
new_addr_range += list(ipaddress.summarize_address_range(ipaddress.IPv4Address(last_end), ipaddress.IPv4Address(one[0]-1))) | |
last_end = one[1]+1 | |
new_addr_range += list(ipaddress.summarize_address_range(ipaddress.IPv4Address(last_end), ipaddress.IPv4Address(END))) | |
return new_addr_range | |
def _main(): | |
parser = argparse.ArgumentParser(description="Make iptables filter") | |
parser.add_argument('apnic', default='delegated-apnic-latest', nargs='?', | |
help='APNIC ip address assignment list (http://ftp.apnic.net/stats/apnic/delegated-apnic-latest)') | |
parser.add_argument('-v', '--inverse', action='store_true', help='Inverse address range') | |
parser.add_argument('-p', '--private', action='store_true', help='Add private address to list') | |
parser.add_argument('-l', '--loopback', action='store_true', help='Add loopback address to list') | |
parser.add_argument('-m', '--multicast', action='store_true', help='Add mulitcast address to list') | |
parser.add_argument('-i', '--linklocal', action='store_true', help='Add link local address to list') | |
parser.add_argument('-s', '--special', action='store_true', help='Add private, loopback, multicast, link local address to list') | |
options = parser.parse_args() | |
addr_range = list() | |
if options.private or options.special: # RFC 1918 | |
addr_range.append(ipaddress.ip_network('10.0.0.0/8')) | |
addr_range.append(ipaddress.ip_network('172.16.0.0/12')) | |
addr_range.append(ipaddress.ip_network('192.168.0.0/16')) | |
if options.linklocal or options.special: # RFC 3330 | |
addr_range.append(ipaddress.ip_network('169.254.0.0/16')) | |
if options.multicast or options.special: # RFC 3330 | |
addr_range.append(ipaddress.ip_network('224.0.0.0/4')) | |
if options.loopback or options.special: # RFC 3330 | |
addr_range.append(ipaddress.ip_network('127.0.0.0/8')) | |
with file(options.apnic) as f: | |
for line in f: | |
if not line.startswith('apnic|JP|ipv4|'): | |
continue | |
elements = line.strip().split('|') | |
start = ipaddress.ip_address(elements[3]) | |
value = int(elements[4]) | |
end = start+(value-1) | |
addr_range += list(ipaddress.summarize_address_range(start, end)) | |
addr_range = list(ipaddress.collapse_addresses(addr_range)) | |
addr_range.sort() | |
if options.inverse: | |
addr_range = inverse_range(addr_range) | |
for one in addr_range: | |
print str(one) | |
if __name__ == '__main__': | |
_main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment