はじめに
アクセスログをみてアクセス元の国名を調べることがあります。
アクセスログはCSVで出力されているので、今まではそれを見てIPアドレスを Cisco TALOS や Linux の「geoiplookup」コマンドで手打ちして調べていました。流石にそれは効率が悪すぎるのでCSVファイルを取り込み自動で全部調べて国名を付与してまたCSVファイルをして出力する Python プログラムを作りました。
環境と準備作業
環境について
Winodws 10 Pro + Visual Studio Code で実施しました。
python のバージョンは Python 3.6.1 です。
geoip2 モジュールのインストール
Python でIPアドレスから国名を調べようとすると geoip2 がインストールする必要があります。「pip install geoip2」コマンドを実行する必要がありますが Windows でも環境変数に python のパスが通っていればこのコマンドが動きます。PowerShell のコンソールを立ち上げてコマンドを打ったら無事 geoip2 のインストールができました。
GeoLite2 データベースのダウンロード
MAXMIND 社のサイトから IPアドレスのデータをダウンロードしてきます。
GeoLite2 Free Downloadable Databases
「GeoLite2 Country」の「MaxMind DB binary, gzipped」をダウンロード、解凍して Python スクリプトがあるフォルダに置きます。tar.gz ファイルは Windows の標準の解凍ツールでは解凍できないので 7zip を使用しました。
CSV ファイルについて
下記のようなタイトル行の無い「日時」「アクセス元IPアドレス」の2列のみで構成された CSV ファイルを想定しています。
2018/1/1 0:00,1.1.1.1
2018/2/1 0:00,2.1.1.1
2018/3/1 0:00,3.1.1.1
2018/4/1 0:00,4.1.1.1
2018/5/1 0:00,5.1.1.1
2018/6/1 0:00,6.1.1.1
2018/7/1 0:00,7.1.1.1
2018/8/1 0:00,8.1.1.1
2018/9/1 0:00,9.1.1.1
IPアドレスの国名を求めるスクリプト
まず IPアドレスから国名を求める関数を作成します。ソースの CSV ファイルを取り込み1行ずつこの関数を実行して、結果を付加して CSV ファイルとして出力します。
## モジュールの読み込み
import geoip2.database
import csv
## GeoIPデータベースとCSVファイルのパス設定
geoip_db_path = "GeoLite2-Country_20190430/GeoLite2-Country.mmdb"
source_file_path = "iplist.csv"
result_file_path = "result.csv"
## IPアドレスから国名を求める関数
def ipaddrlookup(ipaddress):
reader = geoip2.database.Reader(geoip_db_path)
response = reader.country(ipaddress)
countoryname = response.country.names["en"]
return countoryname
## IPアドレスリストの取り込み
source_file = open(source_file_path, encoding = "ansi")
source_reader = csv.reader(source_file)
source_list = list(source_reader)
## 出力ファイルをオープン
result_file = open(result_file_path, "w", newline="")
result_writer = csv.writer(result_file)
## 取り込んだCSVファイルのIPアドレスから国名を求める
for row in source_list:
outputdata = [row[0]]
outputdata.append(row[1])
outputdata.append(ipaddrlookup(row[1]))
result_writer.writerow(outputdata)
## 出力ファイルをクローズ
result_file.close()
出力される CSV ファイル
下記のように「日時」「アクセス元IPアドレス」列の後に「アクセス元国名」の列が付加された CSV ファイルが出力されます。
2018/1/1 0:00,1.1.1.1,Australia
2018/2/1 0:00,2.1.1.1,France
2018/3/1 0:00,3.1.1.1,Singapore
2018/4/1 0:00,4.1.1.1,United States
2018/5/1 0:00,5.1.1.1,Ukraine
2018/6/1 0:00,6.1.1.1,United States
2018/7/1 0:00,7.1.1.1,United States
2018/8/1 0:00,8.1.1.1,United States
2018/9/1 0:00,9.1.1.1,United States
参考情報
参考サイト
GeoLite2でサクッとできるIPアドレスの国判定
windows10でpipが使えるようになるまで(python3.6)
参考書籍
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
実践力を身につける Pythonの教科書