skip to Main Content

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


  1. Chosen as BEST ANSWER

    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.


  2. What you could be looking for is Local Area Network Ip address:
    You could use default function by Node.js os.networkInterfaces()

    You could find the documentation here:
    https://nodejs.org/api/os.html#os_os_networkinterfaces

    You could also look into this thread:
    Get local IP address in Node.js

    Login or Signup to reply.
  3. 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

    Login or Signup to reply.
  4. 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'
        }
      ]
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search