2011-08-21 15 views
10

Ho un'applicazione nodo su una macchina amazon di istanza-archivio dietro il bilanciamento del carico elastico (elb). Tuttavia, l'indirizzo IP remoto sembra essere sempre lo stesso. Ho usato questo codice per ottenere l'indirizzo IP del client nel nodo (via connect/esprimere):Indirizzo IP remoto con nodo-js dietro amazon ELB

req.socket.remoteAddress 

non ho ottenuto niente altro dalla documentazione nodo. Qualche suggerimento?

+0

Se stai usando ELB in modalità TCP, vedere http://stackoverflow.com/q/17981943/201952 – josh3736

risposta

6

Ecco una soluzione nel caso in cui si utilizza espresso:
Secondo il documentation, è possibile attivare trust proxy per l'istanza espresso e quindi req.ip sarà popolato con l'IP corretto indirizzo.

Abilitando il "proxy fiducia" impostazione via app.enable ('delega fiducia'), espresso avrà una conoscenza che è seduto dietro un proxy e che gli X-Forwarded- * campi di intestazione possono essere attendibile , che altrimenti potrebbe essere facilmente falsificato.

Abilitare questa impostazione ha diversi effetti delicati. Il primo di cui è che X-Forwarded-Proto può essere impostato dal proxy inverso per indicare all'app che è https o semplicemente http. Questo valore è riflesso da req.protocol.

La seconda modifica apportata è che i valori req.ip e req.ips saranno popolati con l'elenco di indirizzi X-Forwarded-For.

Ecco un esempio:

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

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

In realtà stavo usando questo negli ultimi anni, ma ho dimenticato questa domanda :) grazie per averlo riportato di nuovo! –

+2

express 4 hanno cambiato il modo in cui viene gestita l'opzione ['trust trust'] (http://expressjs.com/api.html#trust.proxy.options.table), quindi puoi usare qualcosa come' app.set ('trust proxy', 1) 'fidarsi solo del proprio bilanciatore di carico –

+0

A proposito di Amazon, penso che il valore deve essere' 2', uno per il nginx sulla macchina effettiva, e un altro è il carico effettivo bilanciatore. –

6

È possibile ricevere l'IP dell'istanza ELB e sarà necessario ottenere il valore x-forwarded-for dalle intestazioni. Dal momento che io non sono un guru node.js, ho trovato questo codice in http://forum.webfaction.com/viewtopic.php?id=4500

Esempio:

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

fresco grazie, appena provato e funziona . Non sapevo di quell'intestazione. –

+6

Is is not an error if 'req.headers ['x-forwarded-for']' non esiste. 'ip_address' sarà semplicemente' indefinito'. 'ip_address = req.headers ['x-forwarded-for'] || req.connection.remoteAddress'; 'eseguirà il lavoro –

7

La risposta ha funzionato per me, grazie. Ma si può solo provare:

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

Non c'è 'req.connection.remoteAddress' - è stato rimosso in NodeJS? – Redsandro