おれさまラボ

実際に手を動かして理解を深めるブログ。

ipinfo.io:IPアドレスに関する情報を手に入れる

はじめに

トラブルシュートしてると、特定のグローバルIPアドレスへの通信が発生しているケースがあります。そんなときにこのIPアドレスはどこの組織のもつIPで、何に使用されているのか調べたくなることが多々あります。単純にGoogle検索を行ってもヒットするのですが、より洗練された方法としてipinfo.ioを使用するのがおすすめですので、使い方をメモしておきます。

ipinfo.ioとは

ipinfo.ioは、IPアドレスに関する情報を提供するサービスです。2013年に元Facebookエンジニアのベン・ダウリングによって設立されました。このサービスを使うことで、IPアドレスから地理的な位置、インターネットサービスプロバイダーISP)、使用されているネットワークの種類などの詳細情報を得ることができます。この情報は、セキュリティ分析、オーディエンスの地域分析、カスタマイズされたコンテンツの提供など、さまざまな目的に利用されます。

ipinfo.io

アカウント登録

アカウント登録をせずとも便利に使えますが、アカウント登録することで以下の利益を教授できます。

  • リクエスト上限を1日1kから月5万kにアップ
  • リクエスト制限に近づいたらメールでお知らせ
  • 他のAPIのトライアルへのアクセス
  • リアルタイムのリクエスト量情報を表示するダッシュボード
  • リクエスト要約メール(毎週または毎月)

また、ipinfo.ioは有料プランもあり、上位プランになればAPI上限の増加だけでなく、AbuseやHosted Domainなど追加の情報の閲覧が可能となるようです。

ipinfo.ioの使い方

多くの人は1日1件も確認することはないと思うので、今回は、アカウント登録を行わない状態で使い方を見ていきます。例示はPowerShellからの利用になります。

自身のIPアドレスを知る

ipinfo.io にWebリクエストを行うと、自身のグローバルIPアドレス情報が返ってきます。

>Invoke-WebRequest ipinfo.io | Write-Host
{
  "ip": "xxx.xxx.xxx.xxx",
  "hostname": "xxx.xxx.xxx",
  "city": "Tokyo",
  "region": "Tokyo",
  "country": "JP",
  "loc": "35.xxxxx,139.xxxxx",
  "org": "ASxxxx xxxxx",
  "postal": "xxx-xxxx",
  "timezone": "Asia/Tokyo",
  "readme": "https://ipinfo.io/missingauth"
}

特定のIPアドレスを調べる

IPアドレスをURLでディレクトリ指定すると、そのIPアドレスの情報が返ってきます。以下は8.8.8.8の例です。

>Invoke-WebRequest ipinfo.io/8.8.8.8 | Write-Host
{
  "ip": "8.8.8.8",
  "hostname": "dns.google",
  "anycast": true,
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.4056,-122.0775",
  "org": "AS15169 Google LLC",
  "postal": "94043",
  "timezone": "America/Los_Angeles",
  "readme": "https://ipinfo.io/missingauth"
}

さらに各項目をURLでディレクトリ指定すると、指定した情報だけが返ってきます。

# /ip を指定
>Invoke-WebRequest ipinfo.io/8.8.8.8/ip | Write-Host
8.8.8.8

# /org を指定
>Invoke-WebRequest ipinfo.io/8.8.8.8/org | Write-Host
AS15169 Google LLC

複数のIPアドレスをまとめて処理する

複数のIPアドレスを検索したい場合は、ForEachで回すと良いでしょう。(やり過ぎ注意)

function Get-IpInfo {
    param (
        [Parameter(Mandatory=$true)]
        [string]$IpAddress
    )

    try {
        $response = Invoke-WebRequest "ipinfo.io/$IpAddress" -ErrorAction Stop
        $response.Content
    } catch {
        "エラー: $_"
    }
}

param (
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path $_})]
    [string]$FilePath
)

$outputFileName = "output_" + (Get-Date -Format "yyyyMMdd-HHmm") + ".txt"

Get-Content $FilePath | ForEach-Object {
    $ipInfo = Get-IpInfo -IpAddress $_
    Write-Host $ipInfo
    $ipInfo | Out-File -Append $outputFileName
    Start-Sleep -Seconds 2
}

サクッとCSV出力するにはこんな感じかしら。

$ips = @(
    "8.8.8.8",
    "1.1.1.1"
) # ここに問い合わせたいIPアドレスのリストを入力
$results = @()

foreach ($ip in $ips) {
    $output = Invoke-WebRequest -Uri "ipinfo.io/$ip" | ConvertFrom-Json
    $results += $output | Select-Object ip, hostname, city, region, country, loc, org, postal, timezone, readme
}

$results | Export-Csv -Path "output.csv" -NoTypeInformation -Encoding UTF8

おわりに

どうやらCLIツールも作ってるらしい。すごいな。バルク処理等を簡単にできる模様。

github.com

役に立ったと思った方はビール1杯奢ってください!

この続きはcodocで購入