Azure load-balanced 集保留客户端 IP

Azure load-balanced set preserves client IP

通过使用 Azure load-balancing 集进行试验,似乎未使用 x-forwarded-for header(正如在常规 load-balancer 中预期的那样),而是它们保留原始客户端IP。

例如:

app.get('/my-ip', function(req, res) {
    winston.log('/my-ip', 'x-forwarded', req.headers['x-forwarded-for'] || 'none', 'remoteAddress', req.connection.remoteAddress || 'none');
    res.end();
});

结果:

/my-ip x-forwarded none remoteAddress MY_CORRECT_IP

这种行为能否得到证实和依赖?

您将代理与负载平衡混淆了。代理使用 x-forwarded,负载均衡器不使用(默认情况下)。负载均衡器在 OSI 堆栈中的较低级别工作(尽管您可能会发现各种自称为负载均衡器的东西实际上不是)。

这里的主要区别在于,代理实际上会解释您的 HTTP 请求,通常会在处理过程中缓存它,然后再将其更改为 headers。负载均衡器不必(尽管可以)。他们只是 re-route 个数据包。一些更高级的负载平衡器支持添加此 header,但它绝不是默认配置。代理通常默认启用此 header,并支持删除它。

负载均衡器通常不需要此 header 的原因是负载均衡器基本上是一个路由器,因此它默认维护数据包的原始源 ip 信息。另一方面,代理充当原始请求的目的地,然后它向新目的地发出新请求,因此原始数据包信息通常会丢失。比如,如果你在邮件转发机构工作,你打开人们的邮件,阅读它,然后把它和你的 return 地址放在一个新信封里。