- 技術 💻
telnetコマンドの使い方|ポート確認・終了方法・エラー原文と対処
結論
telnetコマンドは telnet ホスト ポート と打ち、「Connected to」と出ればそのTCPポートに接続できています。終了は Ctrl+] を押してから quit です。ログインの用途には使わず、ポート確認と手でのやり取りの確認に使います。
この記事でわかること
- Connection refused・タイムアウト・No route to host の原文と、それぞれの原因・かかった時間
- HTTP・SMTP・Redis に telnet で手打ちした応答の実物
- Windows で有効にする方法(Microsoft 公式)と、nc・curl・Test-NetConnection との対応表
telnet は、相手のポートに TCP でつなぎ、打った文字をそのまま送り、返ってきた文字をそのまま表示する道具です。表示された1行目で、ポートの状態がほぼ分かります。
flowchart TD
A[telnet ホスト ポート] --> B{Connected to?}
B -->|はい| C[開いている]
B -->|いいえ| D{すぐ失敗?}
D -->|はい| E[相手の機械<br>を見る]
D -->|待たされた| F[FW・経路<br>を見る]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| telnet コマンドの書き方 | telnet ホスト ポート。ポートを省くと23番 |
書き方とオプション |
| telnet でポート確認する方法 | 「Connected to」が出れば開いている | ポート確認する方法 |
| telnet の終了方法 | Ctrl+] → quit(Windows は q) |
終了方法 |
| Connection refused の意味 | 相手まで届いたが、そのポートで待ち受けていない | エラー原文と原因 |
| 「Trying...」のまま止まる | 途中で捨てられている。手元では134秒でタイムアウト | エラー原文と原因 |
| Windows で telnet が使えない | 標準では入っていない。DISM で Telnet Client を有効にする | Windows・Mac・Linux |
| telnet の代わり | nc -zv・curl telnet://・Test-NetConnection -Port |
対応表 |
| telnet と SSH の違い | telnet は暗号化しない。ログインには SSH を使う | SSH との違い |
確認環境:Ubuntu 24.04.5 LTS(カーネル 6.18)に apt で telnet パッケージ(中身は GNU inetutils telnet 2.5)と tcpdump 4.99.4 を入れ、127.0.0.1 に Python 3.13.18 の HTTP サーバー(HTTP/1.0 と HTTP/1.1 の2種類・TLS つき1種類)、受け取るだけで外へは送らない自作の SMTP 風サーバー、Redis 7.0.15(パスワードなし・あり)を立てて、telnet で接続し手でコマンドを打ちました。接続できないときの表示は、ip netns で作った2つのネットワーク空間の間に、netns の中だけの iptables で DROP・REJECT を置いて再現し、所要時間を測りました。比較には OpenBSD netcat 1.226、curl 8.5.0、OpenSSL 3.0.13、bash の /dev/tcp を使っています。telnet サーバー(telnetd)は立てていません。Windows の有効化と Windows 版 telnet の操作は Microsoft Learn、Mac は Homebrew の公式ページ、プロトコルは RFC 854 と IANA の一覧で確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「telnetコマンドの使い方|ポート確認・終了方法・エラー原文と対処」
telnetコマンドとは(何に使うか)
この節では、telnet が何をする道具で、今どんな場面で使われているのかが分かります。
telnet は、もともと離れたコンピューターにログインして操作するためのプロトコル(TELNET)と、その接続に使うコマンドの名前です。 RFC 854 は、遠隔端末として使うときのサーバーのポートを23番と決めています。
今は、ログインには暗号化する SSH を使います。それでも telnet コマンドが調べられるのは、ポート番号を指定すれば、どのTCPポートにもつないで、文字のやり取りをそのまま見られるからです。
1ポートの疎通確認
「DB の5432番につながるか」「メールの25番が開いているか」を、相手のソフトを入れずに確かめる。
2文字で話すプロトコルの確認
HTTP・SMTP・Redis のように、1行ずつ文字で命令する相手に、手で打って応答を見る。
3以前の機器の設定
ネットワーク機器や制御装置で、今も telnet で操作する機器がある。閉じたネットワークの中に限る。
ポート確認に使うときの telnet は、TELNET のプロトコルとしてではなく、「打った文字を TCP で送るだけの道具」として動いています。手元で23番以外につないだときは、telnet の制御の文字は1バイトも送られていませんでした(「SSHとの違い」の節で実物を示します)。
telnetコマンドの書き方とオプション
この節では、telnet コマンドの書式と、よく使うオプションが分かります。
telnet ホスト名またはIPアドレス ポート番号
telnet 127.0.0.1 6379 # Redis の標準ポート
telnet localhost 80 # ホスト名でもよい
telnet 127.0.0.1 http # ポートはサービス名でも書ける(/etc/services の名前)
telnet # 引数なし:telnet> のプロンプトになる
ポートを省くと23番(TELNET)につなぎます。 ポート確認のときは、必ずポート番号まで書きます。手元で telnet 127.0.0.1 とだけ打つと、23番で待ち受けていないため Connection refused になりました。
| オプション | 意味(inetutils 2.5 の --help) | 使う場面 |
|---|---|---|
-4・-6 |
IPv4 だけ・IPv6 だけを使う | localhost が ::1 と 127.0.0.1 の両方を返すとき |
-e 文字 |
エスケープ文字(既定は Ctrl+])を変える | Ctrl+] が別のソフトに取られるとき |
-E |
エスケープ文字を使わない | 送る中身に 0x1d が含まれるとき |
-b アドレス |
送信元のアドレスを指定する | NIC が複数ある機械 |
-d・-n ファイル |
デバッグ表示・やり取りの記録 | うまく話せないときの調査 |
Windows の telnet はスラッシュで始まる別の書式です。Microsoft Learn の書式は telnet [/a] [/e <escapechar>] [/f <filename>] [/l <username>] [/t {vt100 | vt52 | ansi | vtnt}] [<host> [<port>]] で、/f を付けるとやり取りをファイルに残せます。ポートの既定は、どちらも TCP の23番です。
telnetでポート確認する方法(成功と失敗の見分け方)
この節では、telnet でポートが開いているかを確かめる手順と、表示の読み方が分かります。
「Trying …」の次に「Connected to …」が出れば、そのポートへの TCP 接続は成功しています。 相手のソフトが何も話さないと、画面はそのまま止まって見えますが、それが成功の状態です。
$ telnet 127.0.0.1 45625
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
開いていないポートでは、すぐに次の1行で終わりました。
$ telnet 127.0.0.1 52531
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
ポート番号まで書いて打つ
telnet db.example.internal 5432 のように、ホストとポートを並べる。ホスト名で失敗したら IP アドレスでも試し、名前解決の問題かを分ける。
1行目の表示を読む
Connected to なら開いている。Connection refused・No route to host・Trying のまま、で原因の場所が変わる(次の節)。
必要なら1行打って応答を見る
開いていても、相手が期待するソフトとは限らない。HTTP なら HEAD / HTTP/1.0、Redis なら PING を打つ。
Ctrl+] → quit で抜ける
相手が切らない限り、接続は続く。終わったら自分で閉じる。
- 確かめているのは「自分の機械から、そのポートまで届くか」だけです。 別のサーバーからは届かない、ということは普通にあります。確かめたい経路の上にある機械で打ちます。
- telnet が確かめられるのは TCP だけです。DNS の53番や NTP の123番など UDP のポートは、telnet では確かめられません。
telnetで接続できない時のエラー原文と原因(Connection refused・タイムアウト)
この節では、telnet がつながらないときの表示ごとの原因と、表示が出るまでの時間が分かります。
ip netns で作ったネットワーク空間 A(10.25.0.1)から、空間 B(10.25.0.2)へ telnet しました。B の中にだけ、ポートごとに次の規則を置いています。
# すべて netns「t25b」の中だけに設定(ホストの iptables は変えていない)
ip netns exec t25b iptables -A INPUT -p tcp --dport 8443 -j DROP
ip netns exec t25b iptables -A INPUT -p tcp --dport 8444 -j REJECT --reject-with icmp-host-unreachable
ip netns exec t25b iptables -A INPUT -p tcp --dport 8445 -j REJECT --reject-with tcp-reset
ip netns exec t25b iptables -A INPUT -p tcp --dport 8446 -j REJECT
| 状況 | telnet の表示(原文) | 表示までの時間 |
|---|---|---|
| 待ち受けあり(80番) | Connected to 10.25.0.2. | すぐ |
| 待ち受けなし・RST で拒否 | Unable to connect to remote host: Connection refused | 0.02秒 |
| REJECT(ICMP port unreachable) | Unable to connect to remote host: Connection refused | 1.04秒 |
| REJECT(ICMP host unreachable) | Unable to connect to remote host: No route to host | 1.03秒 |
| 同じネットワークに相手がいない(10.25.0.99) | Unable to connect to remote host: No route to host | 3.07秒 |
| 経路が無い(10.99.0.1) | Unable to connect to remote host: Network is unreachable | 0.03秒 |
| DROP(返事なしで捨てる) | Unable to connect to remote host: Connection timed out | 134.34秒 |
| ホスト名が引けない | Server lookup failure: no-such-host.invalid:80, Name or service not known | すぐ |
| ポート番号が範囲外(99999) | Port number 99999 is out of range. | すぐ |
タイムアウトのとき、裏で何が起きているか
DROP されたポートへの接続を、B の側の tcpdump で見ました。同じ SYN(接続の申し込み)を、返事が来ないまま送り直しています。
19:21:13.066687 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:14.093808 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:15.113811 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:16.141832 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:17.161831 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:18.185910 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
19:21:20.205831 IP 10.25.0.1.58048 > 10.25.0.2.8443: Flags [S], seq 2114779423, ...
このカーネル(6.18)では net.ipv4.tcp_syn_retries=6、tcp_syn_linear_timeouts=4 で、最初の数回は1秒おき、その後は間隔を倍にしながら送り直し、telnet は134.34秒後に Connection timed out を出しました。この時間は OS とその設定で変わります。 待ちたくないときは、後の節の nc -w 3 や curl --connect-timeout 3 を使うと、3秒で打ち切れました。
待ち受けが無いポートは、相手の OS が RST(リセット)を返すので、すぐ Connection refused になります。RST が返ったときの記録です。
19:20:13.065091 IP 10.25.0.1.57320 > 10.25.0.2.8445: Flags [S], seq 3176494645, ...
19:20:13.065104 IP 10.25.0.2.8445 > 10.25.0.1.57320: Flags [R.], seq 0, ack 3176494646, win 0, length 0
すぐ失敗する(相手まで届いている)
Connection refused:ソフトが止まっている・ポート違い・127.0.0.1 だけで待ち受け
見る場所:相手の機械の ss -ltn とソフトのログ
待たされる(途中で消えている)
Trying のまま → timed out:ファイアウォールの DROP・セキュリティグループ・経路
見る場所:途中の FW・クラウドの許可設定・ルーティング
Connection refused とタイムアウトの違いをアプリのエラーから読む方法は、関連記事「Connection refused・Read timed outの違いと直し方」で扱っています。
telnetの終了方法(Ctrl+]→quit)とコマンドモード
この節では、telnet の抜け方と、Ctrl+] で入る「telnet>」の画面の使い方が分かります。
Ctrl キーを押しながら ] を押すと、接続を保ったまま「telnet>」のプロンプトに切り替わります。そこで quit と打つと終了します。 接続直後の「Escape character is '^]'.」が、この Ctrl+] のことです。
$ telnet 127.0.0.1 45628
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.1
Host: 127.0.0.1
HTTP/1.1 200 OK
...
<!doctype html><title>t25</title><p>hello from 127.0.0.1</p>
^]
telnet> quit
Connection closed.
| やりたいこと | Linux・Mac(telnet>) | Windows(Microsoft Telnet>) |
|---|---|---|
| コマンドモードに入る | Ctrl+] | Ctrl+](既定のエスケープ文字) |
| 終了する | quit(q) |
q(quit) |
| 接続だけ閉じる | close |
c(close) |
| 接続に戻る | 何か1つ命令を打つと戻る | 何も打たずに Enter |
| 状態を見る | status |
— |
手元で引数なしの telnet から open でつなぎ、status を見たときの表示です。inetutils の telnet は、telnet> で命令を1つ実行すると、すぐ接続に戻りました。 続けて打った close は telnet ではなく Redis に送られ、Redis のエラーになっています。
$ telnet
telnet> open 127.0.0.1 45627
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
PING
+PONG
^]
telnet> status
Connected to 127.0.0.1.
Operating in obsolete linemode
Local character echo
Escape character is '^]'.
close
-ERR unknown command 'close', with args beginning with:
- 手元では、接続中に Ctrl+C を2回押しても telnet は終わらず、画面に
^C^Cと出ただけでした。止まって見えたら Ctrl+] を試します。 - 相手が接続を切ると「Connection closed by foreign host.」と出て、telnet は自分で終わります。
- キーボードの配列や、間に挟まるソフトの都合で Ctrl+] が打てないときは、
-e(Windows は/e)でエスケープ文字を別の文字に変えられます。
telnetでHTTPリクエストを手で送る(GET・HEAD)
この節では、telnet で Web サーバーに HTTP のリクエストを手で打ち、応答のヘッダーを読む方法が分かります。
HTTP/1.1 では Host ヘッダーが必須で、ヘッダーの終わりに空行(何も打たずに Enter)が要ります。 空行を打つまで、サーバーは返事をしません。
$ telnet 127.0.0.1 45625
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.1
Host: 127.0.0.1
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.18
Date: Thu, 29 Oct 2026 10:18:30 GMT
Content-type: text/html
Content-Length: 61
Last-Modified: Thu, 29 Oct 2026 10:18:17 GMT
<!doctype html><title>t25</title><p>hello from 127.0.0.1</p>
Connection closed by foreign host.
本文が要らないときは HEAD を使います。無いパスでは 404 が返りました。
HEAD /nothing HTTP/1.0
HTTP/1.0 404 File not found
Server: SimpleHTTP/0.6 Python/3.13.18
Connection: close
Content-Type: text/html;charset=utf-8
Content-Length: 335
Connection closed by foreign host.
| サーバーの作り | 応答のあと | 手元の結果 |
|---|---|---|
| HTTP/1.0 で返すサーバー | サーバーが切る | Connection closed by foreign host. で自動で終了 |
| HTTP/1.1 で返すサーバー(keep-alive) | 接続が残る | 次のリクエストを待つ。Ctrl+] → quit で抜けた |
| HTTPS(TLS)のポート | 平文は読めない | 1行目を打った時点で切られた(次の次の節) |
同じ確認を毎回するなら、curl -v が手早く、ヘッダーの送受信も見えます。curl の使い方は関連記事で扱っていますが、telnet は「サーバーが受け取った生の文字に何を返すか」を1行ずつ確かめられるのが違いです。
telnetでSMTP・Redisの応答を確かめる
この節では、メールサーバー(SMTP)と Redis に telnet で手打ちしたときのやり取りと、応答の読み方が分かります。
SMTP(メール送信)の会話
SMTP は、接続するとサーバーから先に「220」の1行目が来ます。受け取るだけで外へは送らない自作のサーバーに、Microsoft Learn の Exchange の手順と同じ順番で打ちました。
$ telnet 127.0.0.1 45626
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mock.local ESMTP t25-mock ready
EHLO client.example.com
250-mock.local Hello
250-SIZE 10240000
250 8BITMIME
MAIL FROM:<dev@example.com>
250 2.1.0 Ok
RCPT TO:<someone@example.org>
554 5.7.1 Relay access denied
RCPT TO:<test@example.com>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: telnet test
hello
.
250 2.0.0 Ok: queued as T25-0001 (not delivered: mock)
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
- 先頭の3桁で結果を読みます。 2xx は成功、3xx(354)は続きを送れ、5xx は失敗です。
250-のようにハイフンが付く行は、まだ続きがある印です。 - 本文の終わりは、1行に「.」だけを打ちます。
- 実際のメールサーバーに打つと、本当にメールが届きます。宛先は自分のアドレスにし、許可された自分のサーバーだけで試します。手元では外部に送らないモックだけを使いました。
Redis の会話
Redis は、1行に1つのコマンドを打つ「インラインコマンド」を受け付けます。redis-cli が無い機械でも、telnet で応答を確かめられます。
$ telnet 127.0.0.1 45627
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
PING
+PONG
SET greeting "hello telnet"
+OK
GET greeting
$12
hello telnet
INCR counter
:1
KEYS *
*2
$8
greeting
$7
counter
HELLO_WORLD
-ERR unknown command 'HELLO_WORLD', with args beginning with:
QUIT
+OK
Connection closed by foreign host.
パスワードを設定した Redis では、認証の前に打ったコマンドが断られました。
GET greeting
-NOAUTH Authentication required.
AUTH wrong
-WRONGPASS invalid username-password pair or user is disabled.
AUTH t25-secret
+OK
| 行の先頭 | Redis の意味 | 手元の例 |
|---|---|---|
+ |
成功(短い文字列) | +PONG・+OK |
- |
エラー | -NOAUTH・-WRONGPASS・-ERR unknown command |
: |
整数 | :1(INCR の結果) |
$ |
次の行の文字列のバイト数 | $12 → hello telnet |
* |
配列の要素数 | *2(KEYS の結果が2件) |
AUTH のパスワードは、telnet では暗号化されずにネットワークを流れます。 手で打つのは、自分の機械の中か、閉じた検証用のネットワークに限ります。
「Connected」なのに使えない2つのケース
この節では、telnet でつながったのにアプリからは使えない、またはその逆になる典型を、実際の結果で示します。
HTTPS(TLS)のポートに平文を打った
TLS で待ち受けるポートにも、TCP の接続は成功します。ところが平文で1行打つと、サーバーは TLS の始まりではないと判断して接続を切りました。
$ telnet 127.0.0.1 52532
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.1
Connection closed by foreign host.
「Connected」は「ポートが開いている」だけを意味し、「中身が正しく話せる」ことまでは示しません。 TLS のポートで中身まで確かめるには openssl s_client を使います。同じポートに送ると、200 OK が返りました。
$ printf 'GET / HTTP/1.0\r\n\r\n' | openssl s_client -connect 127.0.0.1:52532 -quiet
depth=0 CN = 127.0.0.1
verify error:num=18:self-signed certificate
verify return:1
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.18
サーバーが 127.0.0.1 だけで待ち受けていた
netns B の中で、HTTP サーバーを 127.0.0.1:8080 で起動しました。B の中から打つとつながり、A から B のアドレスに打つと Connection refused でした。
B の中の ss -ltn
LISTEN 0 5 10.25.0.2:80 0.0.0.0:*
LISTEN 0 5 127.0.0.1:8080 0.0.0.0:*
A から:telnet 10.25.0.2 8080 → telnet: Unable to connect to remote host: Connection refused
B から:telnet 127.0.0.1 8080 → Connected to 127.0.0.1.
サーバーの上で telnet 127.0.0.1 が通っても、外から通るとは限りません。 待ち受けのアドレスが 127.0.0.1 なら、外からは必ず断られます。外から使うソフトは 0.0.0.0(すべてのアドレス)か、そのサーバーの IP アドレスで待ち受けるよう設定します。
確かめる場所
見分ける問い:「その経路で打ったか」
ファイアウォールの調べ方
見分ける問い:「refused か、待たされたか」
Windowsでtelnetを有効にする方法(Mac・Linuxのインストールも)
この節では、Windows で telnet クライアントを使えるようにする方法を Microsoft の公式ドキュメントの範囲で、Mac と Linux の入れ方とあわせて示します。
Windows の telnet クライアント(Telnet Client)は、標準では入っていません。 Microsoft Learn は、Windows 7・Windows Server 2008 などには含まれているが、セキュリティ上の理由で既定ではインストールされない、と説明しています。Windows のコマンドの解説ページにも、このコマンドを使う前に telnet クライアントを入れる必要がある、と書かれています。
管理者としてコマンドプロンプトを開く
機能の追加は、管理者の権限で行います。会社の PC は、機能の追加が管理者に止められていることがあります。
DISM で Telnet Client を有効にする
dism /online /Enable-Feature /FeatureName:TelnetClient と打つ。Microsoft Learn の記事で示されているコマンドです。
ポートを確かめる
telnet 10.1.1.1 80 のように、ホストとポートを並べて打つ。抜けるときは Ctrl+] で「Microsoft Telnet>」を出し、q。
使い終わったら無効にする
dism /online /Disable-Feature /FeatureName:TelnetClient で外す。同じ記事に載っている手順です。
- 画面から入れる手順:Microsoft Learn の「Install Telnet Client」(Windows 7・Windows Vista 向けとして書かれたページ)では、Control Panel → Programs → Turn Windows features on or off → Telnet Client を選んで OK、です。Windows 10・11 での画面の名前は、Microsoft の文書で確かめられた範囲に無いため、本記事では書いていません。
- PowerShell の場合:DISM の PowerShell 版は
Enable-WindowsOptionalFeature -Online -FeatureName 機能名です(Microsoft Learn)。機能名はGet-WindowsOptionalFeatureで調べられると書かれています。 - Windows での失敗の表示:Microsoft Learn(Windows Server 2008 の文書)には「could not open a connection to host on port 23」という失敗の文言と、ポート番号の違い・サーバー側が待ち受けていないことが原因になる、という説明があります。
Mac・Linux
| OS | 入れ方 | 確かめた方法 |
|---|---|---|
| Ubuntu・Debian | sudo apt install telnet |
手元で実行。Ubuntu 24.04 では inetutils-telnet が一緒に入った |
| Mac(Homebrew) | brew install telnet |
Homebrew の公式の formula ページ(説明は「User interface to the TELNET protocol」) |
| Windows | DISM で TelnetClient を有効化 | Microsoft Learn |
Ubuntu 24.04 で apt install telnet を実行すると、telnet パッケージ(0.17+2.5-3ubuntu4.2)と、実体の inetutils-telnet(2:2.5-3ubuntu4.2)が入りました。/usr/bin/telnet は alternatives を通して /usr/bin/inetutils-telnet を指しています。入れるのはクライアントだけで、telnetd(サーバー)は入れません。
telnetが無いとき:nc・curl・Test-NetConnectionとの対応表
この節では、telnet を入れられない環境で、同じ確認をする別のコマンドが分かります。
ポートが開いているかだけを見るなら、Linux・Mac は nc -zv、Windows は Test-NetConnection -Port が手早く、結果を終了コードや True/False で受け取れます。
| やりたいこと | telnet | 代わりのコマンド |
|---|---|---|
| ポートが開いているか | telnet ホスト ポート |
nc -zv ホスト ポート |
| 待つ時間を決める | できない(OS 任せ) | nc -zv -w 3・curl --connect-timeout 3 |
| 手で打って応答を見る | そのまま打つ | nc ホスト ポート |
| 文字列を流して結果を受け取る | パイプは改行に注意(後の節) | printf '…' | nc・curl telnet:// |
| Windows で確かめる | Telnet Client を有効化 | Test-NetConnection ホスト -Port 443 |
| TLS の中身まで確かめる | できない | openssl s_client -connect ホスト:443 |
| 何も入っていない Linux | — | bash -c 'echo > /dev/tcp/ホスト/ポート' |
手元で実行した結果です。
$ nc -zv 127.0.0.1 45625
Connection to 127.0.0.1 45625 port [tcp/*] succeeded!
$ nc -zv 127.0.0.1 52531
nc: connect to 127.0.0.1 port 52531 (tcp) failed: Connection refused ← 終了コード 1
$ nc -zv -w 3 10.25.0.2 8443 # DROP されるポート
nc: connect to 10.25.0.2 port 8443 (tcp) timed out: Operation now in progress ← 3.016秒
$ curl --connect-timeout 3 telnet://10.25.0.2:8443 < /dev/null
curl: (28) Failed to connect to 10.25.0.2 port 8443 after 3002 ms: Timeout was reached
$ curl telnet://127.0.0.1:52531
curl: (7) Failed to connect to 127.0.0.1 port 52531 after 0 ms: Couldn't connect to server
$ printf 'PING\r\nQUIT\r\n' | nc 127.0.0.1 45627
+PONG
+OK
$ bash -c 'echo > /dev/tcp/127.0.0.1/52531'
bash: connect: Connection refused
bash: line 1: /dev/tcp/127.0.0.1/52531: Connection refused
Windows の Test-NetConnection は、-Port に TCP のポート番号を渡すと、結果の TcpTestSucceeded が True か False になります。-InformationLevel Quiet を付けると、成否だけが返ります(Microsoft Learn)。PowerShell と bash のコマンドの対応は、関連記事「Linuxネットワークコマンド一覧|ip/ss/ncで障害切り分け」でも扱っています。
スクリプトでtelnetを使うときの注意(改行とCR NUL)
この節では、telnet にパイプでコマンドを流すと失敗する理由を、送られたバイトの実物で示します。
telnet にパイプで \r\n を流すと、telnet は CR の後ろに NUL を足して送ります。 受け手の nc で、届いたバイトをそのまま保存して見ました。
$ { printf 'SET piped yes\r\n'; sleep 1; } | telnet 127.0.0.1 52533
(nc が受け取ったバイト)
S E T p i p e d y e s \r \0 \r \n
$ { printf 'SET piped yes\n'; sleep 1; } | telnet 127.0.0.1 52533
(nc が受け取ったバイト)
S E T p i p e d y e s \r \n
RFC 854 は、「改行ではなく CR だけを送りたいときは CR NUL を使う」と決めています。telnet は流れてきた \r を「CR だけ」と受け取り、\r\0 にしてから、次の \n を \r\n にしていました。その結果、Redis に \r\n で流したコマンドは効かず、\n だけで流すと効きました。
$ { printf 'SET piped yes\nGET piped\n'; sleep 1; } | telnet 127.0.0.1 45627
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
+OK
$3
yes
Connection closed by foreign host.
- 1パイプで流すなら改行は \n だけtelnet が CR LF に直して送る。\r\n で流すと CR NUL が混ざる
- 2入力の後ろに sleep を置く入力が終わると telnet は閉じる。応答を待つ時間を残す
- 3成否の判定は終了コードに頼らない手元では refused で 1、接続してから閉じたときは 0 だった
- 4スクリプトなら nc か curl に替える待つ時間を -w・--connect-timeout で決められる
telnetとSSHの違い(平文で流れる実物)
この節では、telnet と SSH の違いと、telnet のやり取りがネットワーク上でどう見えるかが分かります。
telnet は送る文字も返る文字も暗号化しません。 netns A から B の80番に GET / HTTP/1.0 を打ったとき、B の側の tcpdump には、打った文字がそのまま見えました。1行ごとに1つのパケットで送られています。
19:20:12.724330 IP 10.25.0.1.52258 > 10.25.0.2.80: Flags [P.], seq 1:17, ack 1, ... length 16: HTTP: GET
....GET / HTTP/1.0
19:20:13.027836 IP 10.25.0.2.80 > 10.25.0.1.52258: Flags [P.], seq 1:187, ack 19, ... length 186: HTTP:
....HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.18
同じことが、telnet でログインしたときのユーザー名とパスワードにも起きます。ログインや管理の操作には SSH を使います。
| telnet | SSH | |
|---|---|---|
| 標準のポート | 23 | 22 |
| 通信の暗号化 | しない(打った文字がそのまま流れる) | する |
| 相手の確認 | しない | ホスト鍵で確かめる |
| ログイン・管理 | 使わない | 使う(鍵認証) |
| ポート確認・手打ちの確認 | 使える | 向かない(相手と SSH で話す前提) |
23番につないだときだけ、telnet は制御の文字を送る
B の23番で nc を待たせ、telnet でつないで hello と打ったとき、nc に届いたバイトです(telnetd ではなく、受け取って保存するだけの nc)。
ff fd 26 ff fb 26 ff fd 03 ff fb 18 ff fb 1f ff fb 20
ff fb 21 ff fb 22 ff fb 27 ff fd 05 68 65 6c 6c 6f 0d 0a
ff は IAC(次が命令である印)、fb は WILL(自分は使える)、fd は DO(相手に使ってほしい)です(RFC 854)。後ろの番号は IANA の一覧で、03 Suppress Go Ahead、18(24)Terminal Type、1f(31)Negotiate About Window Size、22(34)Linemode、26(38)Encryption Option などでした。80番など23番以外につないだときは、この申し出は送られず、打った文字だけが送られていました。だからこそ、telnet は他のプロトコルの確認に使えます。
SSH の接続・鍵・ポートの指定は、関連記事「ssh コマンドの使い方まとめ|鍵・ポート指定・config・接続エラー対処」で扱っています。
telnetのよくあるエラー・つまずきと判断表
この節では、telnet で出る表示ごとの原因と次の一手、どのコマンドを使うかの判断が分かります。
| 表示・症状(原文) | 主な原因 | 次にすること |
|---|---|---|
| telnet: command not found | クライアントが入っていない | apt・brew・DISM で入れる。または nc・Test-NetConnection |
| Unable to connect to remote host: Connection refused | ソフトが止まっている・ポート違い・127.0.0.1 だけで待ち受け | 相手で ss -ltn。待ち受けのアドレスとポートを見る |
| Trying … のまま止まる → Connection timed out | FW の DROP・クラウドの許可設定・経路 | 途中の許可設定を見る。nc -w 3 で短く試す |
| Unable to connect to remote host: No route to host | 同じネットワークに相手がいない・ICMP で拒否 | IP アドレスの誤り・相手の電源・FW の REJECT を疑う |
| Network is unreachable | 自分の機械にその宛先の経路が無い | ip route・VPN の接続を見る |
| Server lookup failure: … Name or service not known | ホスト名が引けない | IP アドレスで試す。DNS を nslookup で調べる |
| Connected のあと何も出ない | 相手がこちらの発言を待っている(HTTP・Redis) | 成功している。1行打つか Ctrl+] → quit |
| 1行打つと Connection closed by foreign host. | TLS のポート・相手のプロトコルと違う | openssl s_client で確かめる |
| 終わり方が分からない | Ctrl+C は相手に送られる | Ctrl+] → quit(Windows は q) |
名前解決で止まるときは、関連記事「nslookupの使い方|逆引き・DNS指定・MX・エラーの意味を実例で」で原因を切り分けられます。
判断表:どのコマンドで確かめるか
| 状況 | 向いているコマンド | 理由 |
|---|---|---|
| Windows でポートが開いているかだけ | Test-NetConnection -Port | 追加のインストールが要らず、True/False で返る |
| Linux・Mac でポートが開いているかだけ | nc -zv -w 3 | 待つ時間を決められ、終了コードで判定できる |
| SMTP・Redis などに手で打って応答を見る | telnet(または nc) | 1行ずつ打って、返事をその場で読める |
| HTTP の応答とヘッダー | curl -v | リダイレクト・TLS・ヘッダーの表示まで1回で済む |
| HTTPS・SMTPS など TLS のポート | openssl s_client | telnet では平文しか話せない |
| 機器へのログイン・設定 | ssh | telnet は暗号化しない |
切り分けは、次の順に進めると迷いません。
- 1名前が引けるかServer lookup failure なら DNS。IP アドレスで打ち直す
- 2すぐ断られるか、待たされるかrefused は相手の機械、timed out は途中の FW・経路
- 3相手で待ち受けているかss -ltn でアドレス(127.0.0.1 か 0.0.0.0 か)とポート
- 4中身が話せるか1行打つ。TLS なら openssl s_client
サービスごとの標準のポート番号は、関連記事「ポート番号一覧【2026年版】well-knownポートと確認コマンドの早見表」で引けます。
よくある質問
Q. telnet でポート確認したとき、画面が真っ黒(何も出ない)のは失敗ですか? A. 成功です。Linux の telnet なら「Connected to」の行が出ています。HTTP や Redis は、こちらが打つまで何も返さないため、そのまま止まって見えます。Ctrl+] → quit で抜けます。
Q. telnet の終了方法が分かりません。
A. Ctrl キーを押しながら ] を押し、「telnet>」が出たら quit と打ちます。Windows では「Microsoft Telnet>」が出たら q です。
Q. Connection refused とタイムアウトはどう違いますか? A. Connection refused は相手の機械まで届き、そのポートで待ち受けていないと返事が来た状態です(手元で0.02秒)。タイムアウトは返事が無く、途中で捨てられている状態です(手元で134秒)。見る場所が変わります。
Q. ポート番号を付けずに telnet ホスト と打つとどうなりますか? A. 23番(TELNET)につなぎます。23番で待ち受けていなければ Connection refused になります。ポート確認のときは必ずポート番号まで書きます。
Q. Windows で telnet コマンドが見つからないと表示されます。
A. Telnet Client が有効になっていません。管理者のコマンドプロンプトで dism /online /Enable-Feature /FeatureName:TelnetClient を実行するか、PowerShell の Test-NetConnection ホスト -Port 番号 で確かめます。
Q. Mac に telnet がありません。
A. Homebrew の brew install telnet で入れられます(Homebrew の公式ページ)。Mac での動作は本記事では試していないため、Homebrew の説明の範囲で書いています。
Q. telnet で UDP のポートを確かめられますか?
A. できません。telnet は TCP だけです。DNS(53番)は nslookup や dig で、実際に問い合わせて答えが返るかを見ます。
Q. telnet で HTTPS(443番)は確かめられますか?
A. ポートが開いているかは確かめられます。中身は TLS で暗号化されているため、telnet で打つと切られます。手元でも1行目で切られました。中身は openssl s_client か curl -v https://… で確かめます。
Q. telnet を使うこと自体は危険ですか? A. クライアントでポート確認に使うだけなら、送るのは自分が打った文字だけです。危ないのは、telnet でログインして、パスワードや操作内容を暗号化せずに流すことです。ログインには SSH を使い、telnet サーバーは立てません。
Q. 自分のサーバー以外のポートを telnet で調べてよいですか? A. 確かめてよいのは、自分が管理しているか、確かめる許可を得ている相手だけです。許可の無い相手のポートを順に調べることは、相手の迷惑になり、問題になることがあります。
まとめ
telnet ホスト ポートで「Connected to」が出れば、そのTCPポートには届いている。ポートを省くと23番になる。- 終了は Ctrl+] →
quit(Windows は Ctrl+] →q)。Ctrl+C では終わらないことがある。 - Connection refused は相手の機械まで届いて断られた(0.02秒)、タイムアウトは途中で捨てられた(手元で134秒)。表示と時間で、見る場所を分ける。
- 「Connected」は開いていることだけを示す。TLS のポートは1行目で切られ、127.0.0.1 だけで待ち受けるソフトは外から refused になった。
- Windows は DISM で Telnet Client を有効にするか、Test-NetConnection を使う。スクリプトでは nc・curl に替え、パイプで流すなら改行は \n だけにする。ログインには SSH を使う。
参考・出典
確認日はいずれも 2026年10月29日です。
- IETF「RFC 854 Telnet Protocol Specification」:https://www.rfc-editor.org/rfc/rfc854
- IANA「Telnet Options」:https://www.iana.org/assignments/telnet-options/telnet-options.xhtml
- Microsoft Learn「telnet」(Windows のコマンド):https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/telnet
- Microsoft Learn「TIP: Installing Telnet Client via command line」:https://learn.microsoft.com/en-us/archive/blogs/danielmauser/tip-installing-telnet-client-via-command-line
- Microsoft Learn「Telnet」(Windows Server 2008 R2・2008 の Telnet の概要):https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc754293(v=ws.10)
- Microsoft Learn「Install Telnet Client」:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc771275(v=ws.10)
- Microsoft Learn「Enable or Disable Windows Features Using DISM」:https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/enable-or-disable-windows-features-using-dism?view=windows-11
- Microsoft Learn「Enable-WindowsOptionalFeature」:https://learn.microsoft.com/en-us/powershell/module/dism/enable-windowsoptionalfeature
- Microsoft Learn「Switch Between Session Mode and Command Mode」:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc725905(v=ws.10)
- Microsoft Learn「Disconnect from a Telnet Server」:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731791(v=ws.10)
- Microsoft Learn「Error Message: Error while connecting to the host - could not open a connection to host on port 23」:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc754782(v=ws.10)
- Microsoft Learn「Test-NetConnection」:https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection
- Microsoft Learn「Use Telnet to test SMTP communication on Exchange servers」:https://learn.microsoft.com/en-us/exchange/mail-flow/test-smtp-with-telnet
- Homebrew Formulae「telnet」:https://formulae.brew.sh/formula/telnet
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「telnetコマンドの使い方|ポート確認・終了方法・エラー原文と対処」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。