LoginSignup
16
17

More than 5 years have passed since last update.

IPアドレス<=>国、国<=>AS番号、IPアドレス<=>10進整数、IP/CIDR<=>maxIP,minIPの変換、検索ができるライブラリ(IPv4,IPv6両対応)

Last updated at Posted at 2015-05-01

ソース

URL

各ファイルの説明

sqlディレクトリ : RIRデータベースの作成、テーブル検索に必要なSQLを格納
ccstuff.php : ライブラリ(PHP版)
ccstuff.py : ライブラリ(Python版)
iptocc : コマンド、詳細については下記、「標準入力のIPアドレス部分に国コード、国名を挿入」をご参照ください。
iso3166-1 : 国コードと国名の対応表
makerirdb : RIRデータベースを作成するコマンド
rirdb : makerirdbで作成したRIRデータベース。makerirdbで更新できます。
rirlist : 各RIRのURL
※makerirdbでエラーが発生した際は、URLが更新されている可能性がありますので、
 URLを修正することで、解消できる可能性があります。

機能の概要

  • IPアドレスから国、RIR、割り当て状態、割り当て日時を出力
  • 国コードからIPアドレスを出力  (.htaccessやiptablesなどのアクセス制御で利用可能)
  • IPアドレス⇔整数の変換、正規表現でのマッチ、asnの検索など

アピールポイント

  • 国の特定が割りと速いかも (標準入力のIPアドレス部分に国コード、国名を挿入することもストレスなく可能。 詳しくは、下記、「標準入力のIPアドレス部分に国コード、国名を挿入」を ご参照ください。)
  • IPv6にも対応
  • 軽量(データベース含め、40MB程度(今のところ)) ※1レコード、1IP、国ではなく1レコード、IP帯、国で登録されています。  また、同じ国でIP帯が連続している場合はまとめています。
  • 外部サーバーとの通信が発生しない(DB作成時のみ発生)
  • データベースはコマンドで更新が可能

2種類あります

  • Python 2.6 で開発
  • PHP 5.3 で開発 (RIRデータベース構築メソッドは含まない)

動作環境

  • Linuxで上のバージョンと互換性があれば、無問題かと存じます。

※RIRデータベースの作成、更新をされる場合、Pythonは必須です。

使い方

0.RIRデータベースの作成

※上記URLに作成済みのRIRデータベースがありますが、
 更新されたい場合などにご利用ください。

makerirdbコマンドでRIRデータベースの作成が可能です。
※実行には、ccstuff.pyが必要です。

makerirdb [データベースファイル名]
※データベースファイル名を省略した場合は、rirdbが作成されます。

Python版では以下の方法でも可能です。

import ccstuff
obj = ccstuff.rir()
obj.createdb() または obj.createdb('データベース名')
※データベース名を指定しない場合、rirdbというファイル名で作成されます。

1.インスタンス化

Python版

import ccstuff
obj = ccstuff.rir() または obj = ccstuff.rir('dbファイルのパス')

PHP版

require_once 'ccstuff.php';
$obj = new RIR();
または $obj = new RIR("dbファイルのパス");

※dbファイルを指定しない場合は、rirdbが存在すれば、読み込み、
 存在しなければ、PHP版では例外発生、Python版では、DBに接続しない。

※Python版では、set_db('dbファイルのパス')で後から接続可。

2.IPアドレスから国を特定

Python版

IPv4の場合

obj.ipv4tocc('IPv4アドレス')
※戻り値は国2コード、str型です。

IPv6の場合

obj.ipv6tocc('IPv6アドレス')
※戻り値は国2コード、str型です。

PHP版

IPv4の場合

$obj->ipv4tocc('IPv4アドレス');
※戻り値は国2コード

IPv6の場合

$obj->ipv6tocc('IPv6アドレス');
※戻り値は国2コード

3.国からIPアドレスのリストを出力

Python版

IPv4の場合

obj.cctoipv4s('JP')
※戻り値は、ip/cidrのリスト

IPv6の場合

obj.cctoipv6s('JP')
※戻り値は、ip/cidrのリスト

PHP版

IPv4の場合

$obj->cctoipv4s('JP')
※戻り値は、ip/cidrの配列

IPv6の場合

$obj->cctoipv6s('JP')
※戻り値は、ip/cidrの配列

4.国コードから国名を特定

Python版

obj.cctoname('JP')
※戻り値は国名の英語、日本語表記のリスト(要素はunicode型)

PHP版

$obj->cctoname('JP')
※戻り値は国名の英語、日本語表記の配列(要素はstring型)

5.標準入力のIPアドレス部分に国コード、国名を挿入

iptoccコマンドを利用します。
※ccstuff.pyが必要です。

ご利用方法1

iptocc IPアドレス

出力内容:ip,国2コード,国名(英語)

ご利用方法2

コマンド1 | iptocc

出力内容:コマンド1の標準出力のIPアドレスの部分に国コードと国名(英語)が挿入されます。

