16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
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"
}
}

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?