Nginx отключает первого клиента, как только подключается второй

Nginx отключает первого клиента, как только подключается второй

Я пытаюсь настроить Nginx для обратного прокси-порта 445, но каждый раз, когда клиент A подключается к общему ресурсу через Nginx и подключается клиент B, у меня соединение клиента A сбрасывается Nginx, хотя он активно использовал общий ресурс (например, загружал большой файл). Это похоже на то, что Nginx повторно использует соединение для клиента B до того, как клиент A закончит его использовать.

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

Чего не хватает в приведенном выше файле конфигурации, чтобы позволить клиентам A и B использовать общий ресурс одновременно, не разрывая одно соединение для установления другого?

Некоторый дополнительный контекст:
Nginx v. 1.17.1, работающий на виртуальной машине Ubuntu 18.04.2 LTS с 4 виртуальными ЦП и 4 ГБ памяти;

Я уже пробовал сделать этот элемент управления, используя iptables вместо Nginx для перенаправления соединений на порт 445 на сервер общего доступа, и результат был аналогичным: соединение клиента A разрывалось при подключении B;

Общий ресурс работает нормально, если клиенты A и B подключаются к общему ресурсу хранения напрямую без Nginx между ними;

Я перепробовал довольно много рекомендуемых конфигураций из документации Nginx (limit_conn, so_keepalive, reuseport....), но я мог неправильно их использовать;

Из Wireshark я вижу, что Nginx отправляет пакет [FIN, ACK] клиенту A, когда подключается клиент B;

Журнал Nginx при возникновении проблемы с подключением клиента A: *[error] 32110#32110:7 recv() не удалось (104: соединение сброшено одноранговым узлом) при проксировании и чтении из восходящего потока... но я заметил, что этот журнал связан с пакетом [RST, ACK], который клиент A отправляет в Nginx даже после получения пакета [FIN, ACK].

Редактировать:
Пробовал с более новой версией 1.17.3, но безуспешно.

решение1

Я думаю, что SMB Server отключит вас, потому что с его стороны та же машина пытается подключиться, используя разных пользователей. Это то же самое, что использовать маскарад с iptables и Nginx.

Я бы продолжил использовать iptables, но без маскировки трафика на ваш SMB-сервер, разрешив только пересылку.

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

Направьте трафик с вашего SMB-сервера в сети, в которых находятся клиенты, через прокси-сервер/сервер пересылки.

Затем на прокси/сервере пересылки вам необходимо замаскировать трафик в сети ваших клиентов. Пример:

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

При этом SMB-сервер будет получать трафик с IP-адресов клиентов, в то время как связь клиентов будет осуществляться с прокси-сервером/сервером пересылки и не должна прерываться при подключении нескольких клиентов.

Связанный контент