![Nginx отключает первого клиента, как только подключается второй](https://rvso.com/image/1597851/Nginx%20%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D1%82%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0%2C%20%D0%BA%D0%B0%D0%BA%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B9.png)
Я пытаюсь настроить 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-адресов клиентов, в то время как связь клиентов будет осуществляться с прокси-сервером/сервером пересылки и не должна прерываться при подключении нескольких клиентов.