はじめに
を使用する最大のメリットの1つは、Linuxが提供する便利なユーティリティが豊富に存在することです。通常、ほとんどのプログラマーにとって、プログラム内蔵の機能だけで十分に仕事を行うことができます。つまり、ほとんどの場合、外部のプログラムやソフトウェアをダウンロードする必要はありません。組み込みのツールだけで十分な機能が提供されます。これらの便利な機能の1つに、netcatユーティリティがあります。
ネットワークツールの世界において、netcatは一種の強力すぎる武器のようなものです。複数の目的に使用できる、非常に汎用性の高いコマンドです。たとえば、このツール1つで、システムの接続を介してあらゆる種類のファイルやデータを監視、テスト、転送することができます。このガイドでは、これらすべての操作をVPS上でnetcatを使用して実行する方法を説明します。.
Netcatの確認
Netcatは通常、すべての最新のLinuxディストリビューションで利用可能です。つまり、すでにインストールされている可能性が高く、わざわざインストールする必要はありません。このチュートリアルでは、Ubuntu 12.04 VPSを使用します。以下の手順でチュートリアルに従って独自のUbuntuサーバーをインストールすることができます。Ubuntuには通常、BSD版のnetcatユーティリティが付属しています。別のバージョンを使用している場合は、動作が若干異なる場合があることに注意してください。
基本構文の確認
まず、netcatユーティリティで機能する一般的な構文について学びます。netcatは、TCP接続を開始することで操作できます。接続はリモートホストに対して開始する必要があります。netcatの基本構文は次のとおりです。
|
1 |
netcat [options] host port |
このコマンドは、リモートホストへのTCP接続を開始しようとします。どのホストに接続するかは、コマンドで指定するポート番号によって異なります。接続は暗号化されません。ご覧のとおり、このコマンドはtelnetコマンドと同様に動作します。
一方で、UDP接続を開始することもできます。TCPの代わりにUDPパケットを送信するには、-uオプションを使用する必要があります。以下のようになります。
|
1 |
netcat -u host port |
必要に応じて、ポートの範囲を指定することもできます。これを行うには、最初のポートと最後のポートの間にダッシュを入れます。例は次のとおりです。
|
1 |
netcat host startport-endport |
これにさらにフラグを追加することもできます。また、netcatとncは互換的に使用できることにも注意してください。どちらも同じコマンドを起動するため、お互いのエイリアスとなっています。
ポートスキャンにNetcatを使用する
まず、netcatの最も一般的な用途の1つを見ていきましょう。ポートスキャナーとして使用する方法を解説します。ほとんどの場合、nmapのようなツールを使用する方が適しています。しかし、単純なポートスキャンを実行するだけであれば、netcatが便利です。開いているポートを簡単に特定するのに役立ちます。
netcatをポートスキャナーとして使用するには、ポートの範囲を指定する必要があります。これには-zオプションを使用します。これにより、システムは接続を試みる代わりに、ポートの範囲をスキャンします。たとえば、ポート1からポート1000までをスキャンしたいとします。
|
1 |
netcat -z -v domain.com 1-1000 |
-zコマンドに加えて、-vオプションも使用しました。後者を使用すると、コマンドにより多くの情報を出力させることができます。つまり、より「詳細(verbose)」な情報を得ることができます。
返ってくる出力は以下のようになります。

