接続を試みた後、netcatはローカルホストの受信側で接続を閉じます。

接続を試みた後、netcatはローカルホストの受信側で接続を閉じます。

NCで聞いています。localhost:2500

▶ nc -l 2500
_

他の端末でこのリスニング側に接続しようとしています。

▶ nc -zv localhost 2500
nc: connectx to localhost port 2500 (tcp) failed: Connection refused
Connection to localhost port 2500 [tcp/rtsserv] succeeded!

最初の試みが失敗したように見えるのはなぜですか?

また、何らかの理由で(明らかに成功した)接続試行が完了すると、リスニングプロセスが終了することも確認しました。なぜこれが起こるのかわかりません。

ベストアンサー1

netcatにはさまざまな実装があります。

最初の質問はIPv6に関連しているように見えるため、従来の実装ではなくIPv6を処理できるより近代的な実装を使用しているとします。ここではOpenBSDバリアントnc(Debian 11の場合はバージョン1.217、1.217-3)を使用しています。

  • 問題 1: 二重接続

    • nc -l 2500IPv4で聞く

    • nc -zv localhost 2500最初にIPv6 localhostに接続しようとしましたが、::1失敗し、IPv4 localhost 127.0.0.1:successで再試行しました。

    私のnetcatはより多くの情報を提供します:

    $ nc -zv localhost 2500
    nc: connect to localhost (::1) port 2500 (tcp) failed: Connection refused
    Connection to localhost (127.0.0.1) 2500 port [tcp/*] succeeded!
    

    これによりこれを防ぐことができます。

    • クライアントコマンドでlocalhostの代わりに127.0.0.1をステータスに設定するか、-4IPv4のみを試みるオプションを使用します。

    • または、デュアルスタック設定の解像度を変更してください。ローカルホストIPv6よりもIPv4を優先します。 glibcベースのシステム(ほとんどのLinuxなど)では、以下を追加することで実行できます/etc/gai.conf

      precedence  ::1/128       5 
      
    • または、-6IPv6 を使用する説明を使用してサーバーコマンドに宣言します。実際、IPv6ソケットはデフォルトでデュアルモードIPv4 + IPv6に設定される可能性が高いです。RFC 3493

  • 2番目の質問:サーバーコマンドは終了します。

    ゼロパターンスキャンインターネット猫TCPは単に接続を確立して終了します。つまり、ゼロデータを送信しますが、まだ接続を確立して閉じます。したがって、役割を完了するサーバーコマンドはデフォルトで終了します(これはOpenBSDバリアントの動作です。たとえば、ソース/レガシーバリアントはこれを行いませんが、IPv6も使用しません)。

    リスニングソケットを維持し、最初の接続を受信したときに停止しないように、サーバーコマンドに必須オプションを追加します。 OpenBSDバージョンの場合は、-k「複数接続用にインバウンドソケットを開いたままにする」オプションがあります。

    nc -k -l 2500
    

気づく他の実装があります~のインターネット猫それぞれ独自のニュアンスがあります。どちらを使用すべきかについての私のアドバイスは次のとおりです。なし、使用socat代わりに、より多くの機能があります。

おすすめ記事