Skip to content

Instantly share code, notes, and snippets.

@informationsea
Last active December 22, 2015 01:29
Show Gist options
  • Save informationsea/6397225 to your computer and use it in GitHub Desktop.
Save informationsea/6397225 to your computer and use it in GitHub Desktop.
Make IP address list of Japan
#!/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