2011-08-21 10 views
10

Mam aplikację węzła na maszynie amazonowej instancji sklepu za elastycznym load balancerem (elb). Jednak zdalny adres IP wydaje się być zawsze taki sam. Użyłem tego kodu, aby uzyskać adres IP klienta w węźle (przez connect/express):Zdalny adres IP z węzłem js za Amazonem ELB

req.socket.remoteAddress 

nie miałem nic innego z dokumentacją węzła. Jakaś wskazówka?

+0

Jeśli używasz ELB w trybie TCP, zobacz http://stackoverflow.com/q/17981943/201952 – josh3736

Odpowiedz

6

Oto rozwiązanie w przypadku korzystania wyraźnej:
Według documentation można włączyć trust proxy do wyraźnej instancji, a następnie req.ip zostanie wypełniona prawidłowym ip adres.

Poprzez umożliwienie "Trust" ustawienia proxy za pośrednictwem pełnomocnika app.enable ('Trust'), Express posiada wiedzę, że siedzi za serwerem proxy, a X-Forwarded- * pola nagłówka może być zaufany , które w przeciwnym razie mogą być łatwo podrobione.

Włączenie tego ustawienia ma kilka subtelnych efektów. Pierwszy z nich to , że X-Forwarded-Proto może być ustawiony przez odwrotne proxy, aby powiedzieć aplikacji , że jest https lub po prostu http. Ta wartość jest odzwierciedlana przez req.protocol.

Druga zmiana polega na tym, że wartości wpisu i req.ips będą następujące: wypełniona listą adresów X-Forwarded-For.

Oto przykład:

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

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

Używałem tego w ciągu ostatnich kilku lat, ale zapomniałem o tym pytaniu :) dziękuję za ponowne wprowadzenie! –

+2

express 4 zmieniło sposób, w jaki jest obsługiwana opcja ['zaufane proxy'] (http://expressjs.com/api.html#trust.proxy.options.table), więc możesz użyć czegoś takiego jak' app.set ('Trust Proxy', 1) 'tylko zaufaj swojemu równoważnikowi obciążenia –

+0

Nawiasem mówiąc, w przypadku Amazon myślę, że wartość musi wynosić' 2', jedna dla nginx na rzeczywistej maszynie, a druga to rzeczywista ładowność stabilizator. –

6

Twoje otrzymanie adresu IP instancji ELB i musisz uzyskać wartość X-forwarded-for z nagłówków. Ponieważ nie jestem node.js guru, znalazłem ten kod na http://forum.webfaction.com/viewtopic.php?id=4500

Przykład:

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

super dzięki, właśnie próbowałem i to działa . Nie wiedziałem o tym nagłówku. –

+6

Nie jest błędem, jeśli 'req.headers ['x-forwarded-for']' nie istnieje. "ip_address" będzie po prostu "niezdefiniowane". 'ip_address = req.headers ['x-forwarded-for'] || req.connection.remoteAddress'; 'wykona zadanie –

7

Odpowiedź pracował dla mnie, dzięki. Ale może po prostu spróbuj:

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

Brak 'req.connection.remoteAddress' - usunięto go w NodeJS? – Redsandro