質問編集履歴

4 進捗の追記

CyberMergina

CyberMergina score 275

2016/02/15 18:04  投稿

ELB配下のEC2でnginxのリバースプロキシを使っている環境のみアクセス元IPが取得できない
**ELB × nginx(リバースproxy) × Nodeサーバーの環境で、Nodeサーバー側のシステムにアクセス元IPアドレスを渡したい。**
**□ 状態(追記しました)**
- リスナー設定
```
TCP(80) -> TCP(80)
SSL(443) -> TCP(80)
```
**□ 今分かっていること**
- ELB × nginxの環境で、$remote_addrがELBのアドレスになる
- ELB側でアクセス元IPアドレスがヘッダーの「X-Forwarded-For」に渡されている
ということは把握しています。
リバースプロキシを使用しない場合は「X-Forwarded-For」からアクセス元IPアドレスはとれました。
ですが、nginxでリバースプロキシを使用する場合は「X-Forwarded-For」にもELBのアドレスが入ってます。
(これはnginx側でセットされたのでしょうか・・・)
**□ nginxの変数**
$remote_addr, $proxy_add_x_forwarded_for にはELBのアドレス
$http_x_forwarded_for は空
何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。
よろしくお願いします。
***
**/etc/nginx/nginx.conf**
```conf:nginx.conf
http {
   include        /etc/nginx/mime.types;
   default_type   application/octet-stream;
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log /var/log/nginx/access.log main;
   sendfile           on;
   tcp_nopush         on;
   tcp_nodelay        on;
   keepalive_timeout  65;
   types_hash_max_size 2048;
   include /etc/nginx/conf.d/*.conf;
   index  index.html index.htm;
#   set_real_ip_from  10.0.0.0/8;
#   real_ip_header    X-Forwarded-For;
}
```
**/etc/nginx/conf.d/default.conf**
```conf:default.conf
server {                                                           
server {
 listen 80 proxy_protocol;
 server_name hoge.hoge.jp;
 proxy_request_buffering off;
 set_real_ip_from XX.XX.0.0/XX; # VPC CIDR
 real_ip_header  proxy_protocol;
 location /demo/ { # デモページ(html)
   proxy_pass http://demo.localhost/;
 }
 location / { # socket.io用のjsファイルを読み込むのに使用します。
   proxy_pass http://0.0.0.0:1000;
 }
 location /socket.io/ { # websocket通信
   proxy_pass http://0.0.0.0:2000;
   proxy_set_header X-Real-IP $proxy_protocol_addr;
   proxy_read_timeout 150;
   proxy_set_header Host $host:$server_port;
   proxy_set_header X-Forwarded-For $proxy_protocol_addr;
   proxy_set_header X-Forwarded-Proto http;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
 }
}                                                               
```
***
**□ 進捗**
**AWSのELBにProxyProtocolを有効にするような設定が必要?**
> 参考
[AWS wiki](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html)
[How to configure AWS ELB and Nginx for WebSocket protocol? [closed]](http://stackoverflow.com/questions/33433768/how-to-configure-aws-elb-and-nginx-for-websocket-protocol)
[Using Proxy Protocol With Nginx](https://chrislea.com/2014/03/20/using-proxy-protocol-nginx/)
**>ProxyProtocolを有効にしました。(追記:2016/02/10 16:28)**
恐らくあと少しで解決しそうです・・・!
TaichiYanagiyaさんの案①を参考に設定すると、nginxのログにはアクセス元IPが出てきました!
```
'$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
```
```
- - [10/Feb/2016:16:15:01 +0900] "PROXY TCP4 [アクセス元IP] XXX.XXX.XXX.XXX 5602 443" 400 172 "-" "-"
```
但し、BadRequestが出ています・・・
もう少し調べてみます・・・!
**>ProxyProtocolを有効にしました。(追記:2016/02/10 19:21)**
ひとまず、現状の設定ファイルの内容に更新しました。
ProxyProtocolを有効にしたことで、Bad Requestが発生しています。
AWSのProxyProtocol使用の前提条件に「プロキシサーバーとロードバランサーの両方で有効になっていること」とありました。
http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/
Nodeサーバー側でも何らかの処理が必要になるのでしょうか・・・?
その方面で検索すると[こちらの記事](http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/)を発見しましたので、調べてみます。
その方面で検索すると[こちらの記事](http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/)を発見しましたので、調べてみます。
**>ProxyProtocolを有効にし、BadRequestは解決。ただ、他のVHと共存できない(追記:2016/02/15 18:04)**
- TCPで通信するVirtualHostのみにした際、BadRequestは解決し、ログファイルにも「"PROXY ..."」ではなく「"GET ..."」という形でログが残るようになっていました
ただ、他にHTTPで通信しているVirtualHost(Server Nameで分けている)が接続できなくなった。
構造は以下の通りになっています。
```
[ELB1]
server_name hoge.jp
 HTTPS(443) -> HTTP(80)
 HTTP(80)  -> HTTP(80)
 [nginx]
   root(/var/www/html)
[ELB2]
server_name node.hoge.jp
 SSL(443) -> TCP(80)
 TCP(80) -> TCP(80)
 [nginx(Reverce Proxy)]
   / -> 3000port(Nodeサーバー)
   /socket.io/ -> 4000port(WSサーバー)
[ELB3]
server_name main.hoge.jp
 HTTPS(443) -> HTTP(80)
 HTTP(80)  -> HTTP(80)
 [nginx]
   root(/var/www/main)
```
※インスタンスは1つ
※現在、最小構成にしているのでProxyサーバー、Appサーバーなど分けていません。
proxy protocolを有効にすると**ELB1**と**ELB3**が接続できなくなります。
(ELBのヘルスチェックで引っかかる)
TCPとHTTPの共存は厳しいのでしょうか・・・?
  • nginx

    1035 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • AWS(Amazon Web Services)

    2537 questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Elastic Load Balancing

    36 questions

    Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

3 進捗を追記しました。設定ファイルの内容を現時点のものに書き換えました。

CyberMergina

CyberMergina score 275

2016/02/10 19:28  投稿

ELB配下のEC2でnginxのリバースプロキシを使っている環境のみアクセス元IPが取得できない
**ELB × nginx(リバースproxy) × Nodeサーバーの環境で、Nodeサーバー側のシステムにアクセス元IPアドレスを渡したい。**
**□ 状態(追記しました)**
- リスナー設定
```
TCP(80) -> TCP(80)
SSL(443) -> TCP(80)
```
**□ 今分かっていること**
- ELB × nginxの環境で、$remote_addrがELBのアドレスになる
- ELB側でアクセス元IPアドレスがヘッダーの「X-Forwarded-For」に渡されている
ということは把握しています。
リバースプロキシを使用しない場合は「X-Forwarded-For」からアクセス元IPアドレスはとれました。
ですが、nginxでリバースプロキシを使用する場合は「X-Forwarded-For」にもELBのアドレスが入ってます。
(これはnginx側でセットされたのでしょうか・・・)
**□ nginxの変数**
$remote_addr, $proxy_add_x_forwarded_for にはELBのアドレス
$http_x_forwarded_for は空
何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。
よろしくお願いします。
***
**/etc/nginx/nginx.conf**
```conf:nginx.conf
http {
   include        /etc/nginx/mime.types;
   default_type   application/octet-stream;
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log /var/log/nginx/access.log main;
   sendfile           on;
   tcp_nopush         on;
   tcp_nodelay        on;
   keepalive_timeout  65;
   types_hash_max_size 2048;
   include /etc/nginx/conf.d/*.conf;
   index  index.html index.htm;
   set_real_ip_from  10.0.0.0/8;
   real_ip_header    X-Forwarded-For;
#   set_real_ip_from  10.0.0.0/8;
#   real_ip_header    X-Forwarded-For;
}
```
**/etc/nginx/conf.d/default.conf**
```conf:default.conf
server {                                                           
 listen 80;                                                       
 server_name hoge.hoge.jp;                                       
 proxy_request_buffering off;                                     
                                                                   
 location /demo/ {                                                 
   proxy_pass http://demo.localhost/;                             
 }                                                                 
                                                                   
 location / {                                                     
   proxy_pass http://0.0.0.0:1000;                                 
 }                                                                 
                                                                   
 location /socket.io/ {                                           
   proxy_pass http://0.0.0.0:2000;                                 
   proxy_set_header X-Real-IP $remote_addr;                       
   proxy_read_timeout 150;                                         
   proxy_set_header Host $host:$server_port;                       
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
   proxy_http_version 1.1;                                         
   proxy_set_header Upgrade $http_upgrade;                         
   proxy_set_header Connection "upgrade";                         
 }                                                                 
                                                                   
}                                                                   
server {
 listen 80 proxy_protocol;
 server_name hoge.hoge.jp;
 proxy_request_buffering off;
 set_real_ip_from XX.XX.0.0/XX; # VPC CIDR
 real_ip_header  proxy_protocol;
 location /demo/ { # デモページ(html)
   proxy_pass http://demo.localhost/;
 }
 location / { # socket.io用のjsファイルを読み込むのに使用します。
   proxy_pass http://0.0.0.0:1000;
 }
 location /socket.io/ { # websocket通信
   proxy_pass http://0.0.0.0:2000;
   proxy_set_header X-Real-IP $proxy_protocol_addr;
   proxy_read_timeout 150;
   proxy_set_header Host $host:$server_port;
   proxy_set_header X-Forwarded-For $proxy_protocol_addr;
   proxy_set_header X-Forwarded-Proto http;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
 }
}                                                               
```
***
**□ 進捗**
**AWSのELBにProxyProtocolを有効にするような設定が必要?**
> 参考
[AWS wiki](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html)
[How to configure AWS ELB and Nginx for WebSocket protocol? [closed]](http://stackoverflow.com/questions/33433768/how-to-configure-aws-elb-and-nginx-for-websocket-protocol)
[Using Proxy Protocol With Nginx](https://chrislea.com/2014/03/20/using-proxy-protocol-nginx/)
**>ProxyProtocolを有効にしました。(追記:2016/02/10 16:28)**
恐らくあと少しで解決しそうです・・・!
TaichiYanagiyaさんの案①を参考に設定すると、nginxのログにはアクセス元IPが出てきました!
```
'$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
```
```
- - [10/Feb/2016:16:15:01 +0900] "PROXY TCP4 [アクセス元IP] XXX.XXX.XXX.XXX 5602 443" 400 172 "-" "-"
```
但し、BadRequestが出ています・・・
もう少し調べてみます・・・!
もう少し調べてみます・・・!
**>ProxyProtocolを有効にしました。(追記:2016/02/10 19:21)**
ひとまず、現状の設定ファイルの内容に更新しました。
ProxyProtocolを有効にしたことで、Bad Requestが発生しています。
AWSのProxyProtocol使用の前提条件に「プロキシサーバーとロードバランサーの両方で有効になっていること」とありました。
http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/
Nodeサーバー側でも何らかの処理が必要になるのでしょうか・・・?
その方面で検索すると[こちらの記事](http://blog.serverworks.co.jp/tech/2013/08/01/elb-proxy-protocol/)を発見しましたので、調べてみます。
  • nginx

    1035 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • AWS(Amazon Web Services)

    2537 questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Elastic Load Balancing

    36 questions

    Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

2 進捗追記

CyberMergina

CyberMergina score 275

2016/02/10 16:28  投稿

ELB配下のEC2でnginxのリバースプロキシを使っている環境のみアクセス元IPが取得できない
**ELB × nginx(リバースproxy) × Nodeサーバーの環境で、Nodeサーバー側のシステムにアクセス元IPアドレスを渡したい。**
 
**□ 状態(追記しました)**  
 
- リスナー設定  
 
```  
TCP(80) -> TCP(80)  
SSL(443) -> TCP(80)  
```  
**□ 今分かっていること**
- ELB × nginxの環境で、$remote_addrがELBのアドレスになる
- ELB側でアクセス元IPアドレスがヘッダーの「X-Forwarded-For」に渡されている
ということは把握しています。
リバースプロキシを使用しない場合は「X-Forwarded-For」からアクセス元IPアドレスはとれました。
ですが、nginxでリバースプロキシを使用する場合は「X-Forwarded-For」にもELBのアドレスが入ってます。
(これはnginx側でセットされたのでしょうか・・・)
**□ nginxの変数**
$remote_addr, $proxy_add_x_forwarded_for にはELBのアドレス
$http_x_forwarded_for は空
何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。
よろしくお願いします。
***
**/etc/nginx/nginx.conf**
```conf:nginx.conf
http {
   include        /etc/nginx/mime.types;
   default_type   application/octet-stream;
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log /var/log/nginx/access.log main;
   sendfile           on;
   tcp_nopush         on;
   tcp_nodelay        on;
   keepalive_timeout  65;
   types_hash_max_size 2048;
   include /etc/nginx/conf.d/*.conf;
   index  index.html index.htm;
   set_real_ip_from  10.0.0.0/8;
   real_ip_header    X-Forwarded-For;
}
```
**/etc/nginx/conf.d/default.conf**
```conf:default.conf
server {                                                           
 listen 80;                                                       
 server_name hoge.hoge.jp;                                       
 proxy_request_buffering off;                                     
                                                                   
 location /demo/ {                                                 
   proxy_pass http://demo.localhost/;                             
 }                                                                 
                                                                   
 location / {                                                     
   proxy_pass http://0.0.0.0:1000;                                 
 }                                                                 
                                                                   
 location /socket.io/ {                                           
   proxy_pass http://0.0.0.0:2000;                                 
   proxy_set_header X-Real-IP $remote_addr;                       
   proxy_read_timeout 150;                                         
   proxy_set_header Host $host:$server_port;                       
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
   proxy_http_version 1.1;                                         
   proxy_set_header Upgrade $http_upgrade;                         
   proxy_set_header Connection "upgrade";                         
 }                                                                 
                                                                   
}                                                                   
```
***
**□ 進捗**
**AWSのELBにProxyProtocolを有効にするような設定が必要?**
> 参考
[AWS wiki](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html)
[How to configure AWS ELB and Nginx for WebSocket protocol? [closed]](http://stackoverflow.com/questions/33433768/how-to-configure-aws-elb-and-nginx-for-websocket-protocol)
[Using Proxy Protocol With Nginx](https://chrislea.com/2014/03/20/using-proxy-protocol-nginx/)
全くアクセス元IPが取れないわけではないので、悩みどころです。
**>ProxyProtocolを有効にしました。(追記:2016/02/10 16:28)**
恐らくあと少しで解決しそうです・・・!
TaichiYanagiyaさんの案①を参考に設定すると、nginxのログにはアクセス元IPが出てきました!
```
'$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"';
```
```
- - [10/Feb/2016:16:15:01 +0900] "PROXY TCP4 [アクセス元IP] XXX.XXX.XXX.XXX 5602 443" 400 172 "-" "-"
```
但し、BadRequestが出ています・・・
もう少し調べてみます・・・!
  • nginx

    1035 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • AWS(Amazon Web Services)

    2537 questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Elastic Load Balancing

    36 questions

    Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

1 進捗を入力しました。

CyberMergina

CyberMergina score 275

2016/02/09 17:59  投稿

ELB配下のEC2でnginxのリバースプロキシを使っている環境のみアクセス元IPが取得できない
**ELB × nginx(リバースproxy) × Nodeサーバーの環境で、Nodeサーバー側のシステムにアクセス元IPアドレスを渡したい。**
**□ 今分かっていること**
- ELB × nginxの環境で、$remote_addrがELBのアドレスになる
- ELB側でアクセス元IPアドレスがヘッダーの「X-Forwarded-For」に渡されている
ということは把握しています。
リバースプロキシを使用しない場合は「X-Forwarded-For」からアクセス元IPアドレスはとれました。
ですが、nginxでリバースプロキシを使用する場合は「X-Forwarded-For」にもELBのアドレスが入ってます。
(これはnginx側でセットされたのでしょうか・・・)
**□ nginxの変数**
$remote_addr, $proxy_add_x_forwarded_for にはELBのアドレス
$http_x_forwarded_for は空
何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。
よろしくお願いします。
***
**/etc/nginx/nginx.conf**
```conf:nginx.conf
http {
   include        /etc/nginx/mime.types;
   default_type   application/octet-stream;
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log /var/log/nginx/access.log main;
   sendfile           on;
   tcp_nopush         on;
   tcp_nodelay        on;
   keepalive_timeout  65;
   types_hash_max_size 2048;
   include /etc/nginx/conf.d/*.conf;
   index  index.html index.htm;
   set_real_ip_from  10.0.0.0/8;
   real_ip_header    X-Forwarded-For;
}
```
**/etc/nginx/conf.d/default.conf**
```conf:default.conf
server {                                                           
 listen 80;                                                       
 server_name hoge.hoge.jp;                                       
 proxy_request_buffering off;                                     
                                                                   
 location /demo/ {                                                 
   proxy_pass http://demo.localhost/;                             
 }                                                                 
                                                                   
 location / {                                                     
   proxy_pass http://0.0.0.0:1000;                                 
 }                                                                 
                                                                   
 location /socket.io/ {                                           
   proxy_pass http://0.0.0.0:2000;                                 
   proxy_set_header X-Real-IP $remote_addr;                       
   proxy_read_timeout 150;                                         
   proxy_set_header Host $host:$server_port;                       
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
   proxy_http_version 1.1;                                         
   proxy_set_header Upgrade $http_upgrade;                         
   proxy_set_header Connection "upgrade";                         
 }                                                                 
                                                                   
}                                                                   
```
```
***
**□ 進捗**
**AWSのELBにProxyProtocolを有効にするような設定が必要?**
> 参考
[AWS wiki](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html)
[How to configure AWS ELB and Nginx for WebSocket protocol? [closed]](http://stackoverflow.com/questions/33433768/how-to-configure-aws-elb-and-nginx-for-websocket-protocol)
[Using Proxy Protocol With Nginx](https://chrislea.com/2014/03/20/using-proxy-protocol-nginx/)
全くアクセス元IPが取れないわけではないので、悩みどころです。
  • nginx

    1035 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • AWS(Amazon Web Services)

    2537 questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Elastic Load Balancing

    36 questions

    Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る