2011-08-21 35 views
10

Tôi có một ứng dụng nút trên máy amazon lưu trữ thể hiện phía sau bộ cân bằng tải đàn hồi (elb). Tuy nhiên, địa chỉ IP từ xa dường như luôn giống nhau. Tôi đã sử dụng mã này để nhận địa chỉ IP của khách hàng trong nút (qua kết nối/express):Địa chỉ IP từ xa với nút-js phía sau amazon ELB

req.socket.remoteAddress 

Tôi không nhận được gì khác từ tài liệu nút. Bất kỳ gợi ý nào?

+0

Nếu bạn đang sử dụng ELB trong chế độ TCP, xem http://stackoverflow.com/q/17981943/201952 – josh3736

Trả lời

6

Dưới đây là một giải pháp trong trường hợp bạn đang sử dụng nhanh:
Theo documentation, bạn có thể bật trust proxy ví dụ rõ ràng của bạn và sau đó req.ip sẽ được áp dụng với các ip đúng địa chỉ nhà.

Bằng cách cho phép các "tin tưởng proxy" thiết lập qua app.enable ('tin tưởng proxy'), Express sẽ có kiến ​​thức mà nó ngồi đằng sau một proxy và rằng X-Forwarded- * lĩnh vực tiêu đề có thể được tin cậy , nếu không có thể là dễ bị giả mạo.

Bật cài đặt này có một số hiệu ứng tinh tế. Đầu tiên trong số đó là X-Forwarded-Proto có thể được thiết lập bởi proxy ngược lại để nói cho ứng dụng rằng đó là https hoặc đơn giản là http. Giá trị này được phản ánh bởi req.protocol.

Thay đổi thứ hai là giá trị req.ip và req.ips sẽ là được điền bằng danh sách địa chỉ của X-Forwarded-For.

Dưới đây là một ví dụ:

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

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

Tôi đã thực sự sử dụng cái này trong vài năm qua, nhưng quên mất câu hỏi này :) cảm ơn vì đã đưa nó lên một lần nữa! –

+2

express 4 đã thay đổi cách thức ['trust proxy'] (http://expressjs.com/api.html#trust.proxy.options.table) tùy chọn được xử lý, vì vậy bạn có thể sử dụng một cái gì đó như' app.set ('tin cậy proxy', 1) 'để chỉ tin cậy cân bằng tải của bạn –

+0

Nhân tiện, trong trường hợp Amazon tôi nghĩ rằng giá trị phải là' 2', một cho nginx trên máy thực tế, và một là tải thực tế cân bằng. –

6

Bạn nhận IP của cá thể ELB và bạn sẽ cần nhận được giá trị chuyển tiếp x từ các tiêu đề. Vì tôi không phải là một guru Node.js, tôi thấy mã này ở http://forum.webfaction.com/viewtopic.php?id=4500

Ví dụ:

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

mát nhờ, chỉ cần thử nó và nó hoạt động . Tôi không biết về tiêu đề đó. –

+6

Không phải là lỗi nếu 'req.headers ['x-forwarded-for']' không tồn tại. 'ip_address' sẽ chỉ là' undefined'. 'ip_address = req.headers ['x-chuyển tiếp-cho'] || req.connection.remoteAddress'; 'sẽ thực hiện công việc –

7

Câu trả lời làm việc cho tôi, cảm ơn. Nhưng bạn chỉ có thể thử:

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

Không có 'req.connection.remoteAddress' - nó đã bị xóa trong NodeJS chưa? – Redsandro

Các vấn đề liên quan