Netcat を使用したシンプルなネットワーク通信

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

はじめに

この実験では、ネットワークの「スイスアーミーナイフ(万能ナイフ)」としばしば称される多機能ツール、Netcat を使用したネットワーク通信の基礎を学びます。この強力なユーティリティを使用して、TCP または UDP プロトコルを介してネットワーク接続間でデータを読み書きする方法を習得します。

ハンズオン形式の実践を通じて、クライアント・サーバー通信の基本を探索し、シンプルなチャットシステムを作成し、ポートなどの重要なネットワーク概念を理解します。また、安全なデータ伝送のための基本的な暗号化技術についても紹介します。

Netcat のインストール

通信を開始する前に、適切なツールを準備する必要があります。Netcat は、多くの異なるネットワークタスクを処理できるため、ネットワークツールの「スイスアーミーナイフ」と呼ばれています。システムに Netcat をインストールする手順を確認しましょう。

  1. まず、ターミナルを開きます。デスクトップにある Xfce ターミナルを探して開いてください。ターミナルは、Netcat を操作するためのすべてのコマンドを入力する場所です。
Xfce Terminal opening screenshot

注意:無料ユーザーはインターネットに接続できないため、実験環境には Netcat があらかじめインストールされています。リストの 4 番目(Netcat がインストールされているか確認する)までスキップしてください。Pro ユーザーにアップグレードすると、自分で Netcat をインストールする練習ができます。

Pro ユーザーのみ
  1. ターミナルが開いたら、パッケージリストを更新する必要があります。これにより、最新バージョンの Netcat を取得できるようになります。次のコマンドを入力して Enter キーを押してください。
sudo apt update

システムからパスワードを求められる場合があります。パスワードを入力し(入力中の文字は表示されません)、Enter キーを押します。sudo は、このコマンドを管理者権限で実行することを意味します。

  1. パッケージリストが更新されたので、Netcat をインストールしましょう。パッケージマネージャーがすべての依存関係を自動的に処理します。次のコマンドを入力してください。
sudo apt install netcat -y

-y フラグは、すべての確認プロンプトに自動的に「yes」と答えるためのもので、インストールをスムーズに進めることができます。インストールすることが確実な場合に便利です。

  1. インストールが完了したら、Netcat が正しくインストールされたか確認しましょう。バージョンの確認を行うことでチェックできます。次のように入力してください。
nc -h

"OpenBSD netcat" で始まり、その後にオプションのリストが続く出力が表示されれば成功です。これは Netcat がインストールされ、使用準備が整っていることを意味します。-h フラグはヘルプ情報を表示するもので、プログラムが動作しているかテストするのに適した方法です。

  1. おめでとうございます!強力なネットワークツールのインストールが完了しました。Netcat には、単純なファイル転送からネットワーク接続の作成まで、多くの機能があります。この実験では、その機能を理解するために基本的な使い方に焦点を当てます。Netcat を、コンピュータ同士を接続して情報を送受信するためのシンプルな手段と考えてください。

ポートの理解とリスナーの作成

通信ツールの準備ができたので、次はポートについて学び、リスナー(待ち受け状態)をセットアップしましょう。ネットワークにおいて、ポートはラジオのチャンネルのようなものです。同じデバイス上で複数の通信を同時に行うことを可能にします。それぞれの番号が付いたドアが、コンピュータ上の異なるサービスやアプリケーションにつながっているとイメージしてください。

  1. リスナーを作成しましょう。通信にはポート 12345 を使用します。ポート番号は 0 から 65535 までありますが、覚えやすく、通常はシステムサービスで使用されていない 12345 を選択します。ターミナルで次のように入力してください。

    nc -l 12345

    このコマンドは、Netcat に対してポート 12345 でリスニング(-l フラグ)するように指示します。-l は "listen" モードを意味し、コンピュータがこのポートへの着信接続を待機する状態になります。

  2. ターミナルが停止したように見えるかもしれませんが、心配しないでください。これは期待通りの動作です。Netcat がアクティブにリスニングを行い、誰かがポート 12345 に接続してくるのを待っている状態だからです。カーソルが点滅しているのは、プログラムがリスニングモードで正常に動作していることを示しています。

  3. リスナーをテストするために、別のターミナルウィンドウを開く必要があります。ターミナルアイコンを右クリックして「新しいターミナル」を選択するか、ショートカットキー Ctrl+Shift+N を使用してください。この 2 つ目のターミナルが、リスナーに接続する「クライアント」として機能します。

  4. この新しいターミナルで、リスナーに接続します。次のように入力してください。

    nc localhost 12345

    このコマンドは、Netcat に対して localhost(自分自身のコンピュータを指します)のポート 12345 に接続するように指示します。localhost は、常に現在のマシンを参照する特別なホスト名です。

  5. 次に、この 2 つ目のターミナルで "Hello" などの簡単なメッセージを入力し、Enter キーを押してください。リスナーが実行されている最初のターミナルにそのメッセージが表示されるはずです。これにより、ネットワークポートを介して、接続側ターミナルからリスニング側ターミナルへデータが移動する様子が確認できます。

