Apache2.4系であれば、デフォルトで組み込まれているmod_remoteip
ですがApache2.2系で使う方法をご紹介します。
どんなときに"mod_remoteip"を使うのか
LB(ロードバランサー)やWAF、CDNだったりが最近はリバースプロキシ型が多くクライアント端末との通信がApacheまで直接行われない環境において役に立ちます。
具体的に言うと
リバースプロキシでは大体が、接続元のIPアドレスをX-Forwarded-For
というHTTPヘッダに格納してくれるのでこれをApache内部でうまく送信元IPとして書き換えてくれるモジュールです。
仕様
ここで、使用したサーバ環境は以下のような感じです。
OS | Apache |
---|---|
CentOS release 6.9 64bit | httpd-2.2.15-60.el6.centos.6.x86_64 |
インストール作業
Apacheのバージョンが2.2系であることを確認します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# httpd -V Server version: Apache/2.2.15 (Unix) Server built: Oct 19 2017 16:43:38 Server's Module Magic Number: 20051115:25 Server loaded: APR 1.3.9, APR-Util 1.3.9 Compiled using: APR 1.3.9, APR-Util 1.3.9 Architecture: 64-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/etc/httpd" -D SUEXEC_BIN="/usr/sbin/suexec" -D DEFAULT_PIDLOG="run/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="logs/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" |
ないとは思いますが、mod_remoteipが既に組み込まれていないか確認します
1 2 3 |
# httpd -M | grep "remote" Syntax OK |
remoteip_module
が表示された場合、既に組み込まれています
作業にあたって必要なライブラリやパッケージをインストールします
1 2 |
# yum install -y make.x86_64 cpp.x86_64 git.x86_64 httpd-devel.x86_64 gcc.x86_64 |
- 必要なものが足らないとインストール時にエラーとなります
githubに掲載されているmod_remoteipのソースをクローンします
1 2 3 4 5 6 7 |
# cd /usr/local/src/ # git clone https://github.com/ttkzw/mod_remoteip-httpd22.git Initialized empty Git repository in /usr/local/src/mod_remoteip-httpd22/.git/ remote: Counting objects: 6, done. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 6 Unpacking objects: 100% (6/6), done. |
先ほどのソースをコンパイルしてからインストールします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# cd mod_remoteip-httpd22/ # apxs -i -c -n mod_remoteip.so mod_remoteip.c /usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wformat-security -fno-strict-aliasing -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -pthread -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/include/apr-1 -c -o mod_remoteip.lo mod_remoteip.c && touch mod_remoteip.slo /usr/lib64/apr-1/build/libtool --silent --mode=link gcc -o mod_remoteip.la -rpath /usr/lib64/httpd/modules -module -avoid-version mod_remoteip.lo /usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' mod_remoteip.la /usr/lib64/httpd/modules /usr/lib64/apr-1/build/libtool --mode=install cp mod_remoteip.la /usr/lib64/httpd/modules/ libtool: install: cp .libs/mod_remoteip.so /usr/lib64/httpd/modules/mod_remoteip.so libtool: install: cp .libs/mod_remoteip.lai /usr/lib64/httpd/modules/mod_remoteip.la libtool: install: cp .libs/mod_remoteip.a /usr/lib64/httpd/modules/mod_remoteip.a libtool: install: chmod 644 /usr/lib64/httpd/modules/mod_remoteip.a libtool: install: ranlib /usr/lib64/httpd/modules/mod_remoteip.a libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/sbin" ldconfig -n /usr/lib64/httpd/modules ---------------------------------------------------------------------- Libraries have been installed in: /usr/lib64/httpd/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- chmod 755 /usr/lib64/httpd/modules/mod_remoteip.so |
- このときに、足らないものがあればエラーとなります
初期の設定ファイルをコピーします
1 2 |
# cp -p mod_remoteip.conf /etc/httpd/conf.d/ |
先ほどのモジュールが組み込まれたことを確認します
1 2 3 4 |
# httpd -M | grep "remote" Syntax OK remoteip_module (shared) |
remoteip_module
があるので成功です
設定ファイルについて確認します
1 2 3 4 5 |
# 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・・・
送信元IPの書き換えに使う、HTTPヘッダ名を定義します。
※通常は、X-Forwarded-For
のままで問題ないですが、一部CDNとWAFの多段構成だったりするとX-Forwarded-For2
にする必要があるかもしれません。 -
RemoteIPInternalProxy・・・
送信元IPの書き換えを行うにあたって、信頼できるホストのIPアドレスを定義します。
※例えば、悪意のある人がX-Forwarded-For
に適当なIPアドレスを記載されるとそれに置き換えてします可能性があるので送信元IPが限定されているWAFなどを利用する場合は設定するようにしましょう。
どうしても、WAFのIPなどがわからない場合は、この設定項目は消してください。
参考サイトを見ていただくと更なる設定項目について紹介されています。
デフォルトのLogFormatを書き換えします
デフォルトのLogFormatで用いられている%h
では、書き換えられたIPアドレスが記録されないので%a
に書き換えます。
1 2 |
# sed -i 's/%h/%a/g' /etc/httpd/conf/httpd.conf |
余談
他にも、.htaccessなどで使われる
REMOTE_HOST
は書き換えられないがREMOTE_ADDR
は書き換えられるなど少し配慮も必要
Apacheの再起動を実施します
1 2 3 4 5 |
# service httpd configtest Syntax OK # service httpd restart |