highlight js

2012年4月11日水曜日

EC2:ELBにmod_cidr_lookupを対応させるメモ

EC2、ELB経由でモバイルのアクセスをさばく時に
klabさんの、mod_cidr_lookup を使っていたんだけど、
AMAZONのEC2のElastic Load Balancerで、アクセス元のIPが
x-forward-forヘッダに含まれる所でドハマリしたので対応メモ。

他リバースプロキシ経由してきた時なんかにも同様の流れで行けるはず…

C言語判らんがな(´;ω;`)


まずは取得して解凍
cd
cd src
wget http://downloads.sourceforge.net/modcidrlookup/mod_cidr_lookup-1.2.tar.gz
tar zxvf mod_cidr_lookup-1.2.tar.gz
cd mod_cidr_lookup-1.2/apache2
場合によってはMakefile書き換え。
--- APXS      = apxs
--- APACHECTL = apachectl
+++ APXS      = /usr/local/apache2/bin/apxs
+++ APACHECTL = /usr/local/apache2/bin/apachectl

でもって本体書き換え。
lookup_cidr関数内でremote_addrからipaddr_ptrを取得してる部分で、
X-Forwarded-Forから作ったネットワークアドレス構造体で
ipaddr_ptrを上書き。

今回のEC2の場合はIPV6を持ってるので、IPV6の方だけ書き換え。

  • vim mod_cidr_lookup.c


$ *lookup_cidrを探す

uint8_t        *addr;
++  const char *fwdvalue;
++  fwdvalue = apr_table_get(r->headers_in, "X-Forwarded-For");


#if APR_HAVE_IPV6
  if (sockaddr->family == AF_INET6 &&
      IN6_IS_ADDR_V4MAPPED(&sockaddr->sa.sin6.sin6_addr)) {
++    if (fwdvalue) {
++      inet_aton(fwdvalue, sockaddr->ipaddr_ptr);
++    }
   addr = (uint8_t *)&((uint32_t *)sockaddr->ipaddr_ptr)[3];
     } else
#endif
.
.
.


inet_atonとか知らなかったから、対応方法調べるのに
えらい時間かかったぜ。。。