Linux nc (netcat) コマンド:実践的な例と使い方

LinuxLinuxBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Linux における TCP/IP 接続の「スイスアーミーナイフ」とも呼ばれる多機能なネットワークユーティリティである nc (netcat) コマンドについて学びます。Netcat を使用すると、接続の確立、ポートのリスニング、ネットワーク接続を介したデータの転送が可能になり、ネットワーク管理者やセキュリティ専門家にとって不可欠なツールとなります。

この実験を通して、TCP と UDP の両方の通信プロトコルで netcat を使用する方法を探求します。シンプルなサーバー-クライアント通信をセットアップし、ポートスキャンやファイル転送などの実用的なネットワークタスクに netcat をどのように使用できるかを学びます。

この実験の終わりには、さまざまなネットワークシナリオで nc コマンドを使用する方法をしっかりと理解し、Linux のネットワークスキルを強化し、ネットワークの問題をデバッグするための強力なツールを手に入れることができます。

Linux Commands Cheat Sheet

nc (netcat) コマンドの理解

このステップでは、netcat とは何か、インストールされているかどうかを確認する方法、およびその基本的な使用オプションについて学びます。

Netcat とは?

Netcat (nc) は、TCP または UDP プロトコルを使用してネットワーク接続を介してデータの読み書きを行うコマンドラインユーティリティです。ネットワークのデバッグ、ポートスキャン、ファイル転送などに使用できる、信頼性の高いバックエンドツールとして設計されています。

インストールの確認

まず、netcat がシステムにインストールされていることを、そのバージョンを確認して検証しましょう。

which nc

次のような出力が表示されるはずです。

/usr/bin/nc

netcat がインストールされていない場合は、以下でインストールできます。

sudo apt-get update
sudo apt-get install -y netcat

基本的な Netcat オプションの理解

ヘルプ情報を表示して、nc コマンドの基本的なオプションを調べてみましょう。

nc -h

これにより、利用可能なオプションのリストが表示されます。最も一般的なオプションには以下が含まれます。

  • -l: リッスンモード(インバウンド接続用)
  • -p: リッスンするローカルポートを指定
  • -u: TCP の代わりに UDP を使用
  • -v: 詳細出力
  • -w: 接続のタイムアウト

特定のポートがリモートサーバーで開いているかどうかを確認する簡単なテストを作成しましょう。たとえば、google.com でポート 80 (HTTP) が開いているかどうかを確認するには、次のようにします。

nc -zv google.com 80

-z フラグは、netcat にデータを送信せずにリスニングデーモンをスキャンするように指示し、-v は詳細出力を有効にします。接続が成功したかどうかを示す出力が表示されるはずです。

Connection to google.com 80 port [tcp/http] succeeded!

これにより、google.com でポート 80 が開いており、接続を受け入れていることが確認できます。

次のステップでは、netcat を使用して、TCP と UDP の両方のプロトコルを使用してサーバーとクライアント間の実際の通信を確立します。

Netcat を使用した TCP 通信の設定

このステップでは、netcat を使用して TCP サーバーとクライアントの通信を確立する方法を学びます。TCP (Transmission Control Protocol) は、接続指向のプロトコルであり、データの信頼性の高い順序付けられた配信を提供します。

TCP 通信の理解

TCP 通信には、接続をリッスンするサーバーと、接続を開始するクライアントが含まれます。接続が確立されると、両側でデータの送受信が可能になります。TCP は、すべてのデータが正しく、正しい順序で配信されることを保証します。

TCP サーバーの設定

ポート 8080 でリッスンする TCP サーバーを作成するには、ターミナルを開き、次を実行します。

nc -l -p 8080

各オプションの機能は次のとおりです。

  • -l: netcat にインバウンド接続をリッスンするように指示します(サーバーモード)
  • -p 8080: サーバーがリッスンするポート 8080 を指定します

これで、サーバーはクライアントが接続するのを待機しています。ターミナルは出力なしでハングアップしたように見えますが、これは正常です。

TCP クライアントとの接続

作成したサーバーに接続するには、新しいターミナルを開き、次を実行します。

nc localhost 8080

