Windows Server 2019でアクセス元の国情報を取得する具体的手法と活用例

日々、世界中からリクエストが飛んでくるWindows Server 2019の環境下で「どの国からアクセスされているのか」を把握できれば、セキュリティ対策やマーケティング分析、アクセス制限などの面で非常に役立ちます。しかし標準の機能だけでは国情報を取得できないのも事実です。そこで今回は、Windows Server 2019上でアクセス元の国情報を取得するための具体的な方法と、導入後の活用例までを分かりやすく解説します。

目次

Windows標準ツールだけでは地理情報の取得が困難な理由

Windows Serverはリソース監視やセキュリティ関連の機能が充実していますが、アクセス元IPから「国情報や地域情報」を直接表示する機能は用意されていません。たとえばパフォーマンスモニタ(Performance Monitor)はCPUやメモリ使用率、ディスクI/Oなどを計測するツールとして優れていますが、IPアドレスから国別情報を判定する機能は含まれていないのです。セキュリティログやイベントビューアでも「どのIPがアクセスしてきたか」という事実は分かっても、そのIPがどの国に割り当てられているかまでは確認できません。
そこで必要になるのが、外部のIPジオロケーションサービスとの連携です。これは、IPアドレスと所在地情報(国、地域、都市など)をひも付ける膨大なデータベースを持つサービスを利用して、「どの国からアクセスが発生しているのか」を解析する方法です。

IISログからのIPアドレス抽出

Windows Server 2019でWebサーバーとしてIISを利用している場合、多くのケースでアクセスログ(IISログ)を取得していることでしょう。標準設定のままでも、下記のような形式でアクセス情報が記録されます。

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2025-02-16 03:18:19
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2025-02-16 03:18:19 192.168.1.100 GET /index.html - 80 - 203.0.113.45 Mozilla/5.0 200 0 0 15

上記では「c-ip」の項目がクライアントIPを示します。IISログの場合、一般的に「c-ip」か「cs-username」「s-ip」などのフィールドを確認することで、アクセス元IPを取得できます。このログファイルからIPだけをまとめて抽出し、その後に外部のジオロケーションサービスを用いて国情報を突き合わせる流れが基本です。

ログ抽出の自動化

単発の抽出であれば、メモ帳やExcelなどでフィルターをかけるだけでも可能です。しかし運用として継続的に解析するのであれば、自動化が望ましいでしょう。たとえばPowerShellスクリプトを用いると、IISログフォルダにある各種ログファイルを定期的に読み込み、ユニークなIPアドレスをリストアップすることが可能です。簡単な例として、以下のようなPowerShellのコードを想定できます。

# IISログディレクトリを指定
$logDirectory = "C:\inetpub\logs\LogFiles\W3SVC1"

# ログファイルを一括取得
$logFiles = Get-ChildItem $logDirectory -Filter "*.log"

$ipList = @{}

foreach ($file in $logFiles) {
    $lines = Get-Content $file.FullName
    foreach ($line in $lines) {
        if ($line -notmatch "^#") {
            # 行の先頭が#で始まらない場合はログの実データ行とみなす
            $fields = $line.Split(" ")
            # c-ipはFieldsによって位置が異なることがあるため
            # 予めログのヘッダ(#Fields行)を読み取って位置を特定しておく方法が安全
            # ここでは仮に10番目のフィールドをc-ipとみなす
            $clientIp = $fields[8] 
            if ($clientIp -ne $null -and $clientIp -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") {
                $ipList[$clientIp] = $true
            }
        }
    }
}

# 出力例
$uniqueIps = $ipList.Keys
$uniqueIps | Out-File "C:\temp\unique_ips.txt"

実際には、#Fields:の行を事前に解析して該当フィールドを特定する実装が望ましいですが、シンプルな例示として参考にしてください。以上のように抽出されたIPのリストを外部APIに投げるか、ローカルに置いたジオロケーションデータベースで照会するという手順になります。

代表的なIPジオロケーションサービス

アクセス元の国情報を取得するためのサービスには、無料版と有料版が存在します。一般的に無料版は国情報や大雑把な地域レベルしか取得できない場合が多いのに対し、有料版はより精度が高く、都市名や郵便番号レベルまで取得できることもあります。以下、主なサービスと特徴をまとめた簡易的な表です。

