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 2500
IPv4で聞くnc -zv localhost 2500
最初にIPv6 localhostに接続しようとしましたが、::1
失敗し、IPv4 localhost127.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をステータスに設定するか、
-4
IPv4のみを試みるオプションを使用します。または、デュアルスタック設定の解像度を変更してください。ローカルホストIPv6よりもIPv4を優先します。 glibcベースのシステム(ほとんどのLinuxなど)では、以下を追加することで実行できます
/etc/gai.conf
。precedence ::1/128 5
または、
-6
IPv6 を使用する説明を使用してサーバーコマンドに宣言します。実際、IPv6ソケットはデフォルトでデュアルモードIPv4 + IPv6に設定される可能性が高いです。RFC 3493。
2番目の質問:サーバーコマンドは終了します。
ゼロパターンスキャンインターネット猫TCPは単に接続を確立して終了します。つまり、ゼロデータを送信しますが、まだ接続を確立して閉じます。したがって、役割を完了するサーバーコマンドはデフォルトで終了します(これはOpenBSDバリアントの動作です。たとえば、ソース/レガシーバリアントはこれを行いませんが、IPv6も使用しません)。
リスニングソケットを維持し、最初の接続を受信したときに停止しないように、サーバーコマンドに必須オプションを追加します。 OpenBSDバージョンの場合は、
-k
「複数接続用にインバウンドソケットを開いたままにする」オプションがあります。nc -k -l 2500
気づく他の実装があります~のインターネット猫それぞれ独自のニュアンスがあります。どちらを使用すべきかについての私のアドバイスは次のとおりです。なし、使用socat
代わりに、より多くの機能があります。