How to get the ip address in Node.js Express?

Viewed 3163

I am using this code to get the ip address in Node.js:

const ip = await (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || req.socket.remoteAddress;

For all the devices on my home wifi network and when I access my website using data on my phone, I get this ip address: ::ffff:127.0.0.1

I'm trying to get the ip address of each individual device (phone, laptop) that visits my site. But all of the devices show the same ip address.

How do I get the individual device ip address of each device in Node.js?

EDIT:

I made some updates and no longer get ::ffff:127.0.0.1. I now get the ip address of the internet connection. So if I'm connected to wifi, I get the wifi modem ip address. If I'm using data, I get the data connection ip address.

But I need to get the device ip address. I do NOT want the connection ip address. I want the device ip address.

Here are the changes I made:

I set 'trust proxy' to true:

app.set('trust proxy', true);

I updated the etc/nginx/sites-available/mysite file to look like this:

location / {
      proxy_set_header  X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:5050;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
  }

I updated the etc/nginx/proxy_params file to look like this:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

What did I do wrong? How do I fix this? From what I'm reading, it sounds like I should be able to use req.headers['x-forwarded-for'] to get the right ip address, but req.headers['x-forwarded-for'] returns the same thing as req.headers['x-real-ip'] except it is in an array.

4 Answers

I found another solution for my use case. Based on some people's comments, it looks like it may not be possible to find the private ip address of a device that connects to your website, only the public ip address.

@Cerceis os.networkInterfaces() answer may work. I did a quick test, but was unable to know for sure if it works. I don't have time to test it out more fully. If you are hoping to find an answer, I would try out os.networkInterfaces() in Node.js and that might get you the ip address you're looking for.

Finding the IP address is Node.js

One of the easiest methods of finding the IP address is to use the "ip" NPM module. It is super quick and easy (and it has worked for me in the past)

const ip = require('ip')
console.log(ip.address())

Learn more at: https://www.npmjs.com/package/ip

You can use the Native os module in Node.js. It provides all the operating system-related utility methods and properties.

var os = require('os');
var allNetworkInterfaces = os.networkInterfaces();
console.log(allNetworkInterfaces);

The call to os.networkInterfaces() will return an object containing network interfaces that have been assigned a network address. The output of the above code looks like this:

{
  lo: [
    {
      address: '127.0.0.1',
      netmask: '255.0.0.0',
      family: 'IPv4',
      mac: '00:00:00:00:00:00',
      internal: true,
      cidr: '127.0.0.1/8'
    },
    {
      address: '::1',
      netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
      family: 'IPv6',
      mac: '00:00:00:00:00:00',
      scopeid: 0,
      internal: true,
      cidr: '::1/128'
    }
  ],
  eth0: [
    {
      address: '192.168.1.108',
      netmask: '255.255.255.0',
      family: 'IPv4',
      mac: '01:02:03:0a:0b:0c',
      internal: false,
      cidr: '192.168.1.108/24'
    },
    {
      address: 'fe80::a00:27ff:fe4e:66a1',
      netmask: 'ffff:ffff:ffff:ffff::',
      family: 'IPv6',
      mac: '01:02:03:0a:0b:0c',
      scopeid: 1,
      internal: false,
      cidr: 'fe80::a00:27ff:fe4e:66a1/64'
    }
  ]
}
Related