サービス名特徴プラン
MaxMind GeoIP世界的に有名。精度の高いデータを提供。無料版: 国レベル
有料版: 都市レベルやISP情報など
IP2LocationIP位置情報データベースとして長い実績。無料サンプルDBあり
有料プラン多数
ipinfo.ioシンプルなAPIを通じて手軽に導入可能。無料プラン: 月間リクエスト数に制限
有料プラン: 大量アクセス向け
IpstackREST API形式で提供。手軽さが売り。無料~有料
有料プランでHTTPS対応など追加機能
db-ip.comテキスト形式のデータをダウンロード可能。無料データと有料データあり

これらのサービスを使うことで、IPアドレスを照会すれば「該当IPが属する国コード」「国名」「時には都市名」なども取得できます。
また、MaxMindなどはWindows用にGeoIPデータベースをローカル保存して、アプリケーションやスクリプトを介して照会する方法もあります。この場合、外部APIへの問い合わせ不要でオフライン環境でも地理情報を扱えますが、データベースを定期的に更新しなければ精度が落ちる点に注意が必要です。

APIを使った照会フローの例

たとえばipinfo.ioを利用する場合、PowerShellから簡易的に以下のようにAPIを叩くことができます。

$apiToken = "<Your ipinfo.io Token>"
$ipList   = Get-Content "C:\temp\unique_ips.txt" 

foreach ($ip in $ipList) {
    $url  = "https://ipinfo.io/$ip?token=$apiToken"
    $json = Invoke-RestMethod -Uri $url -Method Get
    # $json.country で国コードを取得
    $country = $json.country
    Write-Host "IP: $ip -> Country: $country"
}

非常にシンプルな例ですが、これだけで「どの国からのアクセスか」をリストアップできます。もちろん、本格的に運用する際にはエラー処理やAPI呼び出し制限、キャッシュ(同じIPへの連続照会対策)などを考慮するとよいでしょう。

バルク(一括)照会への対処

Webアクセスが多いサイトの場合、1日のログに含まれるユニークIPの数が数万件を超えることも珍しくありません。
無料プランでは1日のリクエスト上限が決まっていることが多いため、大量の一括照会を行いたい場合は有料プランを検討する必要があります。あるいは、定期的にCSVやテキスト形式で更新されるデータベースファイルをダウンロードし、ローカルで照会する方法も候補に入るでしょう。MaxMindの「GeoLite2」(無料)や有料の「GeoIP2」ではローカルデータベースを使って照会可能です。

リアルタイム解析へのアプローチ

IISログをバッチ処理で集計する方法だけでなく、リアルタイムで解析したいケースもあるかと思います。リアルタイム可視化を実現するには、ログ収集ツールを導入するか自前で実装するかという選択肢があります。
代表的なログ収集・分析基盤としては、Elastic Stack(Elasticsearch + Logstash + Kibana)が挙げられます。LogstashでIISログを取り込み、GeoIPプラグインを用いてクライアントIPを解析、Elasticsearchに保存し、最後にKibanaで国別マップを可視化するといった構成がポピュラーです。以下にイメージを示します。

  1. Logstash
  • IISログを取り込み。GeoIPプラグインでIPアドレスを元に国情報などを付与。
  1. Elasticsearch
  • 地理情報付きのログを保存・索引化。
  1. Kibana
  • 地図(Region MapやCoordinate Map)上に国別のアクセス数を可視化。

リアルタイム解析が可能になると、攻撃的なトラフィックが特定地域から集中しているといった状況をいち早く発見し、Firewallレベルでブロックするなど即時的な対応がしやすくなります。

Power BIや他のBIツールとの連携

MicrosoftのPower BIやTableauなどのBIツールを使えば、ビジュアルな地図上で国別アクセスを確認できます。IISログ解析から得られた「IPアドレス→国情報」の対応表を定期的にPower BIへインポートすることで、社内ユーザーが簡単にダッシュボードを確認できる環境を整えられます。
たとえばAzure Log Analyticsにログを蓄積し、Power BIでクエリしてマップ表示するパターンや、オンプレミス環境内でSQL Serverに地理情報を入れておき、SSRS(Reporting Services)やPower BI Report Serverで可視化するパターンが考えられます。

運用面での注意点とセキュリティ活用

IPアドレスのジオロケーションはあくまで推定情報であり、プロキシやVPN、Torなどの匿名化技術を使われると正確性が下がります。ただし、国情報を取得すること自体に意義が薄れるわけではなく、次のような観点で有用です。

  • アクセスブロック: 特定の国や地域からの攻撃が多い場合にFirewall設定やクラウドのWAF(Web Application Firewall)でブロックする。
  • マーケティング分析: どの国からのアクセスが多いかを定点観測し、人気の地域や言語対応の優先度を判断する。
  • アラート設定: 普段はほぼアクセスのない国から突然大量のトラフィックが来た場合に通知を行う。

