Apache2のログ、IPアドレスから名前を調べる,gethostbyaddrを使う
1.条件や概要は以下のとおり
2.実行した結果(一部)は以下のとおりです。
名前が解決できたのは2447件(全体3147件)で77.7%です。71.9.62.205 071-009-062-205.biz.spectrum.com 160.13.106.1 1.106.13.160.dy.iij4u.or.jp 49.213.171.100 100-171-213-49.tinp.net.tw 101.140.189.153 101-140-189-153f1.shg1.eonet.ne.jp 101.140.222.224 101-140-222-224f1.osk3.eonet.ne.jp 103.98.32.22 103.98.32.22.rev.datamaxtechnologies.net 103.112.55.59 103-112-55-59.Chuadanga.carnival.com.bd 103.58.100.67 103-58-100-67.biznetgiocloud.com 105.209.43.245 105-209-43-245.access.mtnbusiness.co.za 105.213.79.35 105-213-79-35.access.mtnbusiness.co.za 106.104.192.43 106-104-192-43.adsl.static.seed.net.tw (略) 162.243.129.158 zg-0708c-3.stretchoid.com 222.2.78.180 ZG078180.ppp.dion.ne.jp 37.26.236.12 zimbra.cbdd.spb.ru 193.118.53.194 zl-ams-nl-gp3-wk101.internet-census.org 128.14.134.170 zl-lax-us-gp3-wk106.internet-census.org 222.8.59.55 ZM059055.ppp.dion.ne.jp 59.135.105.138 ZV105138.ppp.dion.ne.jp 111.102.193.97 zz20164245216F66C161.userreverse.dion.ne.jp(2020/8/5追記)
*.am | *.arpa | *.at | *.au | *.bd | *.bg | *.biz | *.br |
2 | 3 | 1 | 3 | 1 | 4 | 1 | 35 |
*.by | *.ca | *.ch | *.cloud | *.cn | *.co | *.com | *.cz |
1 | 3 | 1 | 1 | 8 | 6 | 1302 | 1 |
*.de | *.dk | *.drone | *.earth | *.ec | *.eu | *.expert | *.fr |
12 | 1 | 1 | 1 | 2 | 12 | 1 | 1 |
*.ge | *.gr | *.hn | *.host | *.hr | *.hu | *.id | *.il |
3 | 7 | 1 | 3 | 1 | 1 | 5 | 2 |
*.in | *.info | *.io | *.ir | *.it | *.jp | *.kg | *.kh |
6 | 2 | 11 | 3 | 11 | 378 | 1 | 2 |
*.lb | *.lt | *.mx | *.net | *.ninja | *.nl | *.org | *.pl |
1 | 1 | 2 | 409 | 5 | 1 | 23 | 12 |
*.ps | *.ro | *.ru | *.sc | *.se | *.sg | *.si | *.site |
1 | 3 | 19 | 1 | 2 | 1 | 1 | 2 |
*.sk | *.su | *.th | *.tr | *.tw | *.ua | *.uk | *.uy |
1 | 1 | 2 | 37 | 35 | 4 | 3 | 1 |
*.ve | *.vn | *.yt | *.za | *.zw | D | localhost | |
1 | 28 | 1 | 2 | 1 | 1 | 4 |
3.Perlで記述したスクリプト
gethostbyaddr()関数を利用したスクリプトです。これにはpack()関数とsplit()関数も使っています。#!/usr/bin/perl -w # -w ワーニングを出す # /home/user/ipaddress/ip-check-2.pl # apahe2 のログからIPアドレスからURLを調べるスクリプト # 2020/8/3 --->OK # /var/log/apache2/access.log.1をコピーして実行したところ5000行目くらいで16分位かかった。 # 全体で28000行くらいあるので時間が非常にかかる。 # EXCELで重複を取り除くと3100位になった。 # これで約8分 # 出力結果がおかしくて、gethostbyaddr の使い方を修正した(2020/8/3) # use strict; # 宣言した変数以外を使えなくする use Socket; # gethostbyaddrを使うために必要 my $data_file="/home/user/ipaddress/ipaddr.txt"; my $out_file="/home/user/ipaddress/out_file.txt"; my $ip_addr ; my $ip_line; my $url_name=""; my $i_count ; my $AF_INET="2" ; # gethostbyaddrを使うために必要 # ## 初期値 ### $| = 1; # ゼロ以外が代入されると出力をバッファリングしなくなる。 $i_count=0 ; # ########################### メインプログラム ############################### open (OUT,">$out_file"); # 新規にアウトファイルを作成 close OUT ; open IN, "<",$data_file || die "Error: data file not existed $!\n" ; #ファイルを入力で開く open (OUT,">> $out_file"); while ($ip_line = <IN>) { # 記録されているIPアドレスを1行読み込む 空行でない場合、以下を実行 if ( $ip_line =~/\d+\.\d+\.\d+\.\d+/ ) { ; # IP addressを パターンマッチ ex 192.168.0.1 $i_count=$i_count + 1 ; $ip_addr=$& ; } # $url_name = gethostbyaddr($ip_addr, $AF_INET) ; # (2020/8/3 こちらが最初、結果がおかしい) $url_name = gethostbyaddr(pack("C4",split(/\./,$ip_addr)), $AF_INET) ; # 修正後 unless ( defined $url_name) { # 未定義かどうか判定(未定義のエラーがでた) $url_name=" "; # 未定義であれば空白を入れる } print OUT $i_count, " ",$ip_addr, " ",$url_name,"\n" ; } close IN; close OUT; # 終了 プログラムEND
4.試行錯誤したところ
gethostbyaddr()関数の引数の使い方で少しとまどいました。 単純にIP(192.168.1.1)を入れれば良いと考えていたのですが、 文字のみを4バイトにして入れる必要があるようです。