一旦第二个客户端连接,Nginx 就会丢弃第一个客户端

一旦第二个客户端连接,Nginx 就会丢弃第一个客户端

我正在尝试将 Nginx 配置为反向代理端口 445,但每次客户端 A 通过 Nginx 连接到共享并且客户端 B 连接时,即使客户端 A 正在积极使用共享(例如,下载大文件),Nginx 也会断开客户端 A 的连接。这就像 Nginx 在客户端 A 完成使用之前重用了客户端 B 的连接一样。

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 vCPU 和 4Gb 内存上;

我已经尝试使用 iptables 而不是 Nginx 来制作这个控制,将端口 445 上的连接转发到共享服务器,结果类似:当客户端 B 连接时,客户端 A 的连接断开;

如果客户端 A 和 B 直接连接到存储共享,并且中间没有 Nginx,则共享可以正常工作;

我尝试了 Nginx 文档中推荐的很多配置(limit_conn、so_keepalive、reuseport....),但我可能用错了;

从Wireshark中我看到当客户端B连接时,Nginx向客户端A发送一个[FIN,ACK]数据包;

客户端 A 的连接受到影响时 Nginx 的日志:*[error] 32110#32110:7 代理并从上游读取时 recv() 失败(104:对端重置连接)... 但我注意到此日志与客户端 A 在收到 [FIN,ACK] 数据包之后发送给 Nginx 的 [RST,ACK] 数据包有关。

编辑:
尝试使用新版本 1.17.3,但没有成功。

答案1

我认为 SMB 服务器会断开您的连接,因为从它的角度来看,同一台机器正在尝试使用不同的用户进行连接。这与使用 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 的流量,而客户端的通信是与​​代理/转发服务器进行的,并且在多个客户端连接时不应断开连接。

相关内容