如何使用PROXY协议获取客户端的真实IP地址?

AWS刚刚为PROXY协议 添加了对ELB的支持, PROXY协议封装了TCPstream,并添加了客户端IP地址(如代理所示),以便后端服务器可以访问客户端的IP(因为否则它只会看到ELB的IP) 。

我知道ELB可以在HTTP(S)模式下运行,ELB插入一个X-Forwarded-For头,但是我在TCP模式下运行我的ELB,这样我就可以通过SPDY服务我的站点了。

我如何修改我的node.js应用程序(使用Express)使用PROXY协议?

我做了一个模块caled proxywrap ,它包装了node.js Server并自动从连接stream中剥离PROXY协议头,并将socket.remoteAddresssocket.remotePort重置为PROXY头中的值。

它可以与内置的Server模块(如httphttpsnet )配合使用,作为模块的直接替代品:

 var http = require('http') , proxiedHttp = require('proxywrap').proxy(http) , express = require('express') , app = express() , srv = proxiedHttp.createServer(app); // instead of http.createServer(app) app.get('/', function(req, res) { res.send('IP = ' + req.connection.remoteAddress + ':' + req.connection.remotePort); }); srv.listen(80); 

它也适用于spdy模块 :

 var proxiedSpdy = require('proxywrap').proxy(require('spdy').server); 

当然,您必须在您的ELB上启用PROXY协议 (或者您的应用程序所在的任何代理)。