next up previous contents
Next: 9.1.3 limit_except Up: 9.1 アクセス制御 Previous: 9.1.1 allow, deny

9.1.2 geo

たくさんのルールがある場合には、http_geo_module の変数を使うほうが 良いとマニュアルにあります。

実際、geo モジュールの変数を使うと非常に簡単になります。

   geo  $[$  $address $]$  $variable   { ... } ;

geo ディレクティブは、httpコンテキストのみで利用できます(勿論、定義した 変数自体は他のコンテキストで利用できます)。

geo ディレクティブでは、$remote_addr のアドレスに対して、 { ... } の中の条件を評価し、その結果が変数 $variable に 格納されます。もし、評価するアドレスを別の変数のものにしたい場合に、 $address を指定します。例えば、

     geo $arg_remote_addr  $mygeo  { .... }

有効なIPアドレスでないならば、255.255.255.255 が利用されます。

{ ... } の中に指定するアドレスは、CIDR あるいは範囲で指定します。

例を挙げます。

http {
     geo $myallow {
         127.0.0.1      allow;
         192.168.0.0/16 allow;
     }
     server {
         location / {
             if ( $myallow = "" ){ return 404; }
         }
     }
}

geo では、マッチしなかった場合デフォルトの値がセットされます。デフォルト の値を決めたい場合には、 default パラメータを用いますが、もし設定されて いなければヌル文字 "" が使用されます。

     geo $myallow {
         default        disable;
         127.0.0.1      allow;
         192.168.0.0/16 allow;
     }

この場合、マッチしなければ、文字列 "disable" が変数 $myallow にセットされます。 ちなみに、allow は単なる文字列として変数$myallow に格納される だけだという点に注意して下さい。

実際の利用方法としては、例えば、スマートフォン (キャリアごとのIPアドレスが入手できます) からのアクセスかどうかを判断して、 アクセスする場所を変えたり、国別IPアドレスを見て、クライアントの国に よって、アクセス先を変えたり、リダイレクトするなども出来ます。

なお、パラメータには以下のものがあります。

default
マッチしなかったものに対する値を決める。
delete
指定したネットワークを削除する。
include
アドレスと値を指定したファイルから読み込む。複数指定可能。
proxy
信頼できるアドレスを定義する。
信頼できるアドレスから来たリクエストであれば、"X-Forwarded-For" リクエスト ヘッダにあるアドレスを、ここで処理するアドレスとして使用する。他のアドレス とは異なり、信頼できるアドレスは順に処理される。
proxy_recursive
再帰的なアドレス検索を可能にする。
もし、再帰検索がオフであれば、信頼できるアドレスに一致するオリジナルの クライアントアドレスの代わりに、"X-Forwarded-For" にある直近のクライアント アドレスが使用される。再帰検索がオンであれば、"X-Forwarded-For" にある 直近の信頼されないアドレスが利用される。
ranges
CIDRではなく、アドレスの範囲を指定する。
このパラメータは一番最初に記述されなければならない。 アドレスは昇順に記述すべきである。

    geo  $country {
        default ZZ;
        include geo.conf;
        delete  127.0.0.0/16;
        proxy   192.168.100.0/24;

        127.0.0.0/24  US;
        127.0.0.1/32  RU;
        10.1.0.0/16   RU;
        192.168.1.0/24 UK;
    }

上の例では、例えば 127.0.0.1 は、最も狭い範囲でマッチしている RU にヒットし、US にヒットする訳ではない。

    geo  $country {
        ranges;
        default ZZ;
        include geo.conf;
        127.0.0.0-127.0.0.1   US;
        127.0.0.2-127.0.0.3   RU;
        127.0.0.1-127.0.0.255 US;
        192.168.1.0-192.168.1.255 UK;
    }



Noriyo Kanayama