RST パケットを含む接続での iptables NAT の問題

RST パケットを含む接続での iptables NAT の問題

私の設定は次のようなものになります。

アプリケーション > ローカル サーバー > 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 ファイルに追加すると、動作します。

自分が本当にバカみたいに思えます。見てくださった皆さん、ありがとうございます。

関連情報