|目次|更新履歴|概要|検索窓|LAN用|imWHOISの設置|更新と改造|データ生成|
作成日:2004年01月02日、更新日:2005年03月23日 作成:鷹の巣Meta-WhoisのCGIであるCGI倶楽部さんのimWHOISのデータを自動更新する方法について説明します。
最新版のデータは、「IPv4アドレス-WHOISサーバ対応リスト(rirs_a.list)」と「国コード-WHOISサーバ対応リスト(tld_a.list)」にあります。
目次
ネットワーク管理者にとって、whois(管理情報の公開データベース)サーバーのホスト名を自動選択してくれるMeta-Whoisは、imWHOISの設置方法(インターネット用CGI)で示しています様にとても便利です。このCGI(imWHOIS)がPerlのスクリプトで、CGI倶楽部さんのimWHOISから無料で配布されています。しかし、このimWHOISに使用されているtld.listとrirs.listのデータは、2001年10月19日と古く、2004年を越えた現在では、IPアドレスを入力して、その所属組織を調べる場合やinfoドメイン等を入力した場合に正確な結果を表示することが出来なくなりました。そこで、このimWHOISで使用されているデータを自動更新するPerlスクリプトを作成することにしました。尚、冒頭で述べました様に自動更新する為にデータ構造を簡単にし、一部応答性を犠牲にしている部分がありますが、実用上全く問題ありません。
imWHOISに使用されているデータのIPv4アドレス-WHOISサーバ対応リスト(rirs.list)と国コード-WHOISサーバ対応リスト(tld.list)の一般的な更新方法は、以下の様になります。
IANA | Generic Top-Level DomainsからgTLDのwhoisサーバーやURLを見つけ、IANA | Root-Zone Whois Index by TLD CodeからccTLDのwhoisサーバーやURLを見つけて、更新します。
country code TLD world mapに記載されている様に200個近くある国コード毎に調べるのは、簡単ではありません。
IPアドレスの元締めであるIANA | Abuse Issues and IP AddressesのINTERNET PROTOCOL V4 ADDRESS SPACEが基本になります。これにJPNICのデータベースのJPNIC管理下でAPNICが逆引きの管理を行っているIPアドレスやJPNICが逆引きの管理を行っているIPアドレス(2003年3月12日現在)を見て、JPNICのwhoisサーバーのwhois.nic.ad.jpを加えて修正します。これを加えることにより、問合せ先がwhois.nic.ad.jpの場合には、日本語で表示される様になります。
私も更新をちょっとやって見ましたが、大変な作業です。また、JPNICの管理下のIPアドレスでも問合せると一部whois.nic.ad.jpのサーバーが「該当するデータがありません。」を返すものがありました。従って、上記のJPNICのWebページで公開されているIPアドレスを信用せずにアジア/太平洋圏のAPNIC管理下のIPアドレスについては、まずJPNICに問合せて、参照先としてAPNIC WHOIS(whois.apnic.net)を返したものだけをAPNICに問合せる算法(アルゴリズム)としました。この算法にすることで、rirs.listの内容が簡素になり、自動更新が容易になりました。
imWHOISに使用されているwhoisサーバーのデータ(tld.listとrirs.list)をこのMeta-Whois Gatewayサービスでは、日本標準時で毎週月曜日午前5時から所要時間2~3分で、更新しています。冒頭で述べました様に更新後の最新版のデータは、「国コード-WHOISサーバ対応リスト(tld_a.list)」と「IPv4アドレス-WHOISサーバ対応リスト(rirs_a.list)」で公開しています。更新の方法は色々ありますが、一例を下記に示します。
コマンドの実行例(以下の画面は、Windows XP HOME Editionのコマンドプロンプト画面での実行例を示しています。)
C:\>D: <---wgetの実行ファイルのあるドライブに移動。 D:\>cd \WWW\bin\wget <---wgetの実行ファイルのあるディレクトリ(フォルダ)に移動。 D:\WWW\bin\wget>del tld_a.list.txt <--- tld_a.list.txtを削除する。 D:\WWW\bin\wget>del rirs_a.list.txt <---rirs_a.list.txtを削除する。 D:\WWW\bin\wget>wget http://whois.sakaguch.com/DownLoad/tld_a.list.txt <--- tld_a.list.txtをダウンロードする。 D:\WWW\bin\wget>wget http://whois.sakaguch.com/DownLoad/rirs_a.list.txt <---rirs_a.list.txtをダウンロードする。 D:\WWW\bin\wget>copy tld_a.list.txt D:\www\cgi-lib\whois\tld_a.list /V /Y <---imWHOISのディレクトリに上書き複写する。 D:\WWW\bin\wget>copy rirs_a.list.txt D:\www\cgi-lib\whois\rirs_a.list /V /Y <---imWHOISのディレクトリに上書き複写する。
PC-UNIXユーザーは、68user's pageさんのジャンル別コマンド一覧に、Windowsユーザーは、DOS/Vコマンド・リファレンス BY FPCUの●ネットワーク関連のコマンドに使用可能なコマンドの一覧が記載されています。上記の例では、ダウンロードに成功した後に元々あったtld.listとrirs.listのディレクトリにtld_a.listとrirs_a.listを複写する様にしています。又、ダウンロードするファイルを一旦、削除しているのは、ダウンロードするファイル名がWGETコマンドにより、変更されるのを防止しています。
UpdateImWhoisData.batの実行例(以下の画面は、Windows XP HOME Editionのコマンドプロンプト画面での実行例を示しています。)
C:\>UpdateImWhoisData.bat
C:\>REM @echo off
C:\>REM wgetの実行ファイルのあるドライブに移動。
C:\>D:
D:\>REM wgetの実行ファイルのあるディレクトリ(フォルダ)に移動。
D:\>cd \WWW\bin\wget
D:\WWW\bin\wget>REM tld_a.list.txtを削除する。
D:\WWW\bin\wget>del tld_a.list.txt
D:\WWW\bin\wget>REM rirs_a.list.txtを削除する。
D:\WWW\bin\wget>del rirs_a.list.txt
D:\WWW\bin\wget>REM tld_a.list.txtをダウンロードする。
D:\WWW\bin\wget>wget http://whois.sakaguch.com/DownLoad/tld_a.list.txt
--22:27:42-- http://whois.sakaguch.com:80/DownLoad/tld_a.list.txt
=> `tld_a.list.txt'
Connecting to whois.sakaguch.com:80... connected!
HTTP request sent, awaiting response... 200 Document follows
Length: 7,244 [text/plain]
0K -> ....... [100%]
22:27:42 (6.91 MB/s) - `tld_a.list.txt' saved [7244/7244]
D:\WWW\bin\wget>REM rirs_a.list.txtをダウンロードする。
D:\WWW\bin\wget>wget http://whois.sakaguch.com/DownLoad/rirs_a.list.txt
--22:27:42-- http://whois.sakaguch.com:80/DownLoad/rirs_a.list.txt
=> `rirs_a.list.txt'
Connecting to whois.sakaguch.com:80... connected!
HTTP request sent, awaiting response... 200 Document follows
Length: 6,326 [text/plain]
0K -> ...... [100%]
22:27:42 (6.03 MB/s) - `rirs_a.list.txt' saved [6326/6326]
D:\WWW\bin\wget>REM imWHOISのディレクトリに上書き複写する。
D:\WWW\bin\wget>copy tld_a.list.txt D:\www\cgi-lib\whois\tld_a.list /V /Y
1 個のファイルをコピーしました。
D:\WWW\bin\wget>REM imWHOISのディレクトリに上書き複写する。
D:\WWW\bin\wget>copy rirs_a.list.txt D:\www\cgi-lib\whois\rirs_a.list /V /Y
1 個のファイルをコピーしました。
D:\WWW\bin\wget>
注)Windows版のWGETコマンドでは、ダウンロードしたファイルのタイムスタンプは、14時間少なくなっていました。
CGI倶楽部さんのimWHOISが稼動されているサイト用の説明なので、以下の説明は、不要かもしれませんが、念のためにディレクトリ(フォルダ)の配置例やim_whois.cgi用設定ファイルの変更方法やim_whois.conf.cgiファイルの設定例を示しておきます。但し、項dのim_whois.cgiファイルの改造は、実施して下さい。
imWHOISのCGIの入手と設置
既にWebサーバー上で、CGI倶楽部さんのimWHOISが稼動しているものとします。稼動されていない場合は、CGI倶楽部さんのimWHOISの設置方法(インターネット用CGI)をご参照願います。私は、Windows 2000 Professionalの自宅サーバー(AN HTTPD)に設置しています。
設定ファイル名の変更とライブラリディレクトリ(フォルダ)の配置例
まず、設定ファイル名をim_whois.confよりim_whois.conf.cgiに変更して、WWWサーバーを通して設定ファイルが見えないようにします。また、下図のようにライブラリファイルが入ったディレクトリ(フォルダ)をWebサーバーのCGIの実行パスの「cgi-bin」というディレクトリ(フォルダ)の外に移動させます。(外といっても、Webサーバーのドキュメントルート下には、設置しないで下さい。)
以下の様にtld.listとrirs.listの同じディレクトリ(フォルダ)のD:\www\cgi-lib\whoisにtld_a.listとrirs_a.listを自動作成する様にします。
ディレクトリ(フォルダ)の配置例
□解凍して出来たディレクトリ(フォルダ)の配置例(変更前)□ D:\www\cgi-bin\whois\imWHOIS\im_whois.cgi | \im_whois.conf | \im_whois_check.cgi \lib \pwhosi.pl \rirs.list \tld.list □解凍して出来たディレクトリ(フォルダ)の配置例(変更後)□ D:\www\cgi-bin\whois\im_whois.cgi | \im_whois.conf.cgi <--- WWWサーバーを通じて設定ファイルが見れないようにファイル名を変更する。※1 | \im_whois_check.cgi<--- このファイルは不要なので、削除するかファイル名を変更する。 \cgi-lib\whois\pwhosi.pl <--- ライブラリのディレクトリをWWWサーバーの実行パスの外に移動する。※2 \rirs.list \rirs_a.list <--- 自動生成されたIPv4アドレス-WHOISサーバ対応リスト \tld.list \tld_a.list <--- 自動生成された国コード-WHOISサーバ対応リスト □WWWサーバーのURL□ http://www.example.com/cgi/whois/im_whois.cgi http://www.example.com/cgi/whois/im_whois_check.cgi <--- これは、WWWサーバーから実行できなくする。
im_whois.cgi用設定ファイルの変更
im_whois.cgi用設定ファイル(im_whois.conf.cgi)のtld.listとrirs.listの相対パス(im_whois.cgi基準)を設定します。自動生成されるファイル名は、「_a」を付加していますので、下記のim_whois.conf.cgiファイルの設定例の赤字の様に設定して下さい。
注)im_whois.cgi用設定ファイル名は、im_whois.confをim_whois.conf.cgiに変更しています。
ライブラリのディレクトリを移動しているので、pwhois.plとtld.listとrirs.listのim_whois.cgiからの相対パスを変更しています。
im_whois.conf.cgiファイルの設定例
# =================
# ユーザ変数
# =================
# pwhois.plの相対パス(im_whois.cgi基準)
$pwhois_pl = '../../cgi-lib/whois/pwhois.pl'; # <------- ライブラリのディレクトリを移動したのに伴う変更。※2
# tld.listの相対パス(im_whois.cgi基準)
$tld_list = '../../cgi-lib/whois/tld_a.list'; # <------ 自動更新されたファイル名のtld_a.listに変更します。
# rirs.listの相対パス(im_whois.cgi基準)
$rirs_list = '../../cgi-lib/whois/rirs_a.list'; # <--- 自動更新されたファイル名のrirs_a.listに変更します。
# whoisコマンドの絶対パス(Socket利用の場合は '')
$whois = ''; # <--- Windowsサーバーの場合は、Socketを利用するので、そのまま。
# whoisコマンドのフォーマット(whoisコマンド使用時のみ有効)
# 0で whois -h whoisserver domain (UNIX)形式
# 1で whois domain@whoisserver (Linux)形式
$wformat = 0; # <--- Windowsサーバーの場合は、Socketを利用するので、そのまま。
# 時間表示オフセット値(秒数で指定)
$tm_offset = 0;
# リンク元制限(設定したURL下のリンクでないと利用できなくなる)
# 注) ''とした場合は設置サーバからのリンクを受け入れる.
# 注) *は正規表現の.*と同じである.
# 注) わからない場合は 'http://*'とし、第三者にpwhoisの存在を教えないこと.
# 例) $allow_referer = 'http://servername/~myid/*'; # 自サイトから受入
# $allow_referer = 'http://*'; # 全リンク受け入れ
# $allow_referer = ''; <--- このままでは利用出来ないので、コメント行に変更。
$allow_referer = 'http://www.example.com/*'; # <--- インターネットWWWサーバーとして公開する場合に自サイトのみから受付とする。
・・・後略・・・
im_whois.cgiファイルの改造
im_whois.cgiファイルをエディタで開き、下記の赤字部分を追加または変更します。この変更により、
この変更を行なわない場合は、ドメイン名検索が最初のwhoisサーバーの応答結果表示になったり、IPアドレス検索がJPNICに問合せなくなり、JPNIC管理下のIPアドレスを入力した結果は、全てAPNICの英語表記となったりします。
im_whois.cgiファイルの改造例
#!/usr/local/bin/perl
# ===========================================================================
# im_whois.cgi ver1.05
# Copyright (C) 2000-2001 pika@cgi-club.com
# IPv4アドレス・ドメイン名から所属組織を調査するスクリプト
# ===========================================================================
#local $SIG{__WARN__}=sub{&printMime;print "<pre>$_[0]</pre>\n";};
# =================
# 設置方法・使用方法
# =================
# im_whois.confを参照のこと.
# =================
# ユーザ変数
# =================
# im_whois.confの相対パス
$im_whois_conf = './im_whois.conf.cgi'; # <--- 設定ファイル名を変更したのに伴う変更。※1
# =================
# 更新履歴
# =================
# [2001/11/07] v1.05
# リンク元制限が効かないバグを修正
# [2001/11/04] v1.04
# ソース全面修正(コア部分をパッケージ化)
# Socketライブラリ利用に対応
# WHOISサーバ自動選択に対応
# [2001/10/16] v1.03
# FORMタグのtarget指定廃止
# [2001/01/26] v1.02
# http://www.japu.org/指摘のセキュリティバグに対処
# [2000/12/26] v1.01
# JPNIC以外のデータベース、ドメイン名入力に対応
# [2000/01/011] v1.00
# im_whois_le.cgiを全面変更
# END_HEADER
$version = sprintf("%d.%02d",q$ 1.05 $ =~ /(\d+)\.(\d+)/);
&init;
require $im_whois_conf;
require $conf'pwhois_pl;
# 2004.03.04 外部問い合わせに応じないwhoisサーバー対策
# 例.不良whoisサーバー=whois.enom.com、代替whoisサーバー=whois.networksolutions.com
%rep_list = (
"whois.enom.com","whois.networksolutions.com",
"","",
"",""
);
&getQuery(*fd);
@allow = &allowUrl($conf'allow_referer);
unless($allow[0]){
$fd{'ipd'} = '';
$out .= "<!-- $allow[1] -->\n";
}
if($fd{'tld'}){
$ipd = '';
$nic = $fd{'tld'};
$out .= "<b>TLD List</b>\n";
$out .= &pwhois'tld_list($conf'tld_list);
} elsif($fd{'ipd'}){
$ipd = $fd{'ipd'};
$nic = $fd{'nic'};
$ipd = &pwhois'check_ipd($ipd);
$nic = &pwhois'check_ipd($nic) if $nic;
$nic = &pwhois'rirs2nic($ipd,$conf'rirs_list) if !$nic && $ipd ;
# 改造開始 2003.01.02
# $nic = &pwhois'tld2nic($ipd,$conf'tld_list) if !$nic && $ipd; <---コメント行にします。
# $out = &pwhois'out($ipd,$nic,$conf'whois,$conf'wformat) if $nic && $ipd; <---コメント行にします。
if ( !$nic && $ipd ) {
# ドメイン名検索の場合
$nic = &pwhois'tld2nic($ipd,$conf'tld_list);
if ($nic && $ipd) {
$out = &pwhois'out($ipd,$nic,$conf'whois,$conf'wformat);
if ( $out =~ /Whois Server:(.+)\n/i ) {
$nic = $1;
$nic =~ s/\s//; # 空白削除
if ( $rep_list{$nic} ne "" ) { $nic = $rep_list{$nic}; } # 2004.03.04 外部問い合わせに応じないwhoisサーバー対策
$out = &pwhois'out($ipd,$nic,$conf'whois,$conf'wformat);
}
}
} else {
# IPアドレス検索の場合
if ( $nic && $ipd ) {
if (( $nic eq 'whois.apnic.net' ) && ( !$fd{'nic'} )) {
# アジア/太平洋圏のwhoisデータベースの場合、まずJPNICを検索して見る
$nicj = 'whois.nic.ad.jp';
$out = &pwhois'out($ipd,$nicj,$conf'whois,$conf'wformat);
if ( $out =~ /No match!!/i or $out =~ /whois.apnic.net/ ) { # 2005.03.23 whois.nic.ad.jpの表示内容変更に伴う改造
$FlagJPNIC = 0;
} else {
$FlagJPNIC = 1;$nic = $nicj;
}
}
$out = &pwhois'out($ipd,$nic,$conf'whois,$conf'wformat) if !$FlagJPNIC;
}
}
# 改造終了 2003.01.02
$out = "Bad IP address or domain name." unless $out;
} else {
$ipd = '';
$nic = '';
$out .= "\n<!-- im_whios.cgi $version -->";
$out .= "\n<!-- im_whois.conf $conf'version -->";
$out .= "\n<!-- pwhois.pl $pwhois'version -->";
}
&printMime;
&printHead($ipd);
&printForm($ipd,$nic);
&out($ipd,$nic,$out);
exit 0;
# END_MAIN
sub out{
local($ipd,$nic,$out) = ($_[0],$_[1],$_[2]);
if($ipd && $nic){
&printWhois($ipd,$nic);
$out =~ s/\r\n/\n/g; # infoドメイン検索時の不要改行削除 2004.01.29
print "\n$out\n</pre>\n";
} elsif($nic){ # TLD LIST
print $out;
} else{
&printHelp;
print "\n$out\n</pre>\n";
}
print "\n</body>\n</html>\n";
}
sub printHead{
local($ipd,$meta) = ($_[0],'');
$ipd = '' unless $ipd;
$meta = '<meta http-equiv="Content-Type" ';
$meta.= 'content="text/html; charset=ISO-2022-JP">';
print <<"PRINT_HEAD";
<head>
$meta
<title>imWHOIS $ipd</title>
</head>
<body>
PRINT_HEAD
}
sub printForm{
local($ipd,$nic) = ($_[0],$_[1]);
$ipd = $ENV{'REMOTE_ADDR'} unless $ipd; # option valueの改造は、http://www.iana.org/ipaddress/ip-addresses.htmを参照。
print <<"PRINT_FORM";
<b>imWHOIS</b>
<form method="post">
<code>IP or Domain</code>
<input type="text" name="ipd" value="$ipd">
<input type="submit" name="x" value="CHECK">
<input type="submit" name="tld" value="TLD LIST">
</a><br>
<code>WHOIS Server</code>
<select name=nic>
<option value="" selected>自動
<option value="whois.nic.ad.jp">whois.nic.ad.jp: 日本国
<option value="whois.internic.net">whois.internic.net:国際(IPアドレスの検索不可)
<option value="whois.apnic.net">whois.apnic.net: アジア/太平洋圏
<option value="whois.arin.net">whois.arin.net: 北米とサブサハラ・アフリカ
<option value="whois.lacnic.net">whois.lacnic.net: 南米とカリブ海の島
<option value="whois.ripe.net">whois.ripe.net:欧州、中東、中央アジア、赤道以北のアフリカ
</select>
<input type="reset" name="r" value="RESET">
</form>
PRINT_FORM
}
・・・後略・・・
こちらに改造部分のみを抽出したファイルを置いておきます。imWHOISを改造したCGIファイルの再配布は、行なっておりませんので、使用者ご自身で改造を行なって下さい。
動作確認
ブラウザを起動し、URL欄に「http://www.example.com/cgi-bin/whois/im_whois.cgi」等と入力して、動作試験を行ないます。起動すると、imWHOISサンプルのWebページと同じ画面が出れば、正常に起動されています。「IP or Domain」欄に自サイトのIPアドレスかドメイン名等を入力して、期待通りの表示が出れば、これで設置が完了しました。また、「IP or Domain」欄に自サイトのIPアドレスを入力して、表示が日本語で表示されるかどうかもご確認して下さい。これでいつでも最新版のmeta-whoisサーバーをインターネットに公開することができます。
「IPv4アドレス-WHOISサーバ対応リスト(rirs_a.list)」と「国コード-WHOISサーバ対応リスト(tld_a.list)を自動生成させて、つぐづく思ったのですが、このデータの更新が2001年10月19日で終わっている理由が理解出来ました。Meta-Whoisを利用する便利さと引き換えに、最初にこのリストを作成したり、その後の保守をするには、大変な労力を必要とします。あらためて、ここでCGI倶楽部さんにこの場を借りて、心よりお礼申し上げます。
このWebページでは、スクリプトを改造することによって、「IPv4アドレス-WHOISサーバ対応リスト(rirs_a.list)」と「国コード-WHOISサーバ対応リスト(tld_a.list)を自動更新する方法を提示しました。サーバー側で1ヶ月に一回程度の定時処理で自動更新を行うと、商用サイト並みのサービス(?)が提供出来るかもしれません。
しかし、ダウンロード先のサーバーであるwhois.sakaguch.comがダウンしているとデータが更新出来ません。この不安を払拭するためにも、自サイトで、これらのデータを作成する手段が講じておきましょう。これについては、次節をご参照願います。
このWebページの通りに設定して、正常に動作しない場合やこのスクリプトに対するご質問や不具合がございましたら、「鷹の巣」の自宅サーバー掲示板にご投稿を御願い致します。このPerlスクリプトは、Perlの練習用として、鷹の巣が個人的に作成しました。 imWHOISデータ自動更新プログラムは、CGI倶楽部さんとは、全く関係がありませんので、お問合せは、必ず上記の掲示板の方に御願い致します。
|▲頁先頭|