導入
Linuxは、ほとんどのディストリビューションに、成熟した便利なコマンドラインツールが多数搭載されていることで知られています。多くの場合、システム管理者は追加のソフトウェアをインストールすることなく、組み込みツールを使用して多くのタスクを実行できます。このガイドでは、netcatツールの使い方について説明します。この多機能コマンドは、ネットワーク接続を監視、テスト、およびデータ送信するのに役立ちます。netcatは、ほぼすべての最新のLinuxディストリビューションで利用できるはずです。UbuntuにはBSD版のnetcatが付属しており、このガイドでもこれを使用します。他のバージョンでは動作が異なる場合があります。また、他のオプションが用意されている場合もあります。.
一般的な指示
デフォルトでは、netcat はリモート ホストへの TCP 接続を確立することによって動作します。.
最も基本的なコマンドは次のとおりです。
netcat [options] host port指定されたポート番号で、定義されたホストへのTCP接続を開始しようとします。これは古いLinuxのtelnetコマンドに似ています。接続は完全に暗号化されていないことに注意してください。.
TCP 接続を開始する代わりに UDP パケットを送信する場合は、-u オプションを使用できます。
netcat -u host port最初と最後のポートの間にダッシュを入れることでポートの範囲を指定できます。
netcat host startport-endportこれは通常、いくつかの追加フラグとともに使用されます。.
ほとんどのシステムでは、netcat と nc は同じ意味で使用できます。これらは同じコマンドのエイリアスです。.
ポートスキャンにNetcatを使用するコマンド
netcatの最も一般的な用途の一つはポートスキャナです。netcatはおそらくこの用途に最も洗練されたツールではないものの(ほとんどの場合、nmapの方が適しています)、シンプルなポートスキャンを実行することで、開いているポートを簡単に特定できます。これを行うには、上記のようにスキャンするポートの範囲を指定し、接続を開始しようとする代わりにスキャンを実行する-zオプションを使用します。.
たとえば、次のコマンドを発行すると、1000 までのすべてのポートをスキャンできます。
netcat -z -v domain.com 1-1000-z オプションに加えて、netcat にさらに詳細な情報を提供するよう指示する -v オプションも指定しました。.
出力は次のようになります。
Output
nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
. . .
Connection to domain.com 22 port [tcp/ssh] succeeded!
. . .
ご覧の通り、このフォームには多くの情報が含まれており、各ポートのスキャンが成功したかどうかが分かります。ドメイン名を使用している場合は、このフォームを使用する必要があります。.
ただし、必要なIPアドレスが分かっている場合は、スキャンがはるかに高速になります。-nフラグを使用すると、DNSを使ってIPアドレスを解決する必要がないことを指定できます。
netcat -z -n -v 198.51.100.0 1-1000返されるメッセージは実際には標準エラーに送信されます(詳しくはI/Oリダイレクトの記事をご覧ください)。標準エラーメッセージを標準出力に送信することで、結果をより簡単にフィルタリングできます。.
bash構文 2>&1 を使用して標準エラーを標準出力にリダイレクトします。次に、grep で結果をフィルタリングします。
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeededOutput
Connection to 198.51.100.0 22 port [tcp/*] succeeded!ここで、リモート コンピューター上の 1 ~ 1000 の範囲で開いているポートは、従来の SSH ポートであるポート 22 のみであることがわかります。.
NetCat経由で通信する方法
NetcatはTCPおよびUDPパケットの送信に限定されません。ポートで接続とパケットをリッスンすることもできます。これにより、2つのNetcatインスタンスをクライアント/サーバー関係で接続することが可能になります。.
どのコンピュータがサーバーで、どのコンピュータがクライアントであるかは、初期設定時にのみ重要な区別となります。接続が確立されると、通信は双方向で全く同じになります。.
マシン上で、netcat に特定のポートで接続を待機するように指示することができます。これを行うには、-l パラメータを指定してポートを選択します。
netcat -l 4444これは、Netcat にポート 4444 で TCP 接続をリッスンするように指示します。通常の (非ルート) ユーザーの場合は、セキュリティ対策として 1000 未満のポートを開くことはできません。.
2台目のサーバーでは、選択したポート番号で1台目のマシンに接続できます。これは、以前と同じ方法で行います。
netcat domain.com 4444何も起こらなかったように見えますが、接続のどちら側からでもメッセージを送信でき、送信されたメッセージは双方で表示されます。.
メッセージを入力してEnterキーを押します。ローカル画面とリモート画面の両方に表示されます。逆の場合も同様です。.
メッセージの送信が完了したら、CTRL-D を押して TCP 接続を閉じることができます。.
Netcat経由でファイルを送信する方法
前の例を使えば、もっと便利なことができます。通常のTCP接続を作成しているので、ほぼあらゆるタイプのデータをその接続で転送できます。これはユーザーが入力したチャットメッセージに限定されません。この知識を活用して、netcatをファイル転送プログラムとして使うことができます。.
もう一度、接続をリッスンする接続エンドポイントを選択する必要があります。ただし、前の例のように情報を画面に表示するのではなく、すべての情報を直接ファイルに保存します。
netcat -l 4444 > received_file> このコマンドは、すべての netcat 出力を指定されたファイル名にリダイレクトします。.
2 台目のコンピューターで、次のように入力して単純なテキスト ファイルを作成します。
echo "Hello, this is a file" > original_fileこのファイルを、リスニングコンピュータとのnetcat接続の入力として使用できます。ファイルは対話的に入力したとおりに転送されます。
netcat domain.com 4444 < original_file接続を待機していたコンピューター上に、他のコンピューターで入力したファイルの内容を含む、receive_file という新しいファイルがあることがわかります。
cat received_fileOutput
Hello, this is a fileご覧のとおり、オブジェクトをリンクすることで、この接続を利用して様々なものを簡単に転送できます。例えば、名前のないtarballを作成し、それをリモートシステムに転送し、リモートディレクトリで解凍することで、ディレクトリ全体の内容を転送できます。.
ダウンロードの最後には、次のように入力して解凍して開く必要があるファイルが作成されます。
netcat -l 4444 | tar xzvf -末尾のダッシュ (-) は、tar が標準入力で動作し、netcat からの接続が確立されたときにネットワーク全体にパイプされることを意味します。.
転送したいディレクトリの内容と一緒に、それらを tarball にパッケージ化し、netcat 経由でリモート コンピュータに送信できます。
tar -czf - * | netcat domain.com 4444今回、tarコマンドのダッシュは、カレントディレクトリ(*で示されている)の内容をtarで圧縮し、結果を標準出力に書き込むことを意味します。そして、その結果はTCP接続を介して直接書き込まれ、接続先で受信され、リモートコンピュータのカレントディレクトリに解凍されます。これは、コンピュータ間でより複雑なデータ転送を行う一例にすぎません。もう一つの一般的な方法は、ddコマンドを使用してディスクの片側からイメージを作成し、それをリモートコンピュータに転送することです。ただし、ここでは詳しく説明しません。.
NetcatをシンプルなWebサーバーとして使用する方法
netcat は通信とファイル転送のために接続をリッスンするように設定しました。同じ考え方で、netcat を非常にシンプルなウェブサーバーとして使うこともできます。これは、作成したページのテストに役立ちます。.
まず、サーバー上に簡単な HTML ファイルを作成しましょう。
nano index.htmlファイルで使用できる簡単な HTML を次に示します。
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Level 1 header</h1>
<h2>Subheading</h2>
<p>Normal text here</p>
</body>
</html>ファイルを保存して閉じます。.
ルート権限がないと、このファイルをデフォルトの Web ポートであるポート 80 で提供することはできません。通常のユーザーとしてポート 8888 を選択できます。.
このページを一度だけ提供してレンダリング方法を確認したい場合は、次のコマンドを実行できます。
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888これで、ブラウザで次のサイトにアクセスしてコンテンツにアクセスできるようになりました。
http://server_IP:8888
これによりページが提供され、その後netcat接続が閉じられます。ページをリロードしようとすると、内容が失われます。
次のように、最後のコマンドを無限ループに入れることで、netcat にページを無期限にレンダリングさせることができます。
while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; doneこれにより、最初の接続が閉じられた後も接続を受け付け続けることができます。サーバー上でCtrl+Cを入力するとループを停止できます。これにより、ブラウザでページがどのようにレンダリングされるかを確認できますが、パフォーマンスはそれほど向上しません。実際のウェブサイトのレンダリングには使用しないでください。セキュリティが確保されず、リンクなどの単純な機能さえも正常に動作しなくなります。.
結果
ここまで読んでいただければ、netcat の用途についてご理解いただけたかと思います。netcat は、問題の診断や TCP/UDP 接続における基本レベルの機能が正常に動作しているかどうかを確認するのに役立つ、多用途のツールです。netcat を使用すると、異なるコンピュータ間で簡単に接続を確立し、迅速なやり取りが可能になります。netcat は、接続確立の複雑さを排除することで、コンピュータ間のネットワークやり取りを透過的に実現します。.










