2011-08-21 75 views
10

我有一個節點應用程序在一個實例存儲亞馬遜機器後面的彈性負載平衡器(ELB)。但是,遠程IP地址似乎總是相同的。我用這個代碼來獲得在節點中的客戶端的IP地址(通過連接/快遞):遠程IP地址與節點-js背後亞馬遜ELB

req.socket.remoteAddress 

我沒有得到任何東西從節點文檔。任何提示?

+0

如果您是在TCP模式下使用ELB,看到http://stackoverflow.com/q/17981943/201952 – josh3736

回答

6

這裏有一個解決方案如果你正在使用快遞
按照documentation,您可以啓用trust proxy爲您的Express實例,然後req.ip將與正確的IP來填充地址。

通過啓用「信任代理」通過app.enable(「信任代理」)的設置, Express將有知識,它的坐在後面的代理和 的X Forwarded- *頭字段可以被信任,否則可能是 容易被欺騙。

啓用此設置有幾個微妙的影響。其中第一個 是由反向代理設置X-Forwarded-Proto,以告知 應用程序它是https還是簡單的http。該值由 req.protocol反映。

第二個變化是req.ip和req.ips值將是 填充X-Forwarded-For的地址列表。

下面是一個例子:

var app = express(); 
app.enable('trust proxy'); 
// ... 

app.use(function(req, res, next) { 
    console.log('client ip address:', req.ip); 
    return next(); 
}); 
+0

我在過去的幾年裏實際上使用了這個,但忘記了這個問題:)再次感謝它! –

+2

express 4已經改變了['trust proxy'](http://expressjs.com/api.html#trust.proxy.options.table)選項的處理方式,所以你可以使用'app.set( '信任代理',1)'只信任你的負載平衡器 –

+0

順便說一句,在亞馬遜的情況下,我認爲這個值必須是'2',一個用於實際機器上的nginx,另一個是實際負載平衡器。 –

6

您收到ELB實例的IP,您需要從頭文件獲取x-forwarded-for的值。因爲我不是一個node.js的大師,我發現這個代碼在http://forum.webfaction.com/viewtopic.php?id=4500

例子:

var http = require('http'), 
sys = require('sys'); 

http.createServer(
     function(req, res) { 
         var ip_address = null; 
         try { 
           ip_address = req.headers['x-forwarded-for']; 
         } 
         catch (error) { 
           ip_address = req.connection.remoteAddress; 
         } 
         sys.puts(ip_address); 
     } 
); 
+0

酷感謝,只是嘗試它和它的作品。我不知道那個標題。 –

+6

如果'req.headers ['x-forwarded-for']'不存在,是不是錯誤。 'ip_address'將會是'undefined'。 'ip_address = req.headers ['x-forwarded-for'] || req.connection.remoteAddress';'將完成這項工作 –

7

答案爲我工作,謝謝。但是你可能只是嘗試:

var ip_address = null; 
if(req.headers['x-forwarded-for']){ 
    ip_address = req.headers['x-forwarded-for']; 
} 
else { 
    ip_address = req.connection.remoteAddress; 
} 
sys.puts(ip_address); 
+2

var ip = req.headers ['x-forwarded-for'] || req.connection.remoteAddress; – bithavoc

+0

沒有'req.connection.remoteAddress' - 是否在NodeJS中被刪除? – Redsandro