“信任代理”实际上在 express.js 中做了啥,我需要使用它吗?

Posted

技术标签:

【中文标题】“信任代理”实际上在 express.js 中做了啥,我需要使用它吗?【英文标题】:What does "trust proxy" actually do in express.js, and do I need to use it?“信任代理”实际上在 express.js 中做了什么,我需要使用它吗? 【发布时间】:2014-06-18 06:25:53 【问题描述】:

我正在编写一个位于 nginx 服务器后面的快速应用程序。我正在阅读 express 的文档,其中提到了“信任代理”设置。它只是说

trust proxy 启用反向代理支持,默认禁用

我在这里阅读了一篇小文章,它解释了使用 nginx 在 Node 中的安全会话。

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

所以我很好奇。仅在使用 HTTPS 时才将“信任代理”设置为 true 吗?目前我的应用程序只是客户端和 nginx 之间的 HTTP。如果我现在将其设置为 true,是否需要注意任何副作用/影响?现在将其设置为 true 有什么意义吗?

【问题讨论】:

我必须设置它才能让我的 cookie 在 heroku 上运行,但不明白为什么 【参考方案1】:

这在express behind the proxies guide中有详细解释

通过 app.enable('trust proxy') 启用“信任代理”设置,Express 将知道它位于代理后面,并且 X-Forwarded-* 标头字段可能是可信的,否则可能是很容易被欺骗。

启用此设置会产生一些微妙的影响。第一个是 X-Forwarded-Proto 可能由反向代理设置,告诉应用它是 https 或简单的 http。此值由 req.protocol 反映。

第二个更改是 req.ip 和 req.ips 值将填充 X-Forwarded-For 的地址列表。

【讨论】:

是的,但这实际上并不能解释任何事情,当您将其设置为 true 时,如果您将其设置为 1 跳,您如何知道 nginx 服务器距离多少跳,如果您将其设置为ip地址,我们设置谁的ip,如何找到这个ip,如果设置了多个ip,这些ip地址是什么,不解释的时候复制粘贴文档就容易多了,什么时候设置为127.0。 0.1,这在 ec2 上是否有效,您是否应该将其设置为实时 ec2 服务器上的环回地址 有人可以回答@PirateApp 的问题吗?我很想知道从子网提供服务时该怎么做。【参考方案2】:

解释使用信任代理的注释代码

    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);

【讨论】:

【参考方案3】:

TLDR :应用程序设置信任代理仅用于在快速应用程序位于代理之后时使用。在有代理时启用此功能有助于通过众所周知的标头(主要是 X-Forwarded-For、X-Forwarded-Proto)解析以下属性

req.ips req.hostname req.protocol

更多详情

在搜索 trust proxyexpress-session 的真正作用时,我最终来到了这里。没有一个答案对我有帮助。

默认值 - false(禁用)

IMO 最好的文档位于 Application Settings

信任代理

表示应用程序位于前置代理之后,并且要使用 X-Forwarded-* 标头确定连接和 IP 地址 的客户。注意:X-Forwarded-* 标头很容易被欺骗,并且 检测到的 IP 地址不可靠。

启用后,Express 会尝试确定 通过前端代理或一系列代理连接的客户端。 req.ips 属性,然后包含一个 IP 地址数组 客户端通过连接。要启用它,请使用中描述的值 信任代理选项表。

trust proxy 设置是使用 proxy-addr 包实现的。 有关详细信息,请参阅其文档。

注意:子应用将继承此设置的值,即使它 有一个默认值。

p.s - 如果您想了解这对快速会话有何帮助,则需要启用信任代理才能获得 req.secure

的正确值

【讨论】:

以上是关于“信任代理”实际上在 express.js 中做了啥,我需要使用它吗?的主要内容,如果未能解决你的问题,请参考以下文章

apply_filters(...) 实际上在 WordPress 中做了啥?

自动恢复在 Apache Pulsar 中做了啥?

StandardFilter在Lucene5.3.1中做了什么?

会话如何在 Express.js 和 Node.js 中工作?

没有 express.js 的 Socket.io 会话?

BuildContext 在 Flutter 中做了啥?