ほとんどのストリーミングサービスおよびコンプライアンス重視のプラットフォームは、60~80%の住宅用IPに対して地理位置情報制限を正しく適用できていないことが、3つの主要CDNの内部監査で明らかになっています。根本原因はIPデータベースの質の低さではなく、実際にジオフェンシングを突破するエッジケースを決してテストしないワークフローにあります。ジオブロッキングを単なるIP-to-国ルックアップと捉えるエンジニアは、障壁ではなくザルを作っているのです。
単純なIPルックアップが大規模環境で失敗する理由
標準的なアプローチ——MaxMindや類似のGeoIPデータベースにcountry_codeを問い合わせる方法——は、データセンターIPや大規模ISPブロックでは機能します。しかし、他国の中央ゲートウェイを経由するモバイルキャリアIP、複数の法域に地上局を持つ衛星ISP、現在の地政学的境界が引かれる前に割り当てられたIPでは壊滅的に失敗します。RFC 8805は地理位置情報フィードのフォーマットを定義していますが、ほとんどのプロバイダは依然として古いデータや集約されたデータを提供しています。2023年の調査では、RIPE NCCデータベース内のIPの34%が、保有者の登録住所と一致しない国コードを持っていました。単一のデータベースに対するテストはテストではなく、希望的観測に過ぎません。
VPN・プロキシ検出:テストしていないバイパス経路
ストリーミングサービスはVPNブロックリストに多額の投資をしていますが、そのブロックリストの品質はそれを検証するテストハーネス次第です。よくある間違いは、既知のVPNエンドポイント(例:商用プロバイダの出口ノード)からテストして完了とすることです。実際の攻撃者は60秒ごとにIPをローテーションし、住宅用プロキシネットワークを使用するか、まだフラグが立っていないクラウドプロバイダの出口IPを経由してトンネリングします。適切な検証ワークフローには、公開フィード(例:https://check.torproject.org/exit-addresses)から既知のオープンプロキシ、VPN出口ノード、Torリレーのリストを取得し、サービスの地理位置情報制限エンドポイントにリクエストを送信してレスポンスステータスを確認するスクリプトを含める必要があります。以下は、curlとjqを使用した最小限のテストループです。
#!/bin/bash
# Test geo-restricted endpoint against a list of suspicious IPs
ENDPOINT="https://api.example.com/geo/check"
while IFS= read -r ip; do
result=$(curl -s -o /dev/null -w "%{http_code}" --resolve "api.example.com:443:$ip" "$ENDPOINT")
if [[ "$result" != "403" ]]; then
echo "FAIL: $ip returned $result (expected 403)"
fi
done < /tmp/suspicious_ips.txt
このスクリプトは--resolveを使用して、元のホストヘッダーを保持したまま特定のIP経由で接続を強制します。これは、ほとんどのCDNレベルの地理位置情報チェックをバイパスする手法です。これらのIPのいずれかに対してサービスが200または302を返した場合、ジオフェンシングは破綻しています。
IPv6地理位置情報のギャップと国境をまたぐモバイルキャリアIP
IPv6の地理位置情報精度は多くの地域で50%未満であり、特にヨーロッパやアジアでは、キャリアが複数の国にまたがる単一の/32プレフィックスを使用しています。フランスのストラスブールにある携帯電話が、ドイツのキャリアのコアネットワークから発信されているように見えることがあります(事業者が単一のアンカーポイントを使用している場合)。X-Forwarded-Forヘッダーには、ユーザーのIPv6アドレスではなく、キャリアのNATゲートウェイのIPv4アドレスが含まれていることがよくあります。これをテストするには、国境地域(例:スイスのバーゼル、テキサス州エルパソ)のモバイルネットワークに接続したテストデバイスからリクエストを送信し、サービスの地理位置情報結果とデバイスの実際のGPS座標を比較します。誤差が100kmを超える場合、コンプライアンスチームに問題があります。GDPRはデータ処理をユーザーの実際の位置に結び付けることを要求しており、キャリアの位置ではありません。
IPチェックを超えた規制コンプライアンステスト
GDPRやCOPPAは、IPデータベースベンダーを気にしません。彼らが気にするのは、EU内のユーザーにEU準拠のコンテンツが提供されるかどうか、米国の13歳未満のユーザーが個人データの収集をブロックされるかどうかです。コンプライアンスのための地理位置情報制限テストでは、HTTPステータスコードだけでなく、サービスのレスポンスが検出された位置に基づいて正しく変化することを確認する必要があります。例えば、国ごとに異なるカタログを提供するストリーミングサービスは、英国のユーザーには英国のカタログ、フランスのユーザーにはフランスのカタログ、ライセンス未取得地域のユーザーには「利用不可」ページが表示されることを保証しなければなりません。テストには、地域固有の文字列、Cookie、リダイレクト先についてレスポンスボディをチェックすることを含めるべきです。Cloudflareを使用している場合、curlと--header "CF-IPCountry: GB"を組み合わせた単一のテストは簡易的なスモークテストとしては有効ですが、CDNレイヤーのみをテストし、アプリケーションロジックはテストしません。各対象国のIPでX-Forwarded-Forヘッダーを偽装し、レスポンスから既知の一意識別子(例:JSONフィールド"catalog": "uk")を解析するテストスイートを構築してください。
再現可能なQAパイプラインの構築
地理位置情報制限テストを手動で実行するのはやめましょう。geoip-binパッケージのgeoiplookupのようなツールと、プライマリデータベースで誤った位置情報が登録されていることが判明しているIPのリストを組み合わせて、CI/CDパイプラインに検証を統合してください。新しいジオフェンシングルールをデプロイするたびにテストを実行します。マルチソースアプローチを使用します。各テストIPに対してMaxMind、IP2Location、無料のRIPE NCC APIを問い合わせ、大多数のソースがサービスのレスポンスと一致しない場合はビルドを失敗させます。以下のコマンドは、サービスの判定を3つのデータベースと比較します。
#!/bin/bash
IP="1.2.3.4"
RESPONSE=$(curl -s "https://api.example.com/geo/check?ip=$IP" | jq -r '.country')
MAXMIND=$(geoiplookup "$IP" | awk '{print $4}')
IP2LOC=$(curl -s "https://api.ip2location.com/?ip=$IP&key=test" | jq -r '.country_code')
if [[ "$RESPONSE" != "$MAXMIND" && "$RESPONSE" != "$IP2LOC" ]]; then
echo "WARNING: Geo response differs from majority of databases"
fi
単一のデータベースが権威であることはありません。60~80%の失敗率を捉える唯一の方法は、現実世界のエッジケース(モバイルキャリアIP、IPv6プレフィックス、住宅用プロキシ)でテストすることです。それ以下では、コンプライアンスインシデントが発生するのを待つだけです。