LoginSignup
2
2

More than 3 years have passed since last update.

mod_rpafというモジュールを使ってALBを利用できるようにする

Last updated at Posted at 2019-09-04

オンプレにあったプロダクトをクラウドに移行させました

移行させるのは今までも何度かやってきたので、プロダクト自体が動くところまではそこそこできましたが、今回問題となったのは、オンプレで機能していたリダイレクトの設定や、プロキシの設定などです。クライアントのリクエストがオンプレ側で使われていたプロキシサーバーだったりしていたので、その辺りの部分を、AWSのアーキテクチャに沿って整える必要がありました。具体的に言えば、オンプレでやっていたプロキシの部分をALBにやらせる設定に寄せて上げるということです。

mod_rpaf

設定でALBに寄せて上げなくてはならないモジュールがこれでした。このモジュールの機能は、

mod_rpafを使うと、ヘッダのIPアドレスを取得して、httpdの内部のリモートIPアドレスを保持している変数(REMOTE_ADDR)に上書きしてくれます。これにより、正しいアクセス元IPアドレスがアクセスログに記録されます。

ということだそうです。
ALBやApacheにはリクエストヘッダをいじくれるヘッダがあります。X-Forwardと名のつくヘッダがこれに当たります。こいつを使って、アクセスログに利用されたIPをログに取り、アクセスされているIPをhttpd側に取得させます。

apacheとalbに用意されているヘッダ

  • Apacheのmod_proxy_httpのヘッダ
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Host: {クライアントが送ってきた X-Forwarded-Host リクエストヘッダ値 + クライアントが送ってきた Host リクエストヘッダ値}
X-Forwarded-Server: {クライアントが送ってきた X-Forwarded-Server リクエストヘッダ値 + リバースプロキシサーバーのホスト名. ServerNameで指定}
  • ELBのヘッダ
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Port: {クライアントが接続してきたリバースプロキシサーバーのポート番号}
X-Forwarded-Proto: {クライアントが使用したプロトコル. 典型的には http や https}

mod_rpafのインストール

mod_rpafのインストールに伴い、まず、ビルドに必要なパッケージを落としてきます。

# yum install gcc
# yum install httpd httpd-devel

wgetを使って落っことしてきます。amazon-linuxに落っことしてきます。

$ mkdir mod_rpaf-0.6
$ cd mod_rpaf-0.6
$ wget https://raw.github.com/ttkzw/mod_rpaf-0.6/master/mod_rpaf-2.0.c
$ sudo /usr/sbin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

mod_rpafのディレクティブ

  • RPAFenable
     
    On設定すると、このモジュールの機能が有効になる。

  • RPAFsethostname

On設定すると、リバースプロキシが付与するヘッダX-Forwarded-HostあるいはX-Hostの値をHostヘッダの値として設定する。

  • RPAFproxy_ips

リバースプロキシのIPアドレスをスペース区切りで列挙する。オリジナルにはない付加機能として"10."や"172.16."のようなドットで終わるサブネットの記法も使える。なお、この範囲を可能な限り限定してください。リバースプロキシを経由しないアクセス経路があるときには、X-Forwarded-Hostヘッダの偽装の影響を受ける恐れがある。

  • RPAFheader

リバースプロキシが付与するアクセス元IPアドレスを格納しているヘッダ名を記述する。デフォルトではX-Forwarded-Forが使われる。

confへどう書いたか?

RPAFenable On
RPAFsethostname On
RPAFproxy_ips ここにALBのDNS名を追加
RPAFheader X-Forwarded-For

こんな感じでALBのドメイン名を直書きでできました。カスタムログで確認して、ALBHealthCheckerのログが残っていればOKです。

参考文献

リバースプロキシ/ロードバランサとmod_rpaf

ELB の仕様を Apache と比較

HTTP ヘッダーおよび クラシックロードバランサー

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2