web-dev-qa-db-ja.com

express.jsで「信頼プロキシ」は実際に何をしますか、それを使用する必要がありますか?

私はnginxサーバーの背後にあるエクスプレスアプリを書いています。私はエクスプレスのドキュメントを読んでいて、「信頼プロキシ」設定について言及していました。それは言うだけです

信頼プロキシリバースプロキシサポートを有効にします。デフォルトでは無効です

ここでNode with nginxでのセキュアセッションを説明する小さな記事を読みました。

http://blog.nikmartin.com/2013/07/secure-sessions-in-nodejs-with-nginx.html

だから私は興味があります。 「信頼プロキシ」をtrueに設定することは、HTTPSを使用する場合にのみ重要ですか?現在、私のアプリはクライアントとnginxの間のHTTPです。今trueに設定した場合、注意する必要がある副作用/影響はありますか?今それを真に設定する意味はありますか?

37
joeycozza

これについては、 プロキシガイドの背後にある表現 で詳しく説明されています。

App.enable( 'trust proxy')を介して「信頼プロキシ」設定を有効にすると、Expressはプロキシの背後にあること、およびX-Forwarded- *ヘッダーフィールドが信頼される可能性があることを認識します。

この設定を有効にすると、いくつかの微妙な効果があります。 1つ目は、X-Forwarded-Protoがリバースプロキシによって設定され、アプリにhttpsまたは単にhttpであることを通知することです。この値はreq.protocolに反映されます。

これが行う2番目の変更は、req.ipとreq.ipsの値に、X-Forwarded-Forのアドレスのリストが入力されることです。

38

信頼プロキシの使用を説明する注釈付きコード

    var express = require('express');

    var app = express();

    // Set the ip-address of your trusted reverse proxy server such as 
    // haproxy or Apache mod proxy or nginx configured as proxy or others.
    // The proxy server should insert the ip address of the remote client
    // through request header 'X-Forwarded-For' as
    // 'X-Forwarded-For: some.client.ip.address'
    // Insertion of the forward header is an option on most proxy software
    app.set('trust proxy', '127.0.0.1');


    app.get('/test', function(req, res){
      var ip = req.ip; // trust proxy sets ip to the remote client (not to the ip of the last reverse proxy server)
      if (ip.substr(0,7) == '::ffff:') { // fix for if you have both ipv4 and ipv6
        ip = ip.substr(7);
      }
      // req.ip and req.protocol are now set to ip and protocol of the client, not the ip and protocol of the reverse proxy server
      // req.headers['x-forwarded-for'] is not changed
      // req.headers['x-forwarded-for'] contains more than 1 forwarder when
      // there are more forwarders between the client and nodejs.
      // Forwarders can also be spoofed by the client, but 
      // app.set('trust proxy') selects the correct client ip from the list
      // if the nodejs server is called directly, bypassing the trusted proxies,
      // then 'trust proxy' ignores x-forwarded-for headers and
      // sets req.ip to the remote client ip address

      res.json({"ip": ip, "protocol": req.protocol, "headers": req.headers['x-forwarded-for']});
    });

// in this example the reverse proxy is expected to forward to port 3110
var port = 3110;
app.listen(port);
// test through proxy: http://yourproxyserver/test, req.ip should be your client ip
// test direct connection: http://yournodeserver:3110/test, req.ip should be your client ip even if you insert bogus x-forwarded-for request headers
console.log('Listening at http://localhost:' + port);
14
anneb