はじめに
このラボでは、ネットワークの「スイスアーミーナイフ」とも呼ばれる多機能なネットワークツール、Netcat を使用したネットワーク通信の基礎を学びます。この強力なユーティリティを使用して、TCP または UDP プロトコルを介したネットワーク接続でデータの読み書きを行う方法を習得します。
実践的な演習を通じて、クライアント・サーバー通信の基本を探り、シンプルなチャットシステムを作成し、ポートなどの重要なネットワーク概念を理解します。また、安全なデータ送信のための基本的な暗号化技術についても紹介します。
Netcat のインストール
秘密の通信を始める前に、適切なツールを準備する必要があります。Netcat は、さまざまなネットワークタスクを処理できることから、ネットワークツールの「スイスアーミーナイフ」と呼ばれています。ステップバイステップで Netcat をシステムにインストールしましょう。
- まず、ターミナルを開きます。デスクトップ上の Xfce Terminal を見つけて開いてください。ターミナルは、Netcat を操作するためのすべてのコマンドを入力する場所です。

注意: 無料ユーザーはインターネットに接続できないため、Netcat はラボ環境にプリインストールされています。リストの項目 4(Netcat がインストールされているか確認)にスキップしてください。Pro ユーザーにアップグレードすると、Netcat のインストールを自分で練習できます。
Pro ユーザーのみ
- ターミナルが開いたら、パッケージリストを更新する必要があります。これにより、最新バージョンの Netcat を確実に入手できます。次のコマンドを入力して Enter キーを押します。
sudo apt update
システムからパスワードを求められる場合があります。入力してください(入力中は文字が表示されません)。入力後、Enter キーを押します。sudo は、このコマンドを管理者権限で実行することを意味します。
- パッケージリストが最新になったので、Netcat をインストールしましょう。パッケージマネージャーが依存関係を自動的に処理します。次のコマンドを入力します。
sudo apt install netcat -y
-y フラグは、プロンプトに対して自動的に「yes」と答えるため、インストールがスムーズになります。パッケージをインストールすることが確実な場合に便利です。
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 の全二重通信機能を示しており、通信が同時に双方向に流れることを意味します。いくつかメッセージをやり取りして、どのように動作するか確認してみてください。
接続を終了するには、両方のターミナルで Ctrl+C を押します。このキーボードショートカットは、Netcat セッションをクリーンに閉じる割り込み信号を送信します。テストが終わったら、適切に接続を閉じることが重要です。
Netcat によるファイル転送
Netcat を使用した基本的なネットワーク通信の方法を学んだので、最も実用的なアプリケーションの 1 つである「システム間でのファイル転送」を探ってみましょう。このシンプルかつ強力な機能により、Netcat はシステム管理者やネットワークエンジニアにとって貴重なツールとなっています。
まず、転送するサンプルファイルを作成します。ターミナルで以下を入力してください。
cd ~/project echo "Top Secret: The cake recipe is actually a lie" > secret.txtこのコマンドは、プロジェクトディレクトリに移動し、例のメッセージを含む
secret.txtという新しいファイルを作成するという 2 つの処理を行います。>記号は、echoコマンドの出力をファイルにリダイレクトします。次に、ファイル転送の受信側を設定します。ターミナルウィンドウを開き、以下を実行します。
cd ~/project nc -l 12345 > received_secret.txtここで、
nc -l 12345は Netcat をポート 12345 でリッスンモードで開始します。>は、受信したデータをreceived_secret.txtという新しいファイルにリダイレクトします。このターミナルは、着信接続を静かに待機します。別のターミナルウィンドウで(最初のウィンドウは実行したまま)、ファイルを送信します。
cd ~/project nc localhost 12345 < secret.txtこのコマンドは、Netcat を使用してポート 12345 のリスナー(
localhostは「この同じコンピュータ」を意味します)に接続します。<記号は、secret.txtを入力として使用するように Netcat に指示し、ファイルの内容をネットワーク接続経由で効果的に送信します。両端が同じマシン上にあるため、転送は瞬時に行われます。転送が成功したか確認するために、受信したファイルの内容を確認します。
cat received_secret.txtcatコマンドはファイルの内容を表示します。これは元の秘密のメッセージと完全に一致しているはずです。

- おめでとうございます!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 キー導出が含まれる

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 キーを押します。暗号化されたメッセージが送信されるのが見えるはずです(送信中に一瞬だけ暗号化されたバージョンが表示されます)。

受信者ターミナルでは、送信者ターミナルで入力した通りに復号化されたメッセージが表示されるはずです。
送信者ターミナルからメッセージを送信し続けることができ、それらは自動的に暗号化され、送信され、受信側で復号化されます。これで完全なセキュア通信ループが実証されました。
通信を終了するには、両方のターミナルで Ctrl+C を押します。これにより、両方のスクリプトが安全に終了します。
この設定は、シンプルかつ効果的な暗号化通信システムを示しています。テストには localhost を使用しましたが、同じアプローチがネットワーク全体でも機能します。メッセージは送信前に自動的に暗号化され、受信時に復号化されるため、安全な通信チャネルが提供されます。実際のアプリケーションでは、ハードコードされたパスワードよりも安全な鍵交換方法を使用する必要があることに注意してください。
まとめ
このラボでは、Netcat を使用したネットワーク通信の基礎を学び、安全なデータ転送のための基本的な暗号化技術を探りました。Netcat のインストール、特定のポートを介した接続の確立、システム間でのファイル転送を実践しました。
この実践的な経験を通じて、OpenSSL を使用した実装により、ネットワーク通信における暗号化の重要性を実証しました。これらの基礎スキルは、より複雑なサイバーセキュリティの概念や安全な通信プロトコルを理解するための確固たる出発点となります。