出力には、個々のポートに関する多くの情報が表示されます。各ポートの接続ステータスがわかります。一方、IPアドレスがわかっている場合は、ドメイン名の代わりにIPアドレスを使用できます。これにより、プロセスが大幅に高速化されます。例は次のとおりです。
|
1 |
netcat -z -n -v 198.51.100.0 1-1000 |
システムがIPアドレスを解決するためにDNSを使用する必要がないことを示すために、-nフラグを使用しました。
通常、返されるメッセージは標準エラー出力に送信されます。結果をより迅速にフィルタリングするために、それらを標準出力にリダイレクトできます。これを行うには、bashの 2>&1 構文を使用します。その後、grepを使用して結果をフィルタリングします。これを例に適用してみましょう。
|
1 |
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded |
出力は次のようになります。
![]()
出力は、指定された範囲内で接続用に開いているのはポート22のみであることを示しています。ポート22は、偶然にも従来のSSHポートです。
Netcatを介した通信:どのように機能するのか?
次に、netcatを使用してTCPおよびUDPパケットを送信する方法を見ていきます。それだけでなく、さまざまなポートでパケットを受信することもできます。この機能により、2つのnetcatインスタンスを使用してクライアントとサーバーの関係を構築できます。最初に、クライアントとサーバーを決定します。初期設定の後、両方のクライアントが双方向にパケットを送信および受信できるようになります。
当然ながら、一方のシステムでnetcatを設定し、特定のポートで接続をリッスン(待機)させる必要があります。これを行うには、-lパラメータを使用します。これにより、次のように任意のポートを選択できます。
|
1 |
netcat -l 4444 |
これで、このマシンのTCPはポート4444で接続をリッスンするようになります。注意点として、非rootユーザーまたは一般ユーザーの場合、1000未満のポートにはアクセスできません。
次に、接続を確立するためにもう一方のマシンを設定する必要があります。同じポート番号を使用し、次のように特定のドメイン名を指定します。
|
1 |
netcat domain.com 4444 |
このコマンドを実行しても出力は表示されません。しかし、接続は確立されます。これは、どちらのサーバーからでも、もう一方のサーバーへメッセージの送信を開始できることを意味します。これを行うには、メッセージを入力してENTERキーを押すだけです。メッセージは両方の画面に表示されます。
完了したら、CTRL+Dを押してTCP接続を閉じることができます。
Netcatを使用してファイルを送信できますか?
次に、netcatを介してファイルを送信する方法を説明します。TCP接続を使用すると、メッセージだけでなく、他の種類のデータも送信できます。まず、接続をリッスンするマシンを1台選択する必要があります。ただし、コマンドに情報を直接入力する代わりに、次のようにファイルに配置します。
|
1 |
netcat -l 4444 > received_file |
もう一方のマシンで、新しいテキストファイルを作成する必要があります。使用するコマンドは次のとおりです。
|
1 |
echo "Hello, this is a file" > original_file |
ファイルを送信するには、リッスンしているコンピューターの接続への入力としてファイルを使用します。
|
1 |
netcat domain.com 4444 < original_file |
もう一方のコンピューターには、「receieved_file」という新しいファイルが表示されます。これには、入力したすべての情報が含まれています。
|
1 |
cat received_file |
このユーティリティを使用して、ファイル転送プログラムにすることができます。たとえば、ディレクトリの内容を転送したいとします。名前のないtarボールを作成し、それをシステムに転送してリモートディレクトリに展開することでこれを行います。もう一方のマシンでは、ファイルを受信する準備をする必要があります。ファイルを解凍して抽出する必要があることがわかっています。これを行うには、次のコマンドを実行します。
|
1 |
netcat -l 4444 | tar xzvf - |
ダッシュは、tarが標準入力で動作することを示しています。これは、最初の接続を確立したときの、最初のサーバー上のnetcatから送られてきます。
最後に、ディレクトリ全体の内容をtarボールにまとめ、次のようにnetcatを介して送信できます。
|
1 |
tar -czf - * | netcat domain.com 4444 |
tarコマンドのダッシュは、ディレクトリの内容をtarおよびzip(圧縮)するようにシステムに指示していることを示しています。また、結果を標準出力に書き込むようにも指示します。ファイルはTCP接続を介して相手側に送信されます。受信側のサーバーはそれを解凍し、現在のリモートディレクトリに保存します。
このように、netcatを介して他の種類のデータも転送できます。多くの人がddコマンドを使用してディスクをイメージ化し、転送しています。データやファイルを転送する別の方法については、当社のSFTP を使用してファイルを転送する際のセキュリティを確保する方法を示すチュートリアル.
Using Netcat as a Web Server
netcatのもう一つの便利な機能は、ページのテストに使用できることです。サーバーを使用して、次のようなHTMLファイルを作成するとします。
|
1 |
nano index.html |
ファイルに含まれるHTMLコードは次のとおりです。
|
1 2 3 4 5 6 7 8 9 10 |
<html> <head> <title>テストページ</title> </head> <body> <h1>レベル1ヘッダー</h1> <h2>副見出し</h2> <p>ここに通常のテキスト</p> </body> </html> |
これをファイルに入力し、保存して閉じます。通常、ポート80がデフォルトのWebポートです。通常の非rootユーザーとして、ポート8888を選択します。ページを1回だけ配信して確認したい場合は、次のコマンドを使用します。
|
1 |
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888 |
ファイルの内容を表示するには、ブラウザを開いて以下にアクセスしてください。
|
1 |
http://server_IP:8888 |
HTMLファイルでコーディングしたページが表示されます。

ページを取得すると、netcatの接続は閉じられます。つまり、ページを更新するとコンテンツではなくエラーが表示されます。これは、ページを1回だけ配信するように設定したためです。無制限に接続を受け入れ続けてページを表示したい場合は、別のコードを使用します。
|
1 |
while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done |
ここでは、最後のコマンドを無限ループで囲みました。ループを停止するには、CTRL-Cを入力するだけです。これで、最初の接続が閉じた後でも、ページとそのレンダリングを表示し続けることができます。ただし、これはnetcatユーティリティをWebサーバーとして使用して得られる最大の機能です。セキュリティが提供されないため、実際のWebサイトを配信するために使用しないでください。代わりに、次のチュートリアルを参照してください:NginxなどのWebサーバーソフトウェアをインストールする方法、またはApacheのチュートリアル.
結論
このチュートリアルでは、netcatユーティリティを取り上げ、Ubuntuにおけるツールとしての多用途性を探りました。上記のセクションで説明したように、通信、データ転送、およびページ配信の目的で使用できます。TCP/UDP接続を介したサーバー間の迅速なやり取りに最適です。多くの基本レベルの機能や診断に非常に役立つ機能です。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。