NodeJS - возвращает IP-адрес клиента вместо сервера - PullRequest
0 голосов
/ 08 сентября 2018

Информация о проблеме

Я использую cors, чтобы убедиться, что только определенные IP-адреса могут GET и POST данные в моем REST API.

Возвращаемый IP-адрес, каждый раз, когда кто-то хочет GET или POST данные, - это IP-адрес сервера, на котором размещено приложение, а не его собственный IP-адрес.

В настоящий момент каждый может получить доступ к REST API, поскольку мой интерфейс работает на том же сервере, интерфейс должен иметь разрешение на данные GET и POST, поэтому я внес белый список в IP-адрес сервера.

Поскольку каждый, кто пытается подключиться, его IP-адрес автоматически становится адресом сервера, каждый имеет доступ к REST API.

Техническая информация

Мой REST API работает с использованием pm2 на порту 8080, я перенаправил его с помощью Nginx на порт 8877, использующий SSL. 8877 - это конечная точка моего остальных 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;
    }
}

Cors API отдыха

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-адрес клиента вместо его сервера.

1 Ответ

0 голосов
/ 08 сентября 2018

Попробуйте поместить эти конфигурации в свой 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;

Без этого ваш бэкэнд будет получать только IP-адрес nginx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...