Nginx 在第二個客戶端連線後立即丟棄第一個客戶端

Nginx 在第二個客戶端連線後立即丟棄第一個客戶端

我正在嘗試將 Nginx 配置為反向代理端口 445,但是每次客戶端 A 透過 Nginx 連接到共享並且客戶端 B 連接時,客戶端 A 的連接都會被 Nginx 刪除,即使他正在積極使用共享(下載例如,一個大文件)。這就像 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 mem 上運作;

我已經嘗試使用 iptables 而不是 Nginx 進行此控制,將連接埠 445 上的連線轉送到共用伺服器,結果類似:當 B 連線時,客戶端 A 的連線被中斷;

如果用戶端 A 和 B 直接連接到儲存共享且中間沒有 Nginx,則共享工作正常;

我已經嘗試了很多 Nginx 文件中推薦的配置(limit_conn、so_keepalive、reuseport...),但我可能誤用了它們;

從 Wireshark 中我看到當客戶端 B 連線時,Nginx 會向客戶端 A 發送一個 [FIN, ACK] 封包;

客戶端 A 連接受影響時 Nginx 的日誌: *[錯誤] 32110#32110:7 在代理程式和從上游讀取時,recv() 失敗(104:連線被對等方重置)... 但我注意到這個日誌與客戶端 A 發送到 Nginx 的 [RST, ACK] 封包相關,即使在它收到 [FIN, 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 的流量,而客戶端通訊則與代理/轉送伺服器進行,並且在多個客戶端連接時不應斷開連接。

相關內容