Netcat または nc は、ネットワークをデバッグおよび調査するためのネットワーク ユーティリティです。
このユーティリティは、TCP/UDP 接続の作成と調査に使用できます。このユーティリティの最大の用途は、TCP/UDP ソケットを処理する必要があるスクリプトです。
この記事では、いくつかの実用的な例によって netcat コマンドについて学びます。
1.サーバー クライアント アーキテクチャの Netcat
netcat ユーティリティは、着信接続をリッスンする指定されたポートでサーバー モードで実行できます。
$ nc -l 2389
また、開いたばかりのポート (2389) に接続しようとするクライアント モードで使用することもできます
$ nc localhost 2389
ここで、クライアント側でテキストを書くと、サーバー側に届きます。これが証拠です:
$ nc localhost 2389 HI, server
サーバーが実行されている端末で:
$ nc -l 2389 HI, server
したがって、netcat ユーティリティをクライアント サーバー ソケット通信で使用できることがわかります。
2. Netcat を使用してファイルを転送する
netcat ユーティリティを使用してファイルを転送することもできます。クライアント側で、以下を含む「testfile」という名前のファイルがあるとします:
$ cat testfile hello test
サーバー側には空のファイル「test」があります
ここで、サーバーを次のように実行します:
$ nc -l 2389 > test
クライアントを次のように実行します:
cat testfile | nc localhost 2389
ここで、サーバー側で「テスト」ファイルを見ると、次のように表示されます:
$ cat test hello test
これで、ファイル データがクライアントからサーバーに転送されたことがわかります。
3. Netcat はタイムアウトをサポート
接続を永久に開いたままにしたくない場合があります。その場合、「-w」スイッチを使用して、接続のタイムアウトを指定できます。したがって、-w フラグとともに指定された秒数の後、クライアントとサーバー間の接続が終了します。
サーバー:
nc -l 2389
クライアント:
$ nc -w 10 localhost 2389
上記の接続は 10 秒後に終了します。
注 :サーバー側で -w フラグを -l フラグと一緒に使用しないでください。その場合、-w フラグは効果がなく、接続は永久に開いたままになります。
4. Netcat は IPV6 接続をサポート
フラグ -4 または -6 は、netcat ユーティリティがどのタイプのアドレスを使用する必要があるかを指定します。 -4 は nc に IPV4 アドレスの使用を強制し、-6 は nc に IPV6 アドレスの使用を強制します。
サーバー:
$ nc -4 -l 2389
クライアント:
$ nc -4 localhost 2389
ここで、netstat コマンドを実行すると、次のように表示されます:
$ netstat | grep 2389 tcp 0 0 localhost:2389 localhost:50851 ESTABLISHED tcp 0 0 localhost:50851 localhost:2389 ESTABLISHED
IPV6 アドレスが使用されている場合、上記の出力の最初のフィールドには接尾辞「6」が含まれます。この場合はそうではないため、サーバーとクライアント間の接続は IPV4 アドレスを使用して確立されます。
ここで、nc に IPV6 アドレスの使用を強制すると
サーバー:
$ nc -6 -l 2389
クライアント:
$ nc -6 localhost 2389
ここで、netstat コマンドを実行すると、次のように表示されます:
$ netstat | grep 2389 tcp6 0 0 localhost:2389 localhost:33234 ESTABLISHED tcp6 0 0 localhost:33234 localhost:2389 ESTABLISHED
したがって、'tcp' を含む接尾辞 '6' は、nc が現在 IPV6 アドレスを使用していることを示しています。
5. Netcat で STDIN からの読み取りを無効にする
この機能は、フラグ -d を使用して実現できます。次の例では、このフラグをクライアント側で使用しています。
サーバー:
$ nc -l 2389
クライアント:
$ nc -d localhost 2389 Hi
-d オプションを使用して stdin からの読み取りが無効になっているため、テキスト「こんにちは」はサーバー側に送信されません。
6. Netcat サーバーを強制的に稼働させる
netcat クライアントがサーバーに接続されていて、しばらくしてからクライアントが切断された場合、通常は netcat サーバーも終了します。
サーバー:
$ nc -l 2389
クライアント:
$ nc localhost 2389 ^C
サーバー:
$ nc -l 2389 $
したがって、上記の例では、クライアントが切断されるとすぐにサーバーも終了したことがわかります。
この動作は、サーバー側で -k フラグを使用して制御し、クライアントが切断された後でもサーバーを強制的に稼働させます。
サーバー:
$ nc -k -l 2389
クライアント:
$ nc localhost 2389 ^C
サーバー:
$ nc -k -l 2389
したがって、-k オプションを使用すると、クライアントが切断された場合でもサーバーが稼働し続けることがわかります。
7. EOF 後も稼働するように Netcat クライアントを構成する
Netcat クライアントは、EOF の受信後も稼働し続けるように構成できます。通常のシナリオでは、nc クライアントが EOF 文字を受信するとすぐに終了しますが、-q フラグを使用すると、この動作を制御することもできます。このフラグは、クライアントが終了するまで (EOF を受け取った後) に待機する秒数を表す数値を想定しています
クライアントは次のように起動する必要があります:
nc -q 5 localhost 2389
クライアントが EOF を受信すると、5 秒間待機してから終了します。
8. UDP プロトコルで Netcat を使用する
デフォルトでは、nc ユーティリティが作成するすべてのソケットは TCP プロトコルですが、このユーティリティは UDP プロトコルでも動作します。 UDP プロトコルを有効にするには、-u フラグを使用します。
サーバー:
$ nc -4 -u -l 2389
クライアント:
$ nc -4 -u localhost 2389
これで、サーバーとクライアントの両方が UDP プロトコルを使用するように構成されました。これは、次の netstat コマンドで確認できます。したがって、この接続は UDP プロトコルを使用していることがわかります。
$ netstat | grep 2389 udp 0 0 localhost:42634 localhost:2389 ESTABLISHED