![Nginx descartando o primeiro cliente assim que o segundo se conecta](https://rvso.com/image/1597851/Nginx%20descartando%20o%20primeiro%20cliente%20assim%20que%20o%20segundo%20se%20conecta.png)
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.