IPアドレスのルックアップについて

IPアドレスのルックアップについて

- Tatsuya Shirai の投稿
返信数: 2

 Moodle1.9では,MaxMindのGeoLite CityデータベースとGoogle MapsのAPIを用いることで,ログ等に記録されたIPアドレスからクライアントの地理情報をグラフィカルに表示することができます.ただし,かなり大雑把で,国内からのアクセスであればTokyo(皇居)を表示されることが多いですよね.

 国内のIPアドレスであればWHOISの手順で,たとえばJPNICのWHOISJPRSのWHOISで,より詳細な情報を取得できますよね.(あまり詳しくありません.いま調べて知った範囲の情報です)

 IPアドレスのルックアップの画面に,WHOISの情報を表示する機能を付けると便利かな?と考えたのですが,ここで疑問です.

  1. 非商用ではあれ,このような用途にJPNIC等のWHOISを利用して良いのか?(サーバへの負荷)
  2. 海外のサイトのIPアドレスも統一的に調べる手段はあるのか?(複数のWHOISのサーバを順繰りに回る?)
  3. WHOISコマンドのオプション指定はどのLinuxやMac OS,そしてWindows版でもほぼ同じなのか?(特にWindowsは非標準なのでフリーウェアを探さなくてはならない)

 どなたか,このような情報に関して詳しい方がいらっしゃいましたら教えて頂けないでしょうか.

#IPアドレスからドメイン名を得られるだけで,私の希望は満たされます.だとすると,gethostbyaddr()関数だけで十分なのかも知れません.

Tatsuya Shirai への返信

Re: IPアドレスのルックアップについて

- Tatsuya Shirai の投稿

  ホスト名をIPアドレスのルックアップ画面に追加するだけならば,意外と簡単で,iplookup/index.phpに以下の一行を追加するだけでOKでした.

if (!preg_match('/(^\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip, $match)) {
    print_error('invalidipformat', 'error');
}

if ($match[1] > 255 or $match[2] > 255 or $match[3] > 255 or $match[4] > 255) {
    print_error('invalidipformat', 'error');
}

if ($match[1] == '127' or $match[1] == '10' or ($match[1] == '172' and $match[2] >= '16' and $match[2] <= '31') or ($match[1] == '192' and $match[2] == '168')) {
    print_error('iplookupprivate', 'error');
}

if (($hostname = gethostbyaddr($ip)) != false) $info[] = $hostname;

if ($user) {
    if ($user = get_record('user', 'id', $user, 'deleted', 0)) {
        $info[] = fullname($user);
    }
}

if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) {
    $gi = geoip_open($CFG->geoipfile, GEOIP_STANDARD);
    $location = geoip_record_by_addr($gi, $ip);
    geoip_close($gi);

逆に言うと,オリジナルのMoodleではこのようなホスト名を簡単に取得する関数が用意されているにも関わらず利用しないことに,何か理由があるのでしょうか.サーバの環境に依存するなどなど.

 

Tatsuya Shirai への返信

Re: IPアドレスのルックアップについて

- Tatsuya Shirai の投稿

 得られた$hostnameが$ip(IPアドレス)と同じ場合がたまにありますね.この場合はホスト名を追加しないのであれば,

if (($hostname = gethostbyaddr($ip)) && ($hostname != $ip)) $info[] = $hostname;

こうでしょうか.

#もしDNSから情報が得られなかったのならばIPアドレスを返すのではなくFALSEを返して欲しい.それとも別の理由でしょうか?