2

元の質問

node.js TCP サーバー (ローカルホスト上) に telnet で接続しており、キープアライブ プローブを調査しようとしています。

最初のテストとして、telnet を使用してサーバーに接続し、FIN パケットを送信しない方法で telnet セッションを終了させたいと考えています。(サーバーに、TCP ソケットがまだ「正常」であると認識させます。) 残念ながら、これをテストする賢い方法を見つけることができないようです。

  • telnet プロンプトから telnet を終了するとend、ノードでソケットのイベントが発生します。明らかに FIN パケットを受信しました。
  • I killtelnet のプロセスは、プロセスが終了する前に、FIN パケットで接続をきれいに終了します。

FIN パケットを送信せずに telnet を終了する方法を知っていますか (できれば、ネットワーク ケーブルが切断されたり、物理的なネットワーク障害が発生したりする必要はありません)。

改善された質問

localhost / loopback だけを使用してネットワーク障害をシミュレートしたい (実際にインターフェイスやネットワーク ケーブルを切断する必要はありません)。どちらも localhost で、クライアントとサーバー間の TCP 接続を開きたいと考えています。次に、クライアントがなくなったことをサーバーに知らせずに、クライアントを「死ぬ」ようにします。(つまり、FIN パケットを送信しません。)これは、ルーターがダウンした場合など、実際のネットワークで発生する可能性があります。

以下のコメントのおかげで、上記のように、プロセスが終了した (または強制終了された) ときにプロセスが所有する開いているポート/ソケットをカーネルが収集しtelnet、FIN を送信してプロセスのためにそれらを閉じることを学びました。パケット。そのため、カーネルをだまして既存の接続を閉じないようにする必要があります。

では、どうすればクライアント プロセスを作成し、それを維持しながら、完全にデッドな TCP 接続のように動作させることができるのでしょうか?

スポイラー

  • (以下の回答 1: raw ソケット (scapy) を使用し、最初の接続といくつかのテスト データの後にサーバーから送信されたパケットを無視します。(たとえば、一定時間後。))
  • (回答2、同僚からのアイデア:iptablesクライアントとサーバー間のトラフィックを遮断するように構成します。実際のiptablesルールは下のコメントにあります。)
4

2 に答える 2

1

クライアントプロセスを強制終了する必要がありますか?その場合は、netcatを使用して、プロセスをバックグラウンドで実行します。bashで:

for i in $(seq 5) do nc localhost 5001 &; sleep 1; done

これにより、SYNが1秒間隔で5つのTCPクライアントが作成されます。セッションの1つと対話する必要がある場合は、次を使用できます。

fg $PID

netcatの1つをシェルのフォアグラウンドに戻します。

別のオプションはiptablesルールです:

iptables -A OUTPUT -p tcp --tcp-flags FIN -j DROP

さらに別のオプションは、Scapyなどのrawソケットで低レベルのネットワークツールを使用することです。これがScapyのPythonドキュメントです。サーバーから提供されるSYN-ACKをACKする必要があることを除いて、TCPSYNスキャンと同様のことを行います。これにより、サーバーソケットは「接続済み」状態のままになり、続行して他のことを実行できます。サーバーは時々あなたをACKするかもしれませんが、あなたのテストプログラムは気にしません。SYNを送信し、SYN-ACKに応答するだけです

于 2012-10-04T22:08:26.790 に答える
0

マシンをネットワークから切断する必要があります。プロセスを「切断」すると、常にOS/マシンがソケットを適切に閉じます。

ケーブルを物理的に抜かずにマシンを切断する最も簡単な方法は、マシンのIPアドレスを変更することです。

于 2012-10-05T13:54:03.607 に答える