Linux基礎コース(パート2)7/9
ncコマンドでサーバーと通信させよう!
こちらでは、Linuxのncコマンドについて解説をします。
ncコマンドとは?
ncコマンドは、netcatを省略したもので、TCPまたはUDPの通信を使ってコマンドラインからデータを送受信するコマンドです。
イメージとしてはクライアントとサーバーの間に入って繋いでくれます。サーバ側で既に利用中のポートに対して、クライアント側からちゃんと接続できるか疎通確認をするときなどに使用します。
ncコマンドのインストール
ncコマンドがインストールされていない場合はyumやaptのようなコマンドで簡単にインストールすることができます。
# Ubuntuの場合
sudo apt install netcat
# CentOSの場合
sudo yum install nmap-ncatIP
ncコマンドの基本的な使い方
IPアドレスとポート番号を指定して相手のサーバーに接続することが出来ます。
デフォルトでは TCPが適用されます。
nc サーバーのIPアドレス サーバーのポート番号
また、 -l をつけることで自分がサーバーとなって、相手からの接続を待ち受けることも出来ます。
-lの後に受信したいポート番号を指定します。
nc -l 受信したいポート番号
-uオプションをつけるとUDPでの通信をすることができます。
nc -ulp 受信したいポート番号
-lオプションを使用した場合、ポート番号の指定には -pオプションも必要です。このコマンドの意味は、「自分のサーバーの特定のポートにUDPで通信する」ということになります。
ncコマンドのオプション
ncコマンドのオプションを一部ご紹介します。今回ご紹介する他にもオプションは複数あるため、気になる方はnc -h
コマンドでヘルプを参照するか、ORACLEマニュアルページセクションをご覧ください。
オプション | 説明 |
---|---|
-u | UDPでの通信をすることができる |
-t | TCPでの通信をすることができる |
-l | 自らをサーバーとして、相手からの接続を待ち受ける |
-p | 待機するポート番号の指定をすることができる |
-v | 詳細を出力する |
-z | ポートスキャンを実行する |
ncコマンドとオプションの使用例
以下に、ncコマンドとオプションの使い方をご紹介します。今回ご紹介するのは、次の4項目になります。
- 相手先のサーバーのIPアドレスとポート番号を指定して通信する
- -t -uオプションを使用してTCPとUDPを指定する
- クライアントサーバーシステムの構築例
- -zオプションを使用してポートをスキャンの実行
相手先サーバーのIPアドレスとポート番号を指定する
実際にサーバーと通信する例を説明します。
はじめに、ターミナルでnc サーバーのIPアドレス
、サーバーのポート番号
を入力します。
nc 172.19.5.11 4001
今回はIPアドレスが172.19.5.11のサーバーに4001番ポートを通って通信して見ます。
実際に通信してみると
nc 172.19.5.11 4001
Great!
Great!とサーバーから返ってきました。つまりこのサーバーに4001番ポートを通って通信するとGreat!と返すと設定されていたことになります。
次に、今度はポートを設定せずに通信してみると
nc 172.19.5.11
no port[s] to connect to
no port[s] to connect to
「接続するポートがない」と表示されます。
つまり、通信する際はサーバーのどのポート番号を通るのか指定しなければいけないということです。
-t -uオプションを使用してTCPとUDPで通信する
同じサーバーの4002番ポートでTCPを使って通信します。
nc -t 172.19.5.11 4002
Yeah!
今度はYeah!と返ってきました。同じサーバーですが通信するポートが違うと返ってくる返事も違うことが分かります。
次は、同じサーバーの同じポートにUDPで通信して見ます。
nc -u 172.19.5.11 4002
今回は何も返ってきませんでした。これはサーバー側でどの通信方法で通信するのか設定されているためです。
つまり、同じ IP アドレスであっても TCPやUDPのポートが異なれば、提供されるサービスが異なります。
このことから172.19.5.11サーバーの4002番ポートはTCPでの通信が可能であることが分かります。
クライアントサーバーシステムを構築する
こちらではターミナルを二つ起動させてクライアントサーバーシステムを構築し、簡単なメッセージのやり取りを行います。
はじめにサーバー側で-lコマンドでクライアントからの接続を待ち受け、-pコマンドで指定したポートを解放します。
# サーバー側
nc -l -p 8000
次に、クライアント側からサーバー側のIPアドレスとポート番号を指定し、サーバーへ接続します。今回は自身の環境でターミナルを二つ起動しているため、IPアドレスはlocalhostのIPアドレスである127.0.0.1
を指定しています。
# クライアント側
nc 127.0.0.1 8000
サーバー側へメッセージを送ります。
# クライアント側
nc 127.0.0.1 8000
Hello!
サーバー側を確認してみるとメッセージを受信しているのが確認できます。
# サーバー側
nc -l -p 8000
Hello!
次にサーバー側からメッセージを送ります。
# サーバー側
nc -l -p 8000
Hello!
Hi!!!
クライアント側でメッセージを受信しているのが確認できます。
# クライアント側
nc 127.0.0.1 8000
Hello!
Hi!!!
このように、-lと-pオプションを使用する事で、簡単にサーバークライアントシステムを構築することができます。
-zオプションを使用してポートをスキャンの実行
ncコマンドでは、-zオプションを使用することでポートをスキャンすることができます。-zのみではスキャンするだけで詳細が表示されないため、-vオプションを使用して詳細情報も表示させます。
こちらのコマンドを実行する際は、ご自身の管理しているネットワークかつ管理しているサーバーに対して行うようにしてください。インターネット上にあるサーバーへ行った場合、通信が遮断される場合や不正アクセスとみなされる場合があります。
# 例
nc -zv サーバーのIPアドレス スキャンしたいポート番号の範囲
ポート番号1-5000番を指定して、以下のコマンドを実行します。
nc -zv 172.19.2.11 1-5000
cf7b447c-1028-4b6c-873b-75c82038d87f-1024-1.adNW2-0 [172.19.2.11] 4002 (?) open
cf7b447c-1028-4b6c-873b-75c82038d87f-1024-1.adNW2-0 [172.19.2.11] 4001 (?) open
4001番と4002番のポートが開いていることが分かります。このように、ncコマンドではオプションを指定することでポートをスキャンすることも可能です。
ポートスキャンについてもっと学習したい方は、セキュリティ基礎コースのNmapを使ってみよう!でハンズオンをしてみましょう。
https://envader.plus/course/3/scenario/1063
まとめ
ncコマンドはクライアントとサーバーの間に入ってお互いを繋ぐコマンドです。
他にも、様々な応用的な使い方があります。
- ncでwebに接続
- ncでwebサーバーを立てる
- ncをftpのように使う
- プロキシサーバーを立てる
ncコマンドはほかのコマンドと組み合わせたりして、主にセキュリティ関連の確認で利用されることが多いです。
今回は基礎的な部分のみの説明でしたが、他にもたくさんの使われ方があるので、ぜひ参考にしてください。
Linux体験コース【初学者向け】
Envaderでは他にも、エンジニアの基礎的スキルを身に付けられる学習コースを複数提供しています。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。