Netcat listener and connection
  1. どちらのターミナルからでもメッセージを入力し続けることができ、それらはもう一方のターミナルに表示されます。これは Netcat の全二重(full-duplex)通信能力、つまり双方向で同時に通信が流れることを示しています。いくつかメッセージをやり取りして、どのように動作するか確認してみましょう。

  2. 接続を終了するには、両方のターミナルで Ctrl+C を押します。このキーボードショートカットは、Netcat セッションを正常に終了させる割り込み信号を送信します。テストが終わったら、接続を適切に閉じることが重要です。

Netcat によるファイル転送

Netcat を使用した基本的なネットワーク通信の確立方法を学んだので、次は最も実用的な用途の一つである、システム間でのファイル転送について見ていきましょう。このシンプルかつ強力な機能により、Netcat はシステム管理者やネットワークエンジニアにとって価値のあるツールとなっています。

  1. まず、転送するためのサンプルファイルを作成します。ターミナルで次のように入力してください。

    cd ~/project
    echo "Top Secret: The cake recipe is actually a lie" > secret.txt

    このコマンドは 2 つのことを行います。project ディレクトリに移動し、例となるメッセージが含まれた secret.txt という新しいファイルを作成します。> 記号は、echo コマンドの出力をファイルにリダイレクト(保存)します。

  2. 次に、ファイル転送の受信側をセットアップします。ターミナルウィンドウを開き、以下を実行してください。

    cd ~/project
    nc -l 12345 > received_secret.txt

    ここで、nc -l 12345 はポート 12345 で Netcat をリスニングモードで起動します。> は、送られてきたデータを received_secret.txt という新しいファイルにリダイレクトします。このターミナルは、接続が来るまで静かに待機します。

  3. 別のターミナルウィンドウ(最初のウィンドウは実行したまま)で、ファイルを送信します。

    cd ~/project
    nc localhost 12345 < secret.txt

    このコマンドは、Netcat を使用してリスナー(localhost は「このコンピュータ自体」を意味します)のポート 12345 に接続します。< 記号は、Netcat に対して secret.txt を入力として使用するように指示し、ファイルの内容をネットワーク接続経由で送信します。

  4. 両方のエンドポイントが同じマシン上にあるため、転送は瞬時に完了します。転送が成功したか確認するために、受信したファイルの内容をチェックしましょう。

    cat received_secret.txt

    cat コマンドはファイルの内容を表示します。元の秘密のメッセージと完全に一致しているはずです。

Netcat file transfer screenshot
  1. おめでとうございます!Netcat を使用したファイル転送に成功しました。このデモンストレーションでは localhost を使用しましたが、ネットワーク上の異なるコンピュータ間でも同じプロセスが機能します。その場合は、localhost を受信側コンピュータの IP アドレスに置き換えるだけです。このシンプルな方法は、より複雑なプロトコルが利用できない状況での迅速なファイル転送に非常に役立ちます。

暗号化通信の実装

最後のステップとして、OpenSSL を使用して暗号化を実装し、それを Netcat と統合することで、通信にセキュリティレイヤーを追加しましょう。暗号化は、ネットワーク伝送中に機密情報が権限のない第三者に傍受されたり読み取られたりするのを防ぐために不可欠です。

