24時間365日フルマネージドホスティングサービスのデイーネット

Apache2.2系にmod_remoteipを組み込む

どうも、ディーネットでサーバの運用保守を担当している山田です。

ロードバランサー配下だと、Apacheが扱える送信元IPの制御に一苦労するので、Apache2.2系にmod_remoteipを組み込んでみたいと思います。

どんなときに使うの?

CDNやWAF、ロードバランサーを使うと、本来の送信元IPはX-Forwarded-Forに隠されてしまい、
Apacheで正しく送信元IPを評価できない場合に利用します。

簡単に言うと?

X-Forwarded-Forを用いてApache内部で、送信元IPを書き換えてくれる大変ありがたいモジュールです。

それでは、実際に作業内容を見ていこう

その前に今回の検証環境について

  • OS:CentOS release 6.9 (Final) 64bit
  • Apache:2.2.15(yumを使ったインストール)

1. Apacheのバージョンを確認する

  • Apache 2.2系であることを確認
# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 19 2017 16:43:38

2. remoteip_moduleが既に組み込まれていないか確認する

  • モジュール一覧にあるか調べる
# httpd -M 2>&1 | grep -c "remote"
0

3. 必要なパッケージやライブラリをインストールする

  • 既にインストール済みであったらインストール不要
# yum install make.x86_64 cpp.x86_64 git.x86_64 httpd-devel.x86_64 gcc.x86_64

4. gitに掲載されているmod_remoteipをcloneする

  • GiuHub上に用意頂いているソースをcloneさせて頂く
# cd /usr/local/src/
# git clone https://github.com/ttkzw/mod_remoteip-httpd22.git

5. コンパイルとインストールを行う

  • モジュールのコンパイル作業はいたって簡単
# cd mod_remoteip-httpd22/
# apxs -i -c -n mod_remoteip.so mod_remoteip.c

※必要なパッケージが不足していたら、エラーになるのでそのときは個別にインストールしてね

6. 設定ファイルを設置する

  • 初期で設定ファイルが用意されているのでコピーして使う
# cp -p mod_remoteip.conf /etc/httpd/conf.d/

7. モジュールが読み込まれることを確認する

  • mod_remoteip.confに書かれているLoadModuleによってモジュール一覧にあることを確認
# httpd -M 2>&1 | grep "remote"
 remoteip_module (shared)

8. 設定ファイルを条件に応じて整える

  • 利用する環境に応じて設定ファイルを適宜書き換える
# cat /etc/httpd/conf.d/mod_remoteip.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
RemoteIPHeader
  • Apache内部で送信元IPを置き換えるのに使うヘッダーを指定します。
RemoteIPInternalProxy
  • 信頼のおける送信元IPを指定します。
    CDNやWAF、ロードバランサーなどで送信元IPが限定されているのなら指定して
    おくことで、関係のないIPアドレスからX-Forwarded-Forを投げつけられて
    Apache内部で送信元IPが書き換えられることを防げる。
  • CDNやWAF、ロードバランサーなどの送信元IPがわからなければこのパラメータは
    設定しないことで全てのIPからのX-Forwarded-Forを書き換えてもらうことができる。
  • 他にも、設定できるパラメータが複数用意されているがここでは最低限必要なもの
    だけにさせて頂く。

9. LogFormatを書き換えよう

LogFormatで用いられている%hという部分だが、mod_remoteipの書き換え対象外なのだ。
そのため、%hではなく%aに変更頂く必要がある。

  • %h・・・リモートホスト
  • %a・・・リモートIPアドレス
  • 参考程度だが、以下のようなコマンドを使うと一括で更新できたりする。
# sed -i 's/%h/%a/g' /etc/httpd/conf/httpd.conf

10. 最後にApache再起動で反映をお忘れなく..

  • 設定ファイルの文法チェック
# service httpd configtest
  • Apacheの再起動
# service httpd status
# service httpd restart
# service httpd status

動作確認の結果について

長くなり過ぎたので、動作確認は後日別途記載する予定です。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar