Overview

mod_cidr_lookupは、アクセスしてきたクライアントのIPアドレスが、起動時に読み込んでおいたCIDRブロック群のいずれかにマッチするかどうかを判別するためのモジュールです。Apache 2.0と2.2系に対応しています。

マッチした結果は、環境変数 (X_CLIENT_TYPE) とHTTPリクエストヘッダ (X-Client-Type) にセットするので、Apache自身とバックエンドのWebアプリの両方で同じ情報を参照することができます。

使用例

IPアドレス帯域の正確性などについては、情報提供元にお問い合わせください。

クローラからのアクセスは別のサーバにreverse proxyする

モバイル用のクローラには、送信元IPアドレスを公開しているものがあります。

これらの情報を使って、クローラからのアクセスを判別し、クローラはクローラ専用のサーバクラスタへreverse proxyで振り分けることができます。

mod_rewriteを使った設定例はこうなります。

    RewriteCond %{ENV:X_CLIENT_TYPE} ^crawler-.*  # (2) 環境変数X_CLIENT_TYPEcrawler-で始まるときだけ。
    RewriteRule ^/(.*)/$ http://4crawler/$1 [P,L] # (1) http://4crawlerにreverse proxyする

特定のクライアントからのアクセスを許可する

Allowディレクティブでは環境変数を参照することができるので、例えば自社のIPアドレス帯からのアクセスを許可したり、

    Allow from env=my_company

モバイルキャリアからのアクセスを許可したり、

    SetEnvIf X_CLIENT_TYPE "^(docomo|au|softbank)" is_mobile # 3キャリアのいずれかの場合は新たに環境変数is_mobileをセットする
    Allow from env=is_mobile

ということができます。

またWebアプリから、環境変数を参照したり、

<?php
    $type = getenv("X_CLIENT_TYPE"); # docomo, au, softbank, ...

リクエストヘッダを参照することによって、

<?php
    $r->header_in("X-Client-Type"); # docomo, au, softbank, ...

    $headers = apache_request_headers();
    $headers["X-Client-Type"]; # docomo, au, softbank, ...

判別した結果を参照することができます。

Release Note

2008-09-16 mod_cidr_lookup-1.2

  • サーバ設定とバーチャルホストのコンテキストで、mod_cidr_lookupでセットした環境変数が、SetEnvIfで参照できない問題を修正しました。

2008-09-12 mod_cidr_lookup-1.1

  • mod_cidr_lookupでセットした環境変数が、SetEnvIfで参照できない問題を修正しました。ブログでコメントいただいたesさん、ありがとうございました!

2008-08-25 mod_cidr_lookup-1.0

  • 最初のリリース

Download

Installation

    VER=1.0
    tar zxf mod_cidr_lookup-${VER}.tar.gz
    cd  mod_cidr_lookup-${VER}/apache2
    make
    sudo make install

Configuration

まず、モジュールをロードします。

    LoadModule  cidr_lookup_module  modules/mod_cidr_lookup.so

mod_cidr_lookupが提供するディレクティブはCIDRFileだけです。

CIDRFile

説明 CIDRマッチに使用するための、CIDRの一覧が書かれているテキストファイルの名前を指定する
構文 CIDRFile file-path
コンテキスト サーバ設定ファイル, バーチャルホスト, ディレクトリ (.htaccessでは指定できません)
モジュール mod_cidr_lookup

CIDRマッチに使用するための、CIDRの一覧が書かれているテキストファイルを指定します。

CIDRFile “/usr/local/etc/ip.d/crowler-google” CIDRFile “/usr/local/etc/ip.d/crowler-yahoo” CIDRFile “/usr/local/etc/ip.d/crowler-livedoor”

シェル形式(fnmatch)のワイルドカードを使って、複数のファイルを一度に指定することもできます。

CIDRFile “/usr/local/etc/ip.d/*” CIDRFile “/usr/local/etc/ip.d/[a-z]*[a-z]”

CIDRFileで指定されたファイルの名前が、ヘッダや環境変数に埋め込まれる文字列になります。

例えば、

<VirtualHost *:80> ServerName … DocumentRoot /… … CIDRFile “/usr/local/etc/ip.d/foo” CIDRFile “/usr/local/etc/ip.d/bar” CIDRFile “/usr/local/etc/ip.d/baz” </VirtualHost>

という設定とそこで指定しているCIDRのファイルが以下のときに、

$ cat /usr/local/etc/ip.d/foo 172.16.0.0/16 $ cat /usr/local/etc/ip.d/bar 10.0.1.0/24 10.1.1.0/24 10.2.1.0/24 $ cat /usr/local/etc/ip.d/baz 10.10.0.0/16 10.14.0.0/16

アクセスしてきたクライアントのIPアドレスが10.1.1.64の場合は、ファイルbarに書かれている2つめのCIDR(10.1.1.0/24)にマッチするので、環境変数X_CLIENT_TYPEとリクエストヘッダX-Client-Typeに”bar”がセットされます。

Note

  • CIDRファイルの変更を反映するには、httpdを起動し直すか、シグナル(HUPUSR1)を送って再起動してください。

Authors

  • HIROSE Masaaki
  • YASUI Masanobu
  • HAMANO Tsukasa
  • INADA Naoki

License

  • Apache License Version 2.0