#ソース
##URL
https://github.com/INC-i/CCstuff
##各ファイルの説明
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"
}
}
まだありますので、続けて更新します。
ご意見、ご要望ございましたら、コメントいただけると幸いです。