node.js - NodeJS - 返回客户端 ip 地址而不是服务器的

标签 node.js ssl nginx

问题信息

我正在使用 cors 来确保只有特定 IP 才能在我的 REST API 上GETPOST 数据。

每次有人想要GETPOST 数据时,返回的IP 是托管应用程序的服务器的IP,而不是该人自己的IP地址。

此时所有人都可以访问REST API,因为我的前端运行在同一台服务器上,前端需要有GETPOST的权限> 数据,所以我将服务器的 IP 地址列入白名单。

因为每个尝试连接的人,其 IP 地址自动成为服务器的地址,每个人都可以访问 REST API。

技术资料

我的 REST API 使用 pm2 在端口 8080 上运行,我使用 Nginx 将其重新路由到使用 SSL 的端口 8877。 8877 是我的 rest api 的端点,也许这就是为什么客户端 ip 地址自动成为服务器 ip 地址的原因?

# General HTTP to HTTPS
server {
        listen 80;
        listen [::]:80;
        server_name www.example.com default_server;

        location / {
                return 302 https://$host$request_uri;
        }
}

#Web Application
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com default_server;

    root /var/www/example.com;
    index index.html;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    location / {
                #...
                try_files $uri $uri/ /index.html$is_args$args;
                #...
    }
}

#Rest API http to https 
server {
    listen 8877 ssl;
    listen [::]:8877 ssl;
    server_name example.com;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    location / {
            proxy_pass http://example.com:8080;
    }
}

Rest API cors

const whitelist = [
    '::ffff:111.11.11.111', etc.];

var corsOptions = {
    origin: (origin, callback) => {
        let trafficAllowed = {};
        console.log("IP: ", origin);
        if (whitelist.indexOf(origin) !== -1) {
            trafficAllowed = {origin: false}
        } else {
            trafficAllowed = {origin: true}
        }
        callback(null, trafficAllowed)
    }
};

app.use((req, res, next) => {
    req.headers.origin =
        req.connection.remoteAddress ||
        req.headers['x-forwarded-for'] ||
        req.socket.remoteAddress ||
        (req.connection.socket ? req.connection.socket.remoteAddress : null);
    next();
});

app.use(cors(corsOptions));

可能的解决方法

  • 是否可以将 SSL 直接分配给 8080 端口(REST API 使用 pm2)?
  • 如何获取客户端的 ip 地址而不是服务器的 ip 地址。

最佳答案

尝试将这些配置放入您的 nginx 中:

proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

没有这个,你的后端将只接收 nginx IP 地址。

关于node.js - NodeJS - 返回客户端 ip 地址而不是服务器的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52232998/

相关文章:

javascript - BuzzFeed 如何进行移动重定向?

Node.js 创建简单模块并返回错误

node.js - greenlock-express : TypeError: greenlock. app 不是函数

node.js - 使用 Forever 运行的 NodeJS 应用程序在浏览器中出现 502 错误

mysql - 如何在相关表中添加子行? (Sequelzie N :M Relationship)

c - 如何添加证书文件以在没有文件系统的操作系统上设置 libcurl HTTPS 连接?

c++ - 如何在Qt上使用TLS协议(protocol)?

html - 样式表在 nginx 虚拟机中不起作用

amazon-web-services - Ubuntu 在免费 AWS 层上运行 LAMP 和 Certbot 时出现 SSL 超时问题

mongodb - 以可扩展的方式存储用户提交的文件(图像、pdf)?