
私の設定は次のようなものになります。
アプリケーション > ローカル サーバー > 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 秒後に最初に取得したアドレスを試行します (最終的にはこのように動作します)。
ライセンス サーバーのホスト名をクライアント マシンの hosts ファイルに追加すると、動作します。
自分が本当にバカみたいに思えます。見てくださった皆さん、ありがとうございます。