以前の実験で OpenSSL の使い方は既に学習しました。OpenSSL は、メッセージを保護するために活用できる堅牢な暗号機能を提供します。具体的には、openssl enc コマンドを使用して、強力な対称暗号化アルゴリズムである AES-256-CBC でメッセージを暗号化および復号します。また、暗号化キーを生成するためにパスフレーズを使用します。これは送信者と受信者の間の「共有の秘密」と考えてください。

  1. まず、送信者用スクリプトを作成しましょう。このスクリプトはメッセージの暗号化と送信を処理します。secure_sender.sh という名前の新しいファイルを開きます。

    nano secure_sender.sh
  2. ファイルに以下の内容を追加します(コピー&ペーストが可能です)。

    #!/bin/bash
    
    echo "Secure Sender - Enter messages to send. Press Ctrl+C to exit."
    
    while true; do
      echo "Enter message:"
      read message
      encrypted=$(echo "$message" | openssl enc -aes-256-cbc -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
      echo "$encrypted" | nc -N localhost 12345
    done

    このスクリプトの仕組みは以下の通りです:

    • ループ内で継続的にメッセージの入力を求めます。
    • 入力を受け取り、パイプを通じて OpenSSL に渡し暗号化します。
    • Netcat (nc) を使用して、暗号化されたデータを localhost のポート 12345 に送信します。
    • 暗号化パラメータには、セキュリティを高めるためのソルト(salt)、安全な伝送のための base64 エンコーディング、および 10,000 回の反復を伴う PBKDF2 キー派生が含まれています。
    Secure sender script example
  3. Ctrl+X を押し、次に Y、そして Enter を押してファイルを保存し終了します。スクリプトを実行可能にします。

    chmod +x secure_sender.sh
  4. 次に、受信者用スクリプトを作成します。このスクリプトは着信メッセージをリッスン(待機)し、復号します。secure_receiver.sh という名前の新しいファイルを開きます。

    nano secure_receiver.sh
  5. 以下の内容を追加します。

    #!/bin/bash
    
    echo "Secure Receiver - Waiting for messages. Press Ctrl+C to exit."
    
    while true; do
      encrypted=$(nc -l -p 12345)
      if [ ! -z "$encrypted" ]; then
        decrypted=$(echo "$encrypted" | openssl enc -aes-256-cbc -d -salt -base64 -pbkdf2 -iter 10000 -pass pass:secretpassword 2> /dev/null)
        echo "Received message: $decrypted"
      fi
    done

    このスクリプトは以下の通りです:

    • ポート 12345 で着信データを継続的にリッスンします。
    • データを受信すると、パイプを通じて OpenSSL に渡し復号します。
    • メッセージを正しく復号するために、送信者と同じ暗号化パラメータを使用します。
    • 元の平文メッセージを表示します。
  6. Ctrl+X を押し、次に Y、そして Enter を押してファイルを保存し終了します。スクリプトを実行可能にします。

    chmod +x secure_receiver.sh
  7. それでは、暗号化通信システムをテストしましょう。受信者用と送信者用の 2 つのターミナルウィンドウを同時に開く必要があります。

  8. 最初のターミナルで、受信者スクリプトを起動します。

    ./secure_receiver.sh

    受信者がメッセージを待機していることを示すメッセージが表示されます。受信者は現在、ポート 12345 でアクティブにリスニングしています。

  9. 2 つ目のターミナルで、送信者スクリプトを起動します。

    ./secure_sender.sh

    メッセージの入力を求められます。ここで入力した内容はすべて、ネットワーク経由で送信される前に暗号化されます。

  10. 送信者ターミナルでメッセージを入力し、Enter キーを押します。暗号化されたメッセージが送信されるのが確認できるはずです(送信される際に暗号化されたバージョンが一瞬表示されます)。

Encrypted Message
  1. 受信者ターミナルに、送信者ターミナルで入力した通りの復号されたメッセージが表示されるはずです。

  2. 送信者ターミナルからメッセージを送り続けることができ、それらは自動的に暗号化、送信、受信、そして受信者ターミナルでの復号が行われます。これにより、完全な安全な通信ループが実証されました。

  3. 通信を終了するには、両方のターミナルで Ctrl+C を押します。これにより、両方のスクリプトが安全に停止します。

このセットアップは、シンプルながら効果的な暗号化通信システムを示しています。テストには localhost を使用していますが、同じアプローチがネットワークを越えて機能します。メッセージは送信前に自動的に暗号化され、受信時に復号されるため、安全な通信チャネルが提供されます。実際のアプリケーションでは、ハードコードされたパスワードよりも安全な鍵交換方法を使用する必要があることに注意してください。

まとめ

この実験では、Netcat を使用したネットワーク通信の基礎を学び、安全なデータ転送のための基本的な暗号化技術を探索しました。Netcat のインストール、特定のポートを介した接続の確立、およびシステム間でのファイル転送を実践しました。

このハンズオン体験は、OpenSSL を用いた具体的な実装を通じて、ネットワーク通信における暗号化の重要性を示しました。これらの基礎的なスキルは、より複雑なサイバーセキュリティの概念や安全な通信プロトコルを理解するための確かな出発点となります。