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

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

はじめに

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

実践を通して、クライアント・サーバー通信の基本を確認し、簡単なチャットシステムを作成します。また、ポートなどの重要なネットワーク概念についても理解を深めます。さらに、安全なデータ送信に必要となる基本的な暗号化技術も紹介します。

Netcatのインストール

このステップでは、秘密のエージェント同士の通信を始める前に、必要なツールを準備します。Netcatは、さまざまなネットワーク作業に対応できることから、ネットワークツールの「スイスアーミーナイフ」と呼ばれることがあります。ここでは、システムにNetcatを順番にインストールしていきます。

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

Xfce Terminal opening screenshot

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

Proユーザー限定

ターミナルを開いたら、まずパッケージ一覧を更新します。これにより、最新バージョンのNetcatを取得できます。次のコマンドを入力してEnterキーを押してください。

sudo apt update

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

パッケージ一覧が最新になったら、Netcatをインストールします。パッケージマネージャーが必要な依存関係を自動的に処理します。次のコマンドを入力してください。

sudo apt install netcat -y

-yフラグを付けると、確認を求められたときに自動的に「yes」と回答するため、インストールをスムーズに進められます。インストールすることが確実な場合に便利です。

インストールが完了したら、Netcatが正しく導入されたことを確認します。バージョン情報を表示して確認できます。次のコマンドを入力してください。
nc -h

「OpenBSD netcat」で始まり、その後にオプション一覧が表示されます。これは、Netcatがインストールされ、使用できる状態であることを示しています。-hフラグはヘルプ情報を表示するもので、プログラムが正常に動作するか確認する方法としても利用できます。

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

ポートの理解と待ち受けの作成

このステップでは、通信ツールの準備ができたので、ポートについて学び、待ち受けを設定します。ネットワークにおけるポートは、ラジオの異なるチャンネルのようなものです。同じデバイス上で複数の通信を同時に行えるようにします。コンピューター上の各サービスやアプリケーションにつながる、番号付きのドアのようなものだと考えると分かりやすいでしょう。

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

nc -l 12345

このコマンドは、Netcatにポート12345で待ち受けるよう指示します(-lフラグ)。-lは「listen」モードを表し、コンピューターがこのポートへの接続を待機する状態になります。

ターミナルが停止したように見えるかもしれませんが、心配はいりません。これは想定された動作です。Netcatが実際に待ち受けを開始し、ポート12345への接続を待っているためです。カーソルが点滅していれば、待ち受けモードで正常に動作しています。

待ち受けをテストするには、別のターミナルウィンドウを開きます。ターミナルのアイコンを右クリックして「New Terminal」を選択するか、Ctrl+Shift+Nのショートカットを使用してください。この2つ目のターミナルは、待ち受け側に接続する「クライアント」として機能します。

新しいターミナルから、待ち受けに接続します。次のように入力してください。

nc localhost 12345

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

次に、2つ目のターミナルで「Hello」のような簡単なメッセージを入力し、Enterキーを押してください。待ち受けが動作している最初のターミナルに、そのメッセージが表示されるはずです。これは、接続側のターミナルから待ち受け側のターミナルへ、ネットワークポートを通じてデータが移動したことを示しています。

Netcat listener and connection

どちらのターミナルからもメッセージを入力でき、入力した内容は相手側に表示されます。これは、Netcatが全二重通信に対応していることを示しています。つまり、通信を両方向へ同時に行えるということです。いくつかメッセージを送受信して、動作を確認してみてください。

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

Netcatによるファイル転送

このステップでは、Netcatを使った基本的なネットワーク通信の確立方法を学んだので、実用性の高い機能の1つであるシステム間のファイル転送を試します。シンプルでありながら強力なこの機能は、Netcatをシステム管理者やネットワークエンジニアにとって便利なツールにしています。

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

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

このコマンドは、プロジェクトディレクトリに移動し、例として使用するメッセージを含むsecret.txtという新しいファイルを作成します。>記号は、echoコマンドの出力をファイルへリダイレクトします。

次に、ファイル転送の受信側を設定します。ターミナルウィンドウを開き、次のコマンドを実行してください。

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

ここで、nc -l 12345はポート12345でNetcatを待ち受けモードにします。>によって、受信したデータがreceived_secret.txtという新しいファイルに書き込まれます。このターミナルは、接続が来るまで何も表示せずに待機します。

最初のターミナルを動作させたまま、別のターミナルウィンドウを開いてファイルを送信します。

cd ~/project
nc localhost 12345 < secret.txt

