Nginx descartando o primeiro cliente assim que o segundo se conecta

Nginx descartando o primeiro cliente assim que o segundo se conecta

Estou tentando configurar o Nginx para reverter a porta proxy 445, mas toda vez que o cliente A está conectado ao compartilhamento através do Nginx e um cliente B se conecta, a conexão do cliente A é interrompida pelo Nginx, embora ele estivesse usando ativamente o compartilhamento (baixando um arquivo grande, por exemplo). É como se o Nginx estivesse reutilizando a conexão do cliente B antes que o cliente A termine de usá-la.

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;
    }
}

O que está faltando no arquivo de configuração acima para permitir que os clientes A e B usem o compartilhamento simultaneamente sem interromper uma conexão para estabelecer a outra?

Algum contexto extra:
Nginx v. 1.17.1 rodando na máquina virtual Ubuntu 18.04.2 LTS 4 vCPU e 4 Gb mem;

Já tentei fazer esse controle usando o iptables ao invés do Nginx para encaminhar as conexões da porta 445 para o servidor de compartilhamento e o resultado foi parecido: o cliente A tem sua conexão perdida quando B se conecta;

O compartilhamento funciona bem se os clientes A e B se conectarem diretamente ao compartilhamento de armazenamento sem Nginx entre eles;

Eu tentei várias configurações recomendadas da documentação do Nginx (limit_conn, so_keepalive, reuseport....), mas posso tê-las utilizado indevidamente;

No Wireshark, vejo que o Nginx envia um pacote [FIN, ACK] para o cliente A quando o cliente B se conecta;

Log do Nginx quando o cliente A tem sua conexão afetada: *[erro] 32110#32110:7 recv() falhou (104: Conexão redefinida pelo peer) durante proxy e leitura do upstream... mas noto que este log está relacionado a um pacote [RST, ACK] que o cliente A envia para o Nginx mesmo depois do pacote [FIN, ACK] que ele recebeu.

Editar:
Tentei com a versão mais recente 1.17.3 e sem sucesso.

Responder1

Acho que o SMB Server irá desconectar você porque, por sua vez, a mesma máquina está tentando se conectar usando usuários diferentes. É o mesmo usando mascarado com iptables e Nginx.

Eu continuaria usando o iptables, mas sem mascarar o tráfego para o seu servidor SMB, permitindo apenas o encaminhamento.

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

Faça com que o tráfego do seu servidor SMB para as redes onde os clientes residem seja roteado através do servidor proxy/encaminhamento.

Então, no servidor proxy/encaminhamento, você precisa mascarar o tráfego para as redes de seus clientes. Exemplo:

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

Com isso, o servidor SMB receberá tráfego dos IPs do cliente, enquanto a comunicação do cliente é com o servidor proxy/encaminhamento e não deve desconectar quando vários clientes se conectarem.

informação relacionada