※-jを指定すると、国名が日本語になります。
※このコマンドはipv6には対応していません。

6.IPアドレスから整数(10進数)への変換

Python版

IPv4の場合

obj.ipv4ton('255.255.255.255')
4294967295

IPv6の場合

obj.ipv6ton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF')
340282366920938463463374607431768211455L

PHP版

IPv4の場合

echo $obj->ipv4ton('255.255.255.255');
4294967295

IPv6の場合

echo $obj->ipv6ton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF');
340282366920938463463374607431768211455
※↑string型です

7.整数(10進数)からIPアドレスへの変換

Python版

IPv4の場合

obj.ntoipv4(4294967295)
'255.255.255.255'

IPv6の場合

obj.ntoipv6(340282366920938463463374607431768211455L)
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'

PHP版

IPv4の場合

echo $obj->ntoipv4(4294967295);
255.255.255.255

IPv6の場合

※pythonと異なり、string型で渡す必要があります。
echo $obj->ntoipv6('340282366920938463463374607431768211455');
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

8.IP/cidrからIPアドレスの最小、最大への変換

Python版

IPv4の場合

obj.getiprangebycidr('192.168.1.0/24')
['192.168.1.0', '192.168.1.255']

IPv6の場合

obj.getiprangebycidr('0000:0000:0000:0000:0000:0000:0000:0000/124')
['0000:0000:0000:0000:0000:0000:0000:0000', '0000:0000:0000:0000:0000:0000:0000:000f']

PHP版

IPv4の場合

var_dump($obj->getiprangebycidr('192.168.1.0/24'));
array(2) {
[0]=>
string(11) "192.168.1.0"
[1]=>
string(13) "192.168.1.255"
}

IPv6の場合

var_dump($obj->getiprangebycidr("0000:0000:0000:0000:0000:0000:0000:0000/124"));
array(2) {
[0]=>
string(39) "0000:0000:0000:0000:0000:0000:0000:0000"
[1]=>
string(39) "0000:0000:0000:0000:0000:0000:0000:000f"
}

9.IPアドレスの最小、最大からIP/cidrへの変換

Python版

IPv4の場合

obj.getcidrsbyiprange('192.168.1.0', '192.168.1.255')
['192.168.1.0/24']

IPv6の場合

obj.getcidrsbyiprange('::0', '::f')
['0000:0000:0000:0000:0000:0000:0000:0000/124']

PHP版

IPv4の場合

var_dump($obj->getcidrsbyiprange('192.168.1.0', '192.168.1.255'));
array(1) {
[0]=>
string(14) "192.168.1.0/24"
}

IPv6の場合

var_dump($obj->getcidrsbyiprange('::0', '::f'));
array(1) {
[0]=>
string(43) "0000:0000:0000:0000:0000:0000:0000:0000/124"
}

10.AS番号から国コードを検索

Python版

obj.asntocc(173)
u'JP'

PHP版

echo $obj->asntocc(173);
JP

11.国コードからAS番号のリストを検索

Python版

len(obj.cctoasns('US'))
21927
※上は戻り値の配列の長さ=AS番号の個数です。
※cctoasns()の戻り値はAS番号のリストです。

PHP版

echo count($obj->cctoasns('US'));
21927
※上は戻り値の配列の長さ=AS番号の個数です。
※cctoasns()の戻り値はAS番号の配列です。

12.IPアドレス、AS番号から、国、RIR、割り当て状態、割り当て日を出力

Python版

IPv4アドレス

obj.getririnfo("8.8.8.8")
[(u'US', u'arin', u'allocated', u'19921201')]

IPv6アドレス

obj.getririnfo("2404:6800:4004:80a::1003")
[(u'AU', u'apnic', u'allocated', u'20080930')]

AS番号

※AS番号を引数にする際は、str型ではなく、intまたはlong型です。
obj.getririnfo(173)
[(u'JP', u'apnic', u'allocated', u'20020801')]

PHP版

IPv4アドレス

var_dump($obj->getririnfo('8.8.8.8'));
array(1) {
[0]=>
array(4) {
[0]=>
string(2) "US"
[1]=>
string(4) "arin"
[2]=>
string(9) "allocated"
[3]=>
string(8) "19921201"
}
}

IPv6アドレス

var_dump($obj->getririnfo("2404:6800:4004:80a::1003"));
array(1) {
[0]=>
array(4) {
[0]=>
string(2) "AU"
[1]=>
string(5) "apnic"
[2]=>
string(9) "allocated"
[3]=>
string(8) "20080930"
}
}

AS番号

※AS番号を引数にする際は、string型ではなく、integer型です。
var_dump($obj->getririnfo(173));
array(1) {
[0]=>
array(4) {
[0]=>
string(2) "JP"
[1]=>
string(5) "apnic"
[2]=>
string(9) "allocated"
[3]=>
string(8) "20020801"
}
}

まだありますので、続けて更新します。
ご意見、ご要望ございましたら、コメントいただけると幸いです。

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17