# Elastic Beanstalk $_SERVER['REMOTE_ADDR'] 取得できない

ローカルで正しく動いたソースが AWS ELB にアップするとユーザーリモート IP アドレス取得できなくなりましたので、調べてみました。

Load Balancer $_SERVER['REMOTE_ADDR'] Not working

If you need the remote host's address from behind the ELB, get it from HTTP header "X-Forwarded-For".

X-Forwarded-For で取得できるようです。

// 本来アクセスユーザーの IP アドレス取得
$ip = $_SERVER['REMOTE_ADDR'];

// AWS ELBでアクセスユーザーの IP アドレス取得
$ip = $_SERVER['X-Forwarded-For'];

なぜ X-Forwarded-For

クライアントからのアクセスはロードバランサー経由してからサーバーへアクセスするため、$_SERVER['REMOTE_ADDR']で取得した IP アドレスはクライアントのではなく、ロードバランサーの IP アドレスになります。Elastic Load Balancing は、クライアントの IP アドレスを X-Forwarded-For リクエストヘッダーに格納してくれるので、$_SERVER['X-Forwarded-For']を使用することで正しくユーザー IP 取得できます。

Elastic Load Balancing 処理後の header 例

# ip v4
X-Forwarded-For: 203.0.113.7

# ip v6
X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e

ここのForFormの略?かもしれません。

使える X-Forwarded ヘッダー一覧

  • X-Forwarded-For (リモート IP 取得)
  • X-Forwarded-Proto (リモート接続プロトコル HTTP,HTTPS か)
  • X-Forwarded-Port (リモート接続送信先ポート)

# SERVER REMOTE_ADDR 取得できないといろいろ困る不具合

正確にはローカルではロードバランサー考慮なしで ELB にアップするといろいろ不具合出ます。

頻繁にログアウトが起きる

ログインしたばかりで session 切れでログアウトされる不具合があります。
ブラウザ、IP、クッキーの情報を元にセッション ID 発行していますが、IP が変わったと判断されるともちろん session id 再発行されて、ログアウトすることになります。

# 参考

HTTP ヘッダーおよび クラシックロードバランサー (opens new window)
Elastic Load Balancing の仕組み (opens new window)
Classic Load Balancer のスティッキーセッションの設定 (opens new window)

2020-11-22
  • aws
  • server

関連記事

5 分で VPN サーバー立てる! wg-easy の使い方
積水ハウス 個人情報流出 SQL インジェクション攻撃か
ZeroSSL で無料 SSL できるけど Let's Encrypt と比較
ジェネレーティブ AI と大規模言語モデル(LLM)を学ぶためのリソース
XZ Utils 事件対応
Ubuntu で Web サーバーを構築する手順
メールサーバー移行と POP & IMAP 設定
Docker Supervisor 使ってバッチ処理
よく使う WSL コマンド
自宅サーバー構築!  Nextcloud で NAS クラウドストレージ
no such file or directory: /usr/share/zsh/vendor-completions/_docker
oh my zsh 使うべし
AWS Lambda Nodejs で chatwork へ post 送信
AWS CloudWatch ログ監視で Lambda 処理
AWS SES メール開封確認  DB に集計
Vim 操作とショートカット
DDNS 無料ダイナミック DNS サービス 4 つ
Nginx 基本設定
SPF メール送信なりすまし対策
Windows Mac Linux hosts ファイル場所
AWS Unresolved resource dependencies [AWSEBV2LoadBalancer] エラー
ディスク容量を確認する df コマンド
Laravel Address already in use の原因
content-security-policy 設定
AWS Elastic Beanstalk php.ini 設定変更
AWS Elastic Beanstalk 環境設定
AWS のタイムゾーンを UTC 協定世界時から JST 日本標準時に変更
Docker の基本的な使い方
Amazon DynamoDB 制限調査
AWS 504 Gateway Timeout エラー対応
Shell と Bash のいろいろ
Mac ターミナル SSH 接続設定
crontab 設定いろいろ
AWS EC2 の amazon-linux-extras の話
デプロイツール Capistrano
解決! xserver php バージョンアップした時に ssh 環境に反映されない
youtube 見れるように vpn サーバー建ててみた
xserver に vim インストール
xserver に nodejs インストール
レンタルサーバーなら xserver おすすめ理由
Docker command でドッカー練習する時のメモ
Windows10 Home に Docker 入れた時のメモ
Centos7 Webserver 構築の時のメモ