IP制限のあるWEBAPIをリバースプロキシでクリアする
たとえば住所から緯度経度を取得できるgoogleのGeocodingAPIには、同一IPから1,500回/日の利用制限があります。
便利なAPIやWEBサービスにIPベースの制約がある場合、上位の有償サービスを利用登録したり、利用元のサーバーを増設したりするのが、よくある対策かと思います。
しかしクライアントに予算の都合があったり、スタートアップで一時的に試したい場合など、それ以外の手段でこれを解決しなければならないこともあります。
かかる予算は追加するグローバルIPの料金のみです。
見出しでリバースプロキシと書きましたが、そのような振る舞いに見えるだけで、実際にはプロキシサーバーの導入や、WEBサーバーへのプロキシモジュールの設定などは発生しません。
発生する作業は、IPの取得とネットワークの設定、アプリケーション側の一部コードの修正のみです。
これで、利用先サーバー(API側)からみると、利用元サーバーが同一であっても、異なるIPによるアクセス要求なので、IP制限がかからなくなります。
前置きはこの程度で、早速その方法を書きたいと思います。
=== 前提 ===
利用元サーバー: GMOクラウド
利用元WEBアプリケーション: PHP
(上記以外であっても、ネットワークがいじれるサーバー、ソケット通信のオプションがいじれる、またはシステム関数がいじれる言語であれば問題ないと思います)
=== 手順 ===
1. セカンダリIPアドレスの追加
https://support.gmocloud.com/pf/guide/isolate/useful/ip.html
仮想ルータからみた際の利用元サーバーの関連付けに必要
2. グローバルIPアドレスの追加
https://support.gmocloud.com/…/guide/isolate/console/ip.html
WANからみた際の利用元サーバーの関連付けに必要
3. スタティックNATの設定
https://support.gmocloud.com/…/gui…/isolate/console/nat.html
仮想ルータの内側(1.)と外側(2.)の関連付けに必要
4. ソケット通信の切り替え
APIコールしている部分の関数を以下のように修正します。
$ips = [‘aaa.aaa.aaa.aaa’, ‘bbb.bbb.bbb.bbb’, ‘ccc.ccc.ccc.ccc’];
$context = stream_context_create(
[‘socket’ => [‘bindto’ => $ips[array_rand($ips)]]]
);
$result = file_get_contents(‘http://example.com/api/****’, false, $context);
—
以上です。簡単ですね。
もし利用先サーバーが逆引き確認もしているようであれば、取得したIPにそれぞれドメインも割り振っておきましょう。疎通確認もしているようであれば、ファイアウォールの設定から必要なポートやICMPの開放もしておきましょう。
ただし、利用先サーバー側の制限ロジックに依存するので万能ではないことと、これを嫌うサービス提供会社もあるので、その点は配慮して、悪用せずに正しくソリューション活用していただければと思います。