【问题标题】:NodeJS - Return client ip address instead of server'sNodeJS - 返回客户端 IP 地址而不是服务器的
【发布时间】:2018-09-08 07:22:38
【问题描述】:

问题信息

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

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

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

由于每个人都在尝试连接,它的 ip 地址自动成为服务器的地址,每个人都可以访问 REST API。

技术信息

我的 REST API 在端口 8080 上使用 pm2 运行,我使用 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地址。

【问题讨论】:

    标签: node.js ssl nginx


    【解决方案1】:

    尝试将这些配置放入您的 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 地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-29
      • 2012-12-27
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多