Netcatを使用してTCPおよびUDP接続を確立およびテストする方法
序章
Linuxは、ほとんどのディストリビューションで、すぐに使用できる成熟した便利なコマンドラインユーティリティを多数備えていることで知られています。 多くの場合、システム管理者は、追加のソフトウェアをインストールしなくても、組み込みのツールを使用して多くの作業を行うことができます。
このガイドでは、netcatユーティリティの使用方法について説明します。 この用途の広いコマンドは、ネットワーク接続を介したデータの監視、テスト、および送信に役立ちます。
Netcatは、ほとんどすべての最新のLinuxディストリビューションで利用できるはずです。 UbuntuにはnetcatのBSDバリアントが同梱されており、これがこのガイドで使用するものです。 他のバージョンでは、動作が異なる場合や、他のオプションが提供される場合があります。
一般的な構文
デフォルトでは、netcatはリモートホストへのTCP接続を開始することによって動作します。
最も基本的な構文は次のとおりです。
netcat [options] host port
これにより、指定されたポート番号で定義されたホストへのTCP接続が開始されます。 これは、古いLinuxtelnet
コマンドと同様に機能します。 接続は完全に暗号化されていないことに注意してください。
TCP接続を開始する代わりにUDPパケットを送信する場合は、-u
オプションを使用できます。
netcat -u host port
最初と最後の間にダッシュを配置することにより、ポートの範囲を指定できます。
netcat host startport-endport
これは通常、いくつかの追加フラグとともに使用されます。
ほとんどのシステムでは、netcat
またはnc
のいずれかを同じ意味で使用できます。 これらは同じコマンドのエイリアスです。
ポートスキャンにNetcatを使用する方法
netcatの最も一般的な用途の1つは、ポートスキャナーとしての使用です。
netcatはおそらくこの仕事に最も洗練されたツールではありませんが(ほとんどの場合、nmapの方が適しています)、単純なポートスキャンを実行して、開いているポートを簡単に識別できます。
これを行うには、上記のようにスキャンするポートの範囲を指定し、-z
オプションを指定して、接続を開始する代わりにスキャンを実行します。
たとえば、次のコマンドを発行することにより、1000までのすべてのポートをスキャンできます。
netcat -z -v domain.com 1-1000
-z
オプションに加えて、netcatにさらに詳細な情報を提供するように指示する-v
オプションも指定しました。
出力は次のようになります。
Outputnc: 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リダイレクトの記事を参照してください)。 標準エラーメッセージを標準出力に送信できます。これにより、結果を簡単にフィルタリングできます。
2>&1
bash構文を使用して、標準エラーを標準出力にリダイレクトします。 次に、結果をgrep
でフィルタリングします。
netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
OutputConnection to 198.51.100.0 22 port [tcp/*] succeeded!
ここでは、リモートコンピューターで1〜1000の範囲で開いている唯一のポートが、従来のSSHポートであるポート22であることがわかります。
Netcatを介して通信する方法
Netcatは、TCPおよびUDPパケットの送信に制限されていません。 また、ポートで接続とパケットをリッスンすることもできます。 これにより、クライアントサーバー関係でnetcatの2つのインスタンスを接続する機会が得られます。
どのコンピューターがサーバーで、どちらがクライアントであるかは、初期構成時に関連する区別にすぎません。 接続が確立された後、通信は両方向でまったく同じになります。
1台のマシンで、接続のために特定のポートをリッスンするようにnetcatに指示できます。 これを行うには、-l
パラメーターを指定し、ポートを選択します。
netcat -l 4444
これにより、netcatはポート4444でTCP接続をリッスンするようになります。 通常の( root 以外の)ユーザーとして、セキュリティ対策として、1000未満のポートを開くことはできません。
2番目のサーバーでは、選択したポート番号で最初のマシンに接続できます。 これは、以前に接続を確立していたのと同じ方法で行います。
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
接続を待機していたコンピューターで、他のコンピューターで入力したファイルの内容を含むreceived_file
という新しいファイルがあることがわかります。
cat received_file
OutputHello, this is a file
ご覧のとおり、物を配管することで、この接続を簡単に利用して、あらゆる種類のものを転送できます。
たとえば、名前のないtarballをオンザフライで作成し、リモートシステムに転送して、リモートディレクトリに解凍することで、ディレクトリ全体の内容を転送できます。
受信側では、次のように入力して解凍して抽出する必要のあるファイルが届くと予想できます。
netcat -l 4444 | tar xzvf -
末尾のダッシュ(-)は、tarが標準入力で動作することを意味します。標準入力は、接続が確立されたときにネットワークを介してnetcatからパイプされます。
転送したいディレクトリの内容があれば、tarballにパックして、netcatを介してリモートコンピュータに送信できます。
tar -czf - * | netcat domain.com 4444
今回、tarコマンドのダッシュは、現在のディレクトリの内容(*ワイルドカードで指定)をtarおよびzip形式で圧縮し、その結果を標準出力に書き込むことを意味します。
次に、これはTCP接続に直接書き込まれ、TCP接続はもう一方の端で受信され、リモートコンピューターの現在のディレクトリに解凍されます。
これは、あるコンピューターから別のコンピューターに、より複雑なデータを転送する一例にすぎません。 もう1つの一般的なアイデアは、dd
コマンドを使用して片側のディスクをイメージ化し、それをリモートコンピューターに転送することです。 ただし、ここではこれについては説明しません。
NetcatをシンプルなWebサーバーとして使用する方法
私たちは、ファイルを通信して転送するために接続をリッスンするようにnetcatを構成してきました。 これと同じ概念を使用して、netcatを非常に単純なWebサーバーとして操作できます。 これは、作成しているページをテストする場合に役立ちます。
まず、1台のサーバーで簡単なHTMLファイルを作成しましょう。
nano index.html
ファイルで使用できる簡単なHTMLを次に示します。
index.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を選択できます。
このページを1回だけ提供してレンダリング方法を確認する場合は、次のコマンドを実行できます。
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
と入力すると、ループを停止できます。
これにより、ブラウザでページがどのようにレンダリングされるかを確認できますが、それ以上の機能は提供されません。 実際のWebサイトを提供するためにこれを使用しないでください。 セキュリティはなく、リンクのような単純なものも正しく機能しません。
結論
これで、netcatを何に使用できるかについてかなり良いアイデアが得られるはずです。 これは、問題を診断し、ベースレベルの機能がTCP/UDP接続で正しく機能していることを確認するのに役立つ汎用性の高いツールです。
netcatを使用すると、さまざまなコンピューター間で非常に簡単に通信して、すばやく対話できます。 Netcatは、接続の形成から複雑さを取り除くことにより、コンピューター間のネットワーク相互作用を透過的にしようとします。