telnetコマンドでポート確認する方法と代わりのコマンド
「pingは通るのに、サーバーのサービスにつながらない」。そんなとき、昔からよく使われてきたのが telnet 相手 ポート番号 でポートにつながるかを試す方法です。ただ、今のWindowsには最初からtelnetが入っていません。この記事では、telnetでの確認方法と、インストールなしで使える代わりのコマンドを、実際に試した結果つきで説明します。
telnetとは
telnetは、ネットワークの向こうのコンピューターを文字で操作するための、古くからあるプロトコル(ポート23番)とコマンドです。通信が暗号化されず、パスワードもそのまま流れるので、リモート操作の用途では暗号化されたSSHに置き換わりました。
それでもtelnetのコマンドが使われ続けているのは、「指定したポートにTCPでつながるか」を手軽に試せるからです。HTTPSの443番、リモートデスクトップの3389番など、どのポートでも試せます。
telnetでポートにつながるか確かめる
telnet 203.0.113.10 443
- つながった場合:画面が真っ黒になり、カーソルが点滅したままになります。何も表示されませんが、これが接続できた状態です。終わるときは Ctrl+] を押してから
quitと入力します。 - つながらなかった場合:しばらく待ったあと、接続に失敗したというメッセージが出てコマンドが終わります。
「'telnet' は、内部コマンドまたは外部コマンド…として認識されていません。」と出たら
Windows 10・11では、telnetのクライアントは標準では入っていません。使うには、「Windowsの機能の有効化または無効化」で「Telnet Client」にチェックを入れるか、管理者のコマンドプロンプトで次を実行します。
dism /online /Enable-Feature /FeatureName:TelnetClient
会社のPCなどで機能を追加できない場合でも、次に紹介するPowerShellのコマンドなら、インストールなしで同じ確認ができます。
代わり①:PowerShellの Test-NetConnection
Test-NetConnection 203.0.113.10 -Port 443
結果の TcpTestSucceeded が True ならつながり、False ならつながりません。つながらないときは、「警告: TCP connect to (203.0.113.10 : 443) failed」のような表示も出ます。True/Falseだけ欲しいときは、-InformationLevel Quiet を付けます。
注意したいのは、つながらないときにとても時間がかかることがある点です。実際に試すと、次のようになりました。
| 試した相手 | 結果 | かかった時間 |
|---|---|---|
| Webサーバーの443番(開いている) | True | 約1秒 |
| 自分のPCの使っていないポート(拒否される) | False | 約2.6秒 |
| Webサーバーの81番(応答がない) | False | 約84秒 |
応答がない相手だと、Test-NetConnectionはIPv6とIPv4の全アドレスに順番に接続を試し、そのたびに待ち時間を使い切るためです。名前ではなくIPアドレスを1つ指定すると、待つ回数が減ります。
代わり②:待ち時間を決めて、すぐ結果を出す
何台ものサーバーを続けて調べるときは、待ち時間を自分で決められる次の書き方が便利です。2秒以内につながれば True、つながらなければ False を返します。
$c = New-Object System.Net.Sockets.TcpClient
$c.BeginConnect('203.0.113.10', 443, $null, $null).AsyncWaitHandle.WaitOne(2000) -and $c.Connected
$c.Close()
「すぐ失敗」か「待たされて失敗」かで原因を分ける
つながらなかったときは、どのくらいで失敗したかが手がかりになります。
| 失敗のしかた | 何が起きているか | 次に疑うところ |
|---|---|---|
| すぐ失敗する(数秒以内) | 相手まで届いたが、そのポートで待ち受けているサービスがないため断られた | サービスが止まっていないか、ポート番号が合っているか |
| 長く待たされて失敗する | 途中か相手のファイアウォールに黙って捨てられている、または相手がいない | ファイアウォールの許可設定、経路(tracert) |
断られたときの .NET のエラーは「対象のコンピューターによって拒否されたため、接続できませんでした。」(英語版では "actively refused it")で、これが「すぐ失敗」の典型です。リモートデスクトップ(3389番)がつながらないときの、この先の確かめ方は リモートデスクトップが接続できない時の確認方法 にまとめています。
LinuxやMacでは
LinuxやMacでは、nc -vz 203.0.113.10 443 がよく使われます。つながれば succeeded や open、断られれば refused のように表示されます(表示は nc の種類で少し違います)。nc が入っていない環境では、bashの機能を使って次のようにも確かめられます。
timeout 3 bash -c '</dev/tcp/203.0.113.10/443' && echo open || echo closed
よくある質問
Q. telnetは危険だと聞いたけど、ポートの確認に使っても大丈夫?
A. 危険なのは、telnetでサーバーにログインしてパスワードを送ることです。つながるかどうかを確かめて、すぐに閉じるだけなら問題ありません。ただし、つながった先でIDやパスワードを打ち込まないでください。
Q. pingは通るのに、ポートの確認だけ失敗するのは?
A. pingはポートを使わないので、IPアドレスまで届くことしか分かりません。ポートで失敗するなら、相手のサービスが止まっているか、ファイアウォールでそのポートが許可されていないかのどちらかです。どちらかは、上の「すぐ失敗か、待たされて失敗か」で見分けられます。pingで分かる範囲は pingの記事 を見てください。
Q. 自分のPCでどのポートが開いているかを知りたい。
A. 自分のPCが待ち受けているポートは、netstat -ano や Get-NetTCPConnection -State Listen で一覧できます。手順は 使用中のポート・開いているポートを確認する方法 にまとめています。
🔗 関連:ポート番号とは(一覧と確認方法) / pingの使い方と結果の見方 / tracertの使い方と結果の見方 / リモートデスクトップが接続できない時の確認方法