アクセスしてきた相手をIPアドレスから信用してよいのかどうかを調べるためのWebサービス「IPHub」をpythonから実行してみました。
freeプランで2000リクエスト/日まで利用することができます。登録をするとメールが届くのでvalicationリンクをクリックすると、アプリKeyが発行されるのですが、IPHubからのメールはスパム扱いされるようで迷惑メールフォルダに入っていました。
curlで実行できるか確認する
Google PublicDNSの8.8.8.8
を安全か確認してみました。
$ curl http://v2.api.iphub.info/ip/8.8.8.8 -H "X-Key: MY_APPLICATION_KEY"
IPHub APIのレスポンスはJSONで返ってきます。
{ "ip": "8.8.8.8", "countryCode": "US", "countryName": "United States", "asn": 15169, "isp": "GOOGLE", "block": 1, "hostname": "8.8.8.8" }
よく「中国からのアクセスは弾きたい」という要望を聞きますので、そのような場合にはcountryCode
の値で判断してもよいかもしれません。もしくはcountryCode
の値がJPの場合のみアクセスを許容するといった使い方でしょうか。
IPHubが推奨するブロックレベルについて
IPHubのドキュメントを読むとblock
の値で相手のリクスレベルを判断してくださいとあります。
説明 | |
---|---|
0 | 住居/未分類IP (安全) |
1 | 居住者以外のIP (プロバイダ、プロキシなど) |
2 | 非住宅&居住用IP |
IPHubはblock
の値が1
かどうかを判断することで、悪意のあるユーザーを除外しつつ誤認識を避けた最適なバランスになるとかかれていました。
僕は普段auのiPhoneからテザリングでネットをしているのですがIPアドレスは106.133.13.1
となっていました。これはKDDIが公開している情報と一致しています。
IPHub上での情報はどのようになっているか確認してみました。iPhone
{ "ip": "106.133.13.1", "countryCode": "JP", "countryName": "Japan", "asn": 2516, "isp": "AS2516", "block": 2, "hostname": "106.133.13.1" }
pythonでIPHubを使って接続元が悪意のあるユーザーかどうか判断する
IPHubのサンプルコードをそのままですが、以下のように簡単にblockレベルを調べることができました。
import urllib.request import json def Lookup(ip): response = urllib.request.Request("http://v2.api.iphub.info/ip/{}".format(ip)) response.add_header("X-Key", "MY_APPLICATION_KEY") try: response = json.loads(urllib.request.urlopen(response).read().decode()) except: return False return response.get("block") if __name__ == '__main__': print(Lookup("106.133.13.1")) # 2