klabさんの、mod_cidr_lookup を使っていたんだけど、
AMAZONのEC2のElastic Load Balancerで、アクセス元のIPが
x-forward-forヘッダに含まれる所でドハマリしたので対応メモ。
他リバースプロキシ経由してきた時なんかにも同様の流れで行けるはず…
C言語判らんがな(´;ω;`)
まずは取得して解凍
場合によってはMakefile書き換え。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
--- 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とか知らなかったから、対応方法調べるのに
えらい時間かかったぜ。。。
0 件のコメント:
コメントを投稿