どうも、ディーネットでサーバの運用保守を担当している山田です。
ロードバランサー配下だと、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
動作確認の結果について
長くなり過ぎたので、動作確認は後日別途記載する予定です。