![Nginx 在第二個客戶端連線後立即丟棄第一個客戶端](https://rvso.com/image/1597851/Nginx%20%E5%9C%A8%E7%AC%AC%E4%BA%8C%E5%80%8B%E5%AE%A2%E6%88%B6%E7%AB%AF%E9%80%A3%E7%B7%9A%E5%BE%8C%E7%AB%8B%E5%8D%B3%E4%B8%9F%E6%A3%84%E7%AC%AC%E4%B8%80%E5%80%8B%E5%AE%A2%E6%88%B6%E7%AB%AF.png)
我正在嘗試將 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 的流量,而客戶端通訊則與代理/轉送伺服器進行,並且在多個客戶端連接時不應斷開連接。