概要
業務で通信するアプリを作っていて、対向先のポートが開いてるのかどうかを事前に確認したいときって結構あります。
昔は telnet とかで接続確認していたりしたのですが、最近のディストロでは telnet が最初から入っていない環境も多いです。
そんなとき、 nc (netcat) コマンドがあったらサクッと確認できるので、知っておくと便利かもしれません。
ncのインストール (debianの場合)
入っていない場合はインストールが必要ですが、debian系の場合はちょっと注意が必要。
そのまま
$ sudo apt install -y netcat
という形でインストールしてしまうと、 traditional な netcat が入ります。これは古い版です。
今の版の netcat は nmap と共に配布されているものになるので、以下でインストールします。
$ sudo apt install -y ncat
(2024-07-15 追記)debian系の場合は netcat-openbsd
が良いみたいですね。(多くのディストリで標準扱い)
$ sudo apt install netcat-openbsd
コマンドラインに以下のように出ればオッケイです。
$ nc --version Ncat: Version 7.70 ( https://nmap.org/ncat )
$ nc -h 2>&1 | head -n 1 OpenBSD netcat (Debian patchlevel 1.219-1)
Redhat系の場合は、参考資料の方に記載しているQiitaの記事の方にインストールコマンドが記載されていますので、そちらを参照ください。
ポート確認する際に指定するオプション
nc コマンドに以下のオプションを指定して実行します。
$ nc -z -v -w 100ms addr port
-z
オプションは、Zero-I/Oモードで実行するという意味です。接続のステータスだけを報告してくれます。
-v
オプションは、Verboseモードで実行するという意味です。出力が冗長になります。
-w
オプションは、接続タイムアウトを指定するためのオプションです。上の例だと 100ms を指定しています。
試してみる
以下は自マシンで試したときの結果です。
ポートが開いていない場合
$ nc -zvw 100ms 127.0.0.1 9999 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connection refused.
Connection refused
って出力されました。つまり「開いていない」です。
ポート開ける
$ sudo nc -l -k -p 9999
-l
オプションは、Listenモードで実行するという意味です。
-k
オプションは、keep-openモードで実行するという意味です。これを指定していない場合だと、一回接続されるとコマンドが終了します。
-p
オプションは、ポート番号を指定するオプションです。
ポートが開いている場合
$ nc -zvw 100ms 127.0.0.1 9999 Ncat: Version 7.70 ( https://nmap.org/ncat ) Ncat: Connected to 127.0.0.1:9999. Ncat: 0 bytes sent, 0 bytes received in 0.03 seconds.
Connected to 127.0.0.1:9999
と表示されていますね。接続出来たのでポートが開いているということになります。
また、0 bytes sent, 0 bytes received
と表示されているので、何のパケットも送っていないのも確認できます。
参考資料
https://qiita.com/hana_shin/items/97e6c03ac5e5ed67ce38qiita.com
とても詳しく nc コマンドの使い方について記載してくださっている記事です。
勉強になりました。
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場