
我的設定類似於以下內容。
應用程式 > 本機伺服器 > VPN > 遠端 VPN 伺服器 > 許可證伺服器
應用程式和本機伺服器位於我的 LAN 上。本機伺服器透過 VPN 連接到公司 VPN 伺服器,這就是本機伺服器可以看到公司許可證伺服器的方式。
我告訴我的應用程式在本機伺服器上尋找許可證,並將以下 iptables 規則新增至我的本機伺服器。
iptables -F
iptables -t nat -F
iptables -X
licServer=$(host licserver | awk '/has address/ { print $4 ; exit }')
iptables -t nat -A PREROUTING -p tcp --dport 1642 -j DNAT --to-destination $licServer:1642
iptables -t nat -A PREROUTING -p tcp --dport 57109 -j DNAT --to-destination $licServer:57109
iptables -t nat -A POSTROUTING -j MASQUERADE
這似乎有效,應用程式將成功獲得許可證。但是,與本地會話(不使用我的規則)相比,協商非常慢。
如果我查看wireshark,我會發現該應用程式正在發送一些異常訊息。應用程式不會發送 FIN 資料包,而是發送 RST 資料包。我注意到每次它發送其中一個 RST 封包時,在發送下一則訊息之前都會等待幾乎精確的 10 秒。我不認為這是巧合,因為 CLOSE_WAIT 逾時是 10 秒。
典型的談判將開始如下
t=0 Application:A > Local Server:1642 [SYN]
t+0.1 Local Server:1642 > Application:A [SYN, ACK]
t+0.1 Application:A > Local Server:1642 [ACK]
t+0.1 Application:A > Local Server:1642 [PSH, ACK]
t+0.2 Local Server:1642 > Application:A [PSH, ACK]
t+0.2 Application:A > Local Server:1642 [RST, ACK] (10 second wait here)
t+10.2 Application:B > Local Server:57109 [SYN]
.... 等等。每當有 RST 時,它就會再等 10 秒。
當應用程式位於許可證伺服器本地時,會發送相同的訊息,但發送 [RST, ACK] 封包後沒有 10 秒的等待。
因此,我的問題是,NAT 在我的伺服器上做了什麼可能導致我的應用程式在發送 RST 封包後掛起 10 秒?
答案1
沒關係,事實證明這個問題與 NAT 完全無關。
許可證伺服器發送自己的主機名稱作為先前資料包有效負載的一部分。顯然,應用程式無法聯繫該主機名,因此 10 秒來自應用程式中的某些逾時。我的猜測是它會嘗試主機名,然後 10 秒後嘗試它擁有的第一個地址(這就是它最終的工作方式)。
一旦我將許可證伺服器的主機名稱新增到客戶端電腦上的主機檔案中,它就可以工作。
我覺得自己像個皇家白痴。感謝所有看過的人。