一方で、運用する上ではデータの更新頻度やコストにも気を配る必要があります。無料データベースを用いる場合は、更新頻度が1ヶ月に1回というケースが一般的で、その間にIPの割り当てが変わる可能性もあるため、精度の維持が課題になります。有料サービスを利用すれば、より頻繁にアップデートされるデータが入手できるケースが多いため、必要に応じて検討してください。

Firewallやネットワークアプライアンスとの連動

国別IP制限を行う場合、アプリケーションレベルだけでなくネットワーク機器やセキュリティアプライアンスでも実装可能です。一部のファイアウォール製品やVPNゲートウェイでは、国別ブロック機能が標準またはオプションで提供されています。Windows Serverの役割ではありませんが、ネットワークレイヤーで早期に不正アクセスを遮断できるメリットがあり、攻撃的トラフィックをサーバーに到達させない運用が可能になります。

事例: MaxMindのGeoLite2を利用するケース

MaxMindはGeoLite2という無料のデータベースを提供しています。国や都市の情報を無料で取得できますが、一部の詳細データは含まれません。ダウンロード後、APIやライブラリを通してローカルのデータファイル(.mmdb形式など)を参照することで、外部アクセスなしに地理情報を照会可能です。
Windows Server上でC#やPowerShellからMaxMindのライブラリを利用すれば、リアルタイムまたはバッチ処理でIISログを解析できます。たとえばC#の場合、NuGetで「MaxMind.GeoIP2」をインストールし、以下のようなコードで国情報を取得できます。

using MaxMind.GeoIP2;
using MaxMind.GeoIP2.Responses;
using System;

class Program
{
    static void Main(string[] args)
    {
        // GeoLite2-Country.mmdbへのパスを指定
        string databasePath = @"C:\GeoIP\GeoLite2-Country.mmdb";
        using (var reader = new DatabaseReader(databasePath))
        {
            string ipAddress = "8.8.8.8"; // 例としてGoogle DNS
            CountryResponse response = reader.Country(ipAddress);
            Console.WriteLine($"IP: {ipAddress}");
            Console.WriteLine($"Country ISO Code: {response.Country.IsoCode}");
            Console.WriteLine($"Country Name: {response.Country.Name}");
        }
    }
}

このように実装すると、オフライン環境やプライベートネットワーク内でも国情報の照会が実現可能です。ただし、データベースは定期的に更新しなければ精度がどんどん下がってしまうため、更新作業を自動化しておくことが望ましいでしょう。

活用例: アクセス可視化レポート

GeoLite2などを用いて一定期間(例えば1週間)のログを解析し、国別のアクセス数をレポートにまとめると、サイトやサービスがどの地域から注目されているかが一目で分かります。具体的には以下のようなレイアウトをExcelやBIツールで作成すると分かりやすいでしょう。

  • 国別アクセス数トップ10: 横棒グラフや円グラフで上位国を表示。
  • 時系列での国別アクセス推移: 折れ線グラフで日々のアクセス状況を比較。
  • 地図による色分け可視化: 地図上に国ごとのアクセス数に応じた色を付与。

さらに、国情報に加えてISP(インターネットサービスプロバイダ)情報や組織名(ASN)なども取得できれば、攻撃元の傾向やマーケティング対象の分析がより詳しく行えます。

まとめと次のステップ

Windows Server 2019の標準機能だけではIPアドレスの国情報を直接取得することはできません。しかしながら、IISログやイベントログに記録されるクライアントIPを外部のジオロケーションサービスあるいはローカルデータベースと突合するだけで、容易に国別アクセスを把握できます。
国別アクセス可視化はセキュリティ対策、マーケティング分析の両面から大きな意義があります。VPNやプロキシなどで正確性が下がる場合もありますが、それでも全体的な傾向や異常検知には十分活用可能です。まずは無料サービスやデータベースを活用し、運用に合わせて必要があれば有料プランを検討するとよいでしょう。
今後のステップとしては、継続的なログ解析の自動化やリアルタイム監視の導入が挙げられます。PowerShellスクリプト、BIツール、Elastic Stackなどを組み合わせ、サーバー管理者やビジネス部門が一目で情報を把握できる仕組みを整備することで、より高度なセキュリティと分析体制を構築することができます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次