var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
(req.connection.socket ? req.connection.socket.remoteAddress : null);
Observe que às vezes você pode obter mais de um endereço IP req.headers['x-forwarded-for']
. Além disso, umx-forwarded-for
nem sempre cabeçalho será definido, o que pode gerar um erro.
O formato geral do campo é:
x encaminhado para: client, proxy1, proxy2, proxy3
em que o valor é uma lista de endereços IP separados por vírgula + espaço, sendo o mais à esquerda o cliente original e cada proxy sucessivo que passou na solicitação, adicionando o endereço IP de onde recebeu a solicitação. Neste exemplo, o pedido passado através de proxy1
, proxy2
e, em seguidaproxy3
.proxy3
aparece como endereço remoto da solicitação.
Esta é a solução sugerida por Arnav Gupta com uma correção que Martin sugeriu abaixo nos comentários para casos em que x-forwarded-for
não está definido:
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
req.ip
fonte - expressjs.com/en/api.html#req.ip