我有一个类似于以下内容的设置。
应用程序 > 本地服务器 > VPN > 远程 VPN 服务器 > 许可证服务器
应用程序和本地服务器都在我的局域网上。本地服务器通过 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 秒后尝试它拥有的第一个地址(这就是它的最终工作原理)。
一旦我将许可证服务器的主机名添加到客户端计算机上的 hosts 文件中,它就可以运行。
我觉得自己像个大傻瓜。感谢大家的观看。