我正在尝试将 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 的流量,而客户端的通信是与代理/转发服务器进行的,并且在多个客户端连接时不应断开连接。