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, proxy2e, em seguidaproxy3 .proxy3aparece 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-fornão está definido:
var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
req.ipfonte - expressjs.com/en/api.html#req.ip