このコマンドは、Netcatを使って待ち受け側(localhostは「同じコンピューター」を意味します)のポート12345へ接続します。<記号によって、Netcatの入力としてsecret.txtを使用し、ファイルの内容をネットワーク接続経由で送信します。

両端が同じマシン上にあるため、転送は瞬時に完了します。転送が成功したことを確認するには、受信したファイルの内容を確認してください。

cat received_secret.txt

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

Netcat file transfer screenshot

これで、Netcatを使ったファイル転送に成功しました。ここではlocalhostを使用しましたが、同じ手順でネットワーク上の別のコンピューター間でも転送できます。その場合は、localhostを受信側コンピューターのIPアドレスに置き換えてください。より複雑なプロトコルを利用できない場合でも、このシンプルな方法は迅速なファイル転送に非常に役立ちます。

暗号化通信の実装

このステップでは、OpenSSLを使って暗号化を導入し、Netcatと組み合わせることで通信にセキュリティ層を追加します。ネットワーク経由でデータを送信する際、機密情報が第三者に傍受されたり、権限のない相手に読み取られたりするのを防ぐために、暗号化は不可欠です。

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

まず、送信者用スクリプトを作成します。このスクリプトは、メッセージの暗号化と送信を担当します。secure_sender.shという名前の新しいファイルを開いてください。

nano secure_sender.sh

ファイルに次の内容を追加してください(コピーして貼り付けても構いません)。

#!/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へ送信する
  • 暗号化には、セキュリティを高めるソルト、安全な送信のためのBase64エンコード、10,000回反復するPBKDF2鍵導出が使用される

Secure sender script example

Ctrl+X、続けてY、Enterキーの順に押して保存し、ファイルを終了します。スクリプトを実行可能にしてください。

chmod +x secure_sender.sh

次に、受信者用スクリプトを作成します。このスクリプトは、受信したメッセージを待ち受けて復号します。secure_receiver.shという名前の新しいファイルを開いてください。

nano secure_receiver.sh

ファイルに次の内容を追加してください。

#!/bin/bash

echo "Secure Receiver - Waiting for messages. Press Ctrl+C to exit."

while true; do
  encrypted=$(nc -l 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

この実験で使用するUbuntu 22.04環境では、OpenBSD Netcatの待ち受け構文はnc -l 12345です。ここで-lを使用する場合、-pは追加しないでください。

このスクリプトは、次の処理を行います。

  • ポート12345で受信データを継続的に待ち受ける
  • データを受信すると、OpenSSLに渡して復号する
  • 送信側と同じ暗号化パラメーターを使用して、メッセージを正しく復号する
  • 元の平文メッセージを表示する

Ctrl+X、続けてY、Enterキーの順に押して保存し、ファイルを終了します。スクリプトを実行可能にしてください。

chmod +x secure_receiver.sh

それでは、暗号化通信システムをテストします。受信者用と送信者用に、2つのターミナルウィンドウを同時に開いてください。

最初のターミナルで、受信者を起動します。

./secure_receiver.sh

受信者がメッセージを待機していることを示す表示が出ます。これで、受信者はポート12345で待ち受けています。

2つ目のターミナルで、送信者を起動します。

./secure_sender.sh

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

送信者側のターミナルでメッセージを入力し、Enterキーを押してください。暗号化されたメッセージが送信されます(送信中に暗号文が一時的に表示されるだけです)。

Encrypted Message

受信者側のターミナルには、送信者側で入力した内容と完全に一致する復号済みメッセージが表示されます。

送信者側のターミナルから続けてメッセージを送信できます。メッセージは自動的に暗号化、送信、受信、復号され、受信者側のターミナルに表示されます。これにより、安全な通信が一通り成立することを確認できます。

通信を終了するには、両方のターミナルでCtrl+Cを押してください。2つのスクリプトが安全に終了します。

この構成は、シンプルでありながら効果的な暗号化通信システムの例です。テストではlocalhostを使用していますが、同じ方法をネットワーク越しにも利用できます。メッセージは送信前に自動的に暗号化され、受信時に復号されるため、安全な通信経路を構築できます。ただし、実際の運用では、ハードコードされたパスワードよりも安全な鍵交換方式を使用する必要があります。

まとめ

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

また、OpenSSLを使った実装を通じて、ネットワーク通信における暗号化の重要性を確認しました。ここで身につけた基礎スキルは、より複雑なサイバーセキュリティ概念や安全な通信プロトコルを理解するための確かな出発点となります。