Cómo conseguir las direcciones IP "real" de todos los clientes conectados al servidor websocket

Así que tengo un nodejs servidor web socket sentado detrás de un proxy inverso nginx. Mi configuración nginx se ve así:

server {
    listen 80;
    location / {
        proxy_pass ​http://localhost:9898;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Mi código de aplicación del servidor de socket web contiene lógica que almacena la dirección IP del cliente en una tabla para recuperar más adelante. No tengo ningún problema para recuperar la dirección IP del cliente cuando se conectan porque simplemente puedo hacer algo así req.headers["x-forwarded-for"] desde que tengo acceso a req objeto en cada nueva conexión. Mi problema es recuperar esa "dirección IP prohibida" cuando quiero enviar un servidor transmitido sólo a un subconjunto de ciertos clientes. Porque cuando lo haga ws._socket.remoteAddress (donde) ws es el objeto de toma web), espero obtener la dirección IP: 127.0.0.1.

Supongo que esta es una pregunta sobre el paquete específico de npm que estoy usando para albergar un servidor web socket: https://www.npmjs.com/package/ws.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por codecatalyst


3 Respuestas:

  • Su pregunta es contestada la página NPM que viniste:

    Cuando el servidor corre detrás de un proxy como NGINX, el estándar de-facto es utilizar el X-Forwarded-For Cabeza.

    wss.on('connection', function connection(ws, req) {
      const ip = req.headers['x-forwarded-for'].split(/\s*,\s*/)[0];
    });
    

    Podrías guardarlo. ip sobre ws objeto (y de hecho, usted puede tal vez Sobreescribir ws._socket.remoteAddress con eso ip también) en ese momento.

    Respondida el Dec 18, 2020 a las 09:04 - por pixelprodigy50bb

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a cómo Node.js maneja las conexiones a través de proxies. Cuando un cliente se conecta al servidor WebSocket a través de un proxy, la dirección IP real del cliente se almacena en la cabecera X-Forwarded-For en lugar de estar disponible directamente a través de ws._socket.remoteAddress.

    Para poder obtener la dirección IP real de los clientes conectados al servidor WebSocket a través de un proxy, puedes seguir estos pasos:

    • Habilitar la opción `trustProxy` en la configuración del servidor WebSocket para que pueda confiar en los encabezados de proxy. Por ejemplo:
    javascript
    const WebSocket = require('ws');
    const server = new WebSocket.Server({ port: 9898, clientTracking: true });
    server.set('trustProxy', true);
    
    • Usar la propiedad `req.connection.remoteAddress` o `req.headers['x-forwarded-for']` para obtener la dirección IP real del cliente cuando se conecta al servidor WebSocket. Por ejemplo:
    javascript
    server.on('connection', function connection(ws, req) {
        const clientIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
        console.log('Cliente conectado con la dirección IP:', clientIp);
    });
    

    Al seguir estos pasos, deberías poder recuperar la dirección IP real de los clientes conectados al servidor WebSocket a través de un proxy inverso. Recuerda que es importante confiar en la información proporcionada por el proxy y asegurarse de que esté configurado correctamente para que los encabezados sean enviados de manera adecuada.

    Respondida el Dec 19, 2020 a las 09:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener la IP "real" de los clientes conectados a un servidor WebSocket detrás de un proxy inverso, puedes utilizar el encabezado X-Forwarded-For. Este encabezado contiene la dirección IP del cliente original antes de que se enrutara a través del proxy.

    En tu código de servidor WebSocket, puedes acceder al encabezado X-Forwarded-For de la siguiente manera:

    javascript
    const ip = req.headers['x-forwarded-for'];
    

    Sin embargo, debes tener en cuenta que el encabezado X-Forwarded-For puede ser falsificado por el cliente. Por lo tanto, es importante validar la dirección IP antes de utilizarla.

    Además, el encabezado X-Forwarded-For puede contener varias direcciones IP si el cliente ha pasado por varios proxies. En este caso, debes utilizar la primera dirección IP, que es la dirección IP del cliente original.

    A continuación te muestro un ejemplo de cómo puedes obtener la IP "real" de un cliente conectado a un servidor WebSocket detrás de un proxy inverso:

    ```javascript const ip = req.headers['x-forwarded-for'];

    if (ip) { // Obtener la primera dirección IP const realIp = ip.split(',')[0];

    // Validar la dirección IP if (isValidIp(realIp)) { // Usar la dirección IP "real" console.log(IP del cliente: ${realIp}); } else { // La dirección IP no es válida console.log('Dirección IP no válida'); } } else { // No se encontró el encabezado X-Forwarded-For console.log('No se encontró el encabezado X-Forwarded-For'); } ```

    Ten en cuenta que este ejemplo asume que estás utilizando el paquete ws para Node.js. Si estás utilizando una biblioteca diferente, los detalles de implementación pueden variar.

    Respondida el Dec 19, 2020 a las 09:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0