Nginx descarta el primer cliente tan pronto como se conecta el segundo

Nginx descarta el primer cliente tan pronto como se conecta el segundo

Estoy intentando configurar Nginx para revertir el puerto de proxy 445, pero cada vez que el cliente A se conecta al recurso compartido a través de Nginx y un cliente B se conecta, Nginx cancela la conexión del cliente A a pesar de que estaba usando activamente el recurso compartido (descargando un archivo grande, por ejemplo). Es como si Nginx estuviera reutilizando la conexión para el cliente B antes de que el cliente A termine de usarla.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {

    server {
         listen 445;
         proxy_pass storage:445;
    }
}

¿Qué falta en el archivo de configuración anterior para permitir que tanto el cliente A como el B utilicen el recurso compartido simultáneamente sin perder una conexión para establecer la otra?

Algún contexto adicional:
Nginx v. 1.17.1 ejecutándose en Ubuntu 18.04.2 Máquina virtual LTS 4 vCPU y memoria de 4 Gb;

Ya intenté hacer este control usando iptables en lugar de Nginx para reenviar las conexiones en el puerto 445 al servidor compartido y el resultado fue similar: la conexión del cliente A se interrumpe cuando B se conecta;

El recurso compartido funciona bien si los clientes A y B se conectan directamente al recurso compartido de almacenamiento sin Nginx entre ellos;

He probado muchas configuraciones recomendadas de la documentación de Nginx (limit_conn, so_keepalive, reuseport....), pero es posible que las haya usado mal;

Desde Wireshark veo que Nginx envía un paquete [FIN, ACK] al cliente A cuando el cliente B se conecta;

Registro de Nginx cuando el cliente A tiene su conexión afectada: *[error] 32110#32110:7 recv() falló (104: Conexión restablecida por parte del par) mientras se realizaba proxy y se leía desde aguas arriba... pero noto que este registro está relacionado con un paquete [RST, ACK] que el cliente A envía a Nginx incluso después del paquete [FIN, ACK] que recibió.

Editar:
Probé con la versión más reciente 1.17.3 y no tuve éxito.

Respuesta1

Creo que SMB Server te desconectará porque, por su parte, la misma máquina intenta conectarse utilizando diferentes usuarios. Esto es lo mismo usando enmascaramiento con iptables y Nginx.

Continuaría usando iptables, pero sin enmascarar el tráfico a su servidor SMB, solo permitiendo el reenvío.

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 445 -j DNAT --to-destination storage:445
iptables -t filter -A FORWARD -d storage/32 -p tcp -m tcp --dport 445 -j ACCEPT

Haga que el tráfico desde su servidor SMB a las redes en las que residen los clientes se enrute a través del servidor proxy/reenvío.

Luego, en el servidor proxy/reenvío, necesita enmascarar el tráfico a las redes de sus clientes. Ejemplo:

iptables -t nat -A POSTROUTING -d 192.168.0.0/24 -o eth0 -j MASQUERADE

Con esto, el servidor SMB recibirá tráfico de las IP del cliente, mientras que la comunicación del cliente es con el servidor proxy/reenvío y no debe desconectarse cuando se conectan varios clientes.

información relacionada