はじめに
トラブルシュートしてると、特定のグローバルIPアドレスへの通信が発生しているケースがあります。そんなときにこのIPアドレスはどこの組織のもつIPで、何に使用されているのか調べたくなることが多々あります。単純にGoogle検索を行ってもヒットするのですが、より洗練された方法としてipinfo.ioを使用するのがおすすめですので、使い方をメモしておきます。
ipinfo.ioとは
ipinfo.ioは、IPアドレスに関する情報を提供するサービスです。2013年に元Facebookエンジニアのベン・ダウリングによって設立されました。このサービスを使うことで、IPアドレスから地理的な位置、インターネットサービスプロバイダー(ISP)、使用されているネットワークの種類などの詳細情報を得ることができます。この情報は、セキュリティ分析、オーディエンスの地域分析、カスタマイズされたコンテンツの提供など、さまざまな目的に利用されます。
アカウント登録
アカウント登録をせずとも便利に使えますが、アカウント登録することで以下の利益を教授できます。
- リクエスト上限を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ツールも作ってるらしい。すごいな。バルク処理等を簡単にできる模様。
役に立ったと思った方はビール1杯奢ってください!
