![Nginx descarta el primer cliente tan pronto como se conecta el segundo](https://rvso.com/image/1597851/Nginx%20descarta%20el%20primer%20cliente%20tan%20pronto%20como%20se%20conecta%20el%20segundo.png)
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.