通过对 Azure 负载平衡集进行实验,似乎没有使用 x-forwarded-for header (正如常规负载平衡器中所期望的那样),而是保留了原始客户端 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 请求,通常会在进程中缓存它,然后再使用更改后的 header 转发它。负载均衡器不必这样做(尽管可以)。他们只是重新路由数据包。一些更高级的负载均衡器支持添加此 header ,但它绝不是默认配置。代理通常默认启用此 header ,并支持删除它。
负载均衡器通常不需要此 header 的原因是负载均衡器基本上是一个路由器,因此它默认维护数据包的原始源 IP 信息。另一方面,代理充当原始请求的目的地,然后它向新目的地发出新请求,因此原始数据包信息通常会丢失。例如,如果您在邮件转发机构工作,并且您打开了人们的邮件,阅读了它,然后将其放入带有您的回邮地址的新信封中。
关于Azure 负载平衡集保留客户端 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586920/