Nodejs如何获取用户真实ip地址

Nodejs如何获取用户真实ip地址

var net = require(‘net’), server = net.createServer(function© { //此处创建一个tcp服务器,如何通过参数c来获取用户的真实ip地址 //通过c.remoteAddress每次都是127.0.0.1 }); ps:我使用了cluster,用了ngnix做了代理,求高人指点。

4 回复

Node.js 如何获取用户真实 IP 地址

在使用 Node.js 构建网络应用时,有时需要获取客户端的真实 IP 地址。这在处理 HTTP 请求时尤其有用,但在使用 TCP 服务器的情况下,情况可能会有所不同。下面将介绍如何正确地获取客户端的真实 IP 地址,尤其是在使用 Nginx 作为反向代理的情况下。

示例代码

首先,我们来看一下如何在 HTTP 服务器中获取真实的客户端 IP 地址。假设你正在使用 Express 框架:

const express = require('express');
const app = express();

app.use((req, res, next) => {
    // 获取客户端的真实 IP 地址
    let ip = req.headers['x-forwarded-for'] || 
             req.connection.remoteAddress || 
             req.socket.remoteAddress ||
             req.connection.socket.remoteAddress;

    console.log(`Client IP: ${ip}`);
    next();
});

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中,我们使用了 req.headers['x-forwarded-for'] 来获取客户端的真实 IP 地址。当使用 Nginx 或其他反向代理时,它们会将客户端的真实 IP 地址添加到请求头的 x-forwarded-for 字段中。

使用 TCP 服务器

如果你是在使用 TCP 服务器而不是 HTTP 服务器,那么情况会稍微复杂一些。在这种情况下,你无法直接从连接对象中获取客户端的真实 IP 地址。你需要通过反向代理(如 Nginx)传递这个信息。

假设你有一个简单的 TCP 服务器,并且希望通过 Nginx 将客户端的真实 IP 地址传递给它:

const net = require('net');

const server = net.createServer((socket) => {
    // 获取客户端的真实 IP 地址
    const clientIp = socket.remoteAddress;
    
    // 如果使用了 Nginx 反向代理,可以尝试从 headers 中获取
    if (socket.headers && socket.headers['x-real-ip']) {
        clientIp = socket.headers['x-real-ip'];
    }

    console.log(`Client IP: ${clientIp}`);
});

server.listen(8080, () => {
    console.log('TCP server is listening on port 8080');
});

为了使上述代码正常工作,你需要确保 Nginx 配置正确地传递了客户端的真实 IP 地址。例如,在 Nginx 配置文件中,你可以这样设置:

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost:8080;
}

这样,Nginx 会将客户端的真实 IP 地址设置为 X-Real-IP 头,并将其传递给你的 TCP 服务器。

总结

通过以上方法,你可以在 Node.js 应用中正确获取客户端的真实 IP 地址,无论是 HTTP 还是 TCP 服务器。关键是理解如何处理反向代理传递的信息,并根据实际需求调整服务器配置。


nginx里配置 proxy_set_header X-Real-IP $remote_addr;

node 里通过取HEADER “X-Real-IP” 获取真实IP

如果多层代理 nginx里配置 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

获取用户的真实IP地址通常需要通过HTTP请求来完成。如果你是在处理HTTP请求的情况下,可以使用req.headers['x-forwarded-for']来获取客户端的真实IP地址。这是因为当你使用Nginx作为反向代理时,Nginx会将客户端的真实IP地址添加到X-Forwarded-For头部中。

以下是一个使用Express框架的示例代码:

const express = require('express');
const app = express();

app.use((req, res, next) => {
    let ip = req.headers['x-forwarded-for'] || 
             req.connection.remoteAddress ||
             req.socket.remoteAddress ||
             req.connection.socket.remoteAddress;

    console.log("User IP: ", ip);
    next();
});

app.get('/', (req, res) => {
    res.send("Hello World");
});

app.listen(3000, () => {
    console.log("Server is running on port 3000");
});

这段代码首先定义了一个中间件,该中间件从HTTP请求头中提取出客户端的真实IP地址。它首先尝试从X-Forwarded-For头部获取IP地址(如果存在)。如果不存在,则从req.connection.remoteAddressreq.socket.remoteAddress获取IP地址。最后调用next()函数,以确保后续的中间件和路由处理器能够继续执行。

但是,如果你是在处理TCP连接而不是HTTP请求的情况下,你需要自己解析TCP流中的数据以获取客户端IP地址。这通常比HTTP请求复杂得多,因为TCP协议本身不包含这样的信息。在这种情况下,你需要依赖于底层网络基础设施(例如Nginx)来传递这些信息。

由于你的问题是关于TCP服务器,而你提到的是Nginx作为代理,那么上述HTTP示例可能更适用于你的场景。

回到顶部