このコマンドは、ローカルマシン (localhost) 上のポート 8080 で実行されているサーバーへの接続を試みます。

TCP 接続のテスト

サーバーとクライアントの両方が実行されているので、それらの間でメッセージを送信できます。

  1. クライアントターミナルで、メッセージを入力し、Enter キーを押します。例:

    Hello from the client!
  2. このメッセージがサーバーターミナルに表示されるはずです。

  3. サーバーターミナルで、応答を入力し、Enter キーを押します。例:

    Hello from the server!
  4. このメッセージがクライアントターミナルに表示されるはずです。

これは、TCP を介した双方向通信を示しています。両側でデータの送受信が可能です。

接続の終了

接続を閉じるには、次のいずれかを実行します。

  • いずれかのターミナルで Ctrl+C を押します
  • または、Ctrl+D を押して EOF (End of File) シグナルを送信します

接続が終了し、サーバーとクライアントの両方のプロセスが終了します。

この簡単な例は、TCP 通信における netcat の基本的な使用法を示しています。実際のシナリオでは、この機能は、リモート管理、システム間のデータ転送、またはネットワークアプリケーションのテストなどのタスクに使用できます。

Netcat を使用した UDP 通信

このステップでは、netcat を使用して UDP (User Datagram Protocol) 通信を行う方法を学びます。UDP は、データの送信方法において TCP とは大きく異なります。

UDP vs TCP の理解

TCP とは異なり、UDP は次の特徴を持ちます。

  • コネクションレス - データ転送の前に正式な接続は確立されません
  • パケットの配信または正しい順序を保証しません
  • オーバーヘッドとレイテンシが低く、ゲームやビデオストリーミングなどの時間的制約のあるアプリケーションに役立ちます

UDP サーバーの設定

ポート 9090 でリッスンする UDP サーバーを作成するには、ターミナルを開き、次を実行します。

nc -u -l -p 9090

各オプションの機能は次のとおりです。

  • -u: デフォルトの TCP の代わりに UDP を使用することを指定します
  • -l: netcat にインバウンドデータグラムをリッスンするように指示します(サーバーモード)
  • -p 9090: サーバーがリッスンするポート 9090 を指定します

これで、サーバーは UDP データグラムの到着を待機しています。TCP サーバーと同様に、データが到着するまで、ターミナルは出力なしでハングアップしたように見えます。

UDP クライアントとしてのデータの送信

UDP サーバーにデータを送信するには、新しいターミナルを開き、次を実行します。

nc -u localhost 9090

このコマンドを使用すると、ローカルマシン (localhost) 上のポート 9090 で実行されているサーバーに UDP データグラムを送信できます。

UDP 通信のテスト

UDP サーバーとクライアントの両方が実行されているので、メッセージを送信できます。

  1. クライアントターミナルで、メッセージを入力し、Enter キーを押します。例:

    This is a UDP message
  2. このメッセージがサーバーターミナルに表示されるはずです。

  3. サーバーターミナルで、応答を入力し、Enter キーを押します。例:

    UDP response received
  4. このメッセージがクライアントターミナルに表示されるはずです。

UDP の動作の理解

TCP とは異なり、UDP では次のようになります。

  • サーバーは接続を追跡しません
  • 各メッセージは独立しています
  • デフォルトでは、受信の確認応答はありません
  • 実際のネットワーク条件下では、メッセージが失われたり、順序が入れ替わって到着したりする可能性があります

これにより、UDP は、信頼性よりも速度が重要であるアプリケーション、または時折のパケット損失が許容されるアプリケーションに役立ちます。

UDP セッションの終了

UDP セッションを閉じるには、次の操作を行います。

  • いずれかのターミナルで Ctrl+C を押してプロセスを終了します

UDP はコネクションレスであるため、接続を正式に「閉じる」ことはありません。単に、プロセスがより多くのデータグラムの送受信を停止しているだけです。

UDP は、DNS ルックアップ、ビデオストリーミング、オンラインゲーム、および低レイテンシが完全な信頼性よりも重要なその他のシナリオなどのアプリケーションで一般的に使用されています。

Netcat を使用したファイル転送

このステップでは、netcat を使用してシステム間でファイルを転送する方法を学びます。これは、単純なテキスト通信を超えた netcat の多用途性を示す実用的なアプリケーションです。

ファイル転送における Netcat の理解

Netcat は、次の方法でコンピューター間でファイルを転送するために使用できます。

  1. 送信側のファイルからの入力をリダイレクトする
  2. 受信側のファイルへの出力をリダイレクトする

このアプローチでは、FTP や SCP などの追加のプロトコルは必要ありません。そのため、これらのツールが利用できないシナリオで役立ちます。

受信側の設定

まず、ファイルを受け入れる受信側を設定しましょう。ターミナルを開き、次を実行します。

nc -l -p 7000 > received_file.txt

このコマンドは次のとおりです。

  • ポート 7000 でリッスンサーバーを設定します
  • 受信したすべてのデータを received_file.txt という名前のファイルにリダイレクトします

送信するテストファイルの作成

送信する前に、転送するサンプルファイルを作成しましょう。新しいターミナルで、次を実行します。

echo "This is a test file that will be transferred using netcat." > original_file.txt
echo "Netcat can be used for simple file transfers between systems." >> original_file.txt
echo "This demonstrates a practical use case of the nc command." >> original_file.txt

## View the file contents to confirm
cat original_file.txt

ターミナルにファイルの内容が表示されるはずです。

ファイルの送信

次に、ファイルをレシーバーに送信しましょう。ファイルを作成したのと同じターミナルで、次を実行します。

cat original_file.txt | nc localhost 7000

このコマンドは次のとおりです。

  • cat を使用して original_file.txt の内容を読み取ります
  • この内容を netcat にパイプ (|) します
  • Netcat はデータをポート 7000 の localhost に送信します

転送はすぐに実行されます。転送が完了すると、送信側の netcat プロセスは自動的に終了しますが、受信側はさらに多くのデータを待機し続けます。

転送の検証

ファイルの送信が完了したら、受信側のターミナルで Ctrl+C を押して接続を閉じます。次に、ファイルが正しく転送されたことを確認しましょう。

cat received_file.txt

元のファイルと同じ内容が表示されるはずで、転送が成功したことを確認できます。

ファイルの比較

転送が完璧であることを確認するために、2 つのファイルを比較できます。

diff original_file.txt received_file.txt

出力がない場合、ファイルは同一であり、転送は成功したことを意味します。

このファイル転送方法は、ローカルマシンだけでなく、ネットワーク上の異なるコンピューター間でも機能します。localhost をリモートマシンの IP アドレスまたはホスト名に置き換えるだけです。

この手法は、従来のファイル転送ツールが利用できない、または制限されている環境で特に役立ち、netcat をシステム管理者のツールキットで貴重なツールにします。

まとめ

この実験では、ネットワーク通信とトラブルシューティングに強力な機能を提供する Linux の基本的なネットワーキングツールである、多用途な nc (netcat) コマンドについて探求しました。

以下のことを学びました。

  • netcat の基本的な概念と、システムへのインストールを確認する方法
  • netcat を使用して TCP サーバー-クライアント通信を確立する方法。これにより、信頼性の高い、コネクション指向のデータ転送が可能になります
  • netcat を使用した UDP 通信の設定方法。コネクションレス UDP とコネクション指向 TCP プロトコルの違いを示します
  • 追加のファイル転送プロトコルを必要とせずに、システム間で netcat を活用して実用的なファイル転送を行う方法

これらのスキルは、次のようなより高度なネットワーキングタスクの基礎となります。

  • ネットワーク接続の問題のデバッグ
  • ファイアウォール設定のテスト
  • シンプルなネットワークサービスの作成
  • 基本的なセキュリティテストの実行

Netcat のシンプルさと多用途性により、システム管理者、ネットワークエンジニア、およびセキュリティ専門家にとって不可欠なツールとなっています。このネットワーキングの「スイスアーミーナイフ」を習得することで、Linux ツールキットに追加する強力なユーティリティを手に入れることができます。

さらに詳しく調べるには、接続のプロキシ、永続的なリスナーの作成、または自動化されたネットワークテストのために netcat をスクリプトと統合するなどの、netcat の高度な機能を検討してください。

Linux Commands Cheat Sheet