最終更新
2026年7月、内容を全面的に書き直しました。nc のオプションが OS によって違う点と、Windows での代替手段を新たに追記しています。
telnet で UDP のポートに繋ごうとして、telnet: Unable to connect to remote host のようなエラーで止まった方向けの記事です。
結論から言うと、telnet は TCP 専用のツールなので UDP 通信には使えません。UDP を試すなら nc(netcat)コマンドを使います。
# 受信側(待ち受け) nc -u -l 12345 # 送信側(別の端末やホストから) echo "hello" | nc -u 127.0.0.1 12345
受信側の端末に hello と表示されれば成功です。
なぜ telnet では UDP を試せないのか
telnet はもともと TCP 上のリモートログインプロトコル(あるいはそのクライアント)を指す言葉で、UDP の接続機能を持っていません。TCP は接続を確立してからデータをやり取りしますが、UDP にはその「接続」という概念自体がなく、telnet の作りとは根本的に噛み合いません。
UDP で任意のポートにデータを送ったり、ポートを開けて待ち受けたりしたいときは、TCP・UDP の両方を扱える nc を使うのが定番です。
nc は系統によってオプションが違う
nc という名前のコマンドは複数あり、同じ -l(listen)や -u(UDP)でも書き方が微妙に違います。ここでつまずく人が多いので、最初に押さえておいてください。
| 系統 | 主な入手経路 | UDP待ち受けの書き方 |
|---|---|---|
| OpenBSD nc | macOS標準 / Debian・Ubuntuの netcat-openbsd | nc -u -l 12345 |
| GNU netcat(traditional) | Debianの netcat-traditional など | nc -u -l -p 12345 |
| Nmap Ncat | nmap-ncat(RHEL/Fedora系)、Homebrewの nmap 同梱 | ncat -u -l 12345 |
たとえば OpenBSD 系(macOSの標準 nc もこれ)では -l と -p を同時に指定するとエラーになります。
$ nc -u -l -p 12345 nc: missing port with option -l
「ネットで見つけたコマンドをコピペしたのに動かない」というときは、まず自分の nc がどの系統かを疑ってください。man nc の冒頭(NAME・SYNOPSIS)を見ればだいたい判別できます。各系統のオプションをもっと詳しく知りたい場合は netcat(nc)でUDP通信する使い方まとめ を参照してください。
手順:ncでUDP通信を試す
ここでは OpenBSD 系(macOS標準)の書き方で進めます。2つの端末を用意してください。
- 受信側の端末で待ち受けを開始します。
sh nc -u -l 12345
- 送信側の端末から、1文字以上のデータを送ります。
sh echo "hello" | nc -u 127.0.0.1 12345
- 受信側の端末に
helloと表示されれば、UDP でデータが届いています。
同じマシンで試す場合は、ターミナルを2枚開いて片方で1、もう片方で2を実行してください。別ホストに送る場合は 127.0.0.1 をそのホストのIPアドレスに置き換えます。
nc が入っていない場合
macOS と多くの Linux ディストリビューションには標準で入っていますが、無い場合は以下でインストールします。パッケージ名がディストリごとに違う点に注意してください。
# Debian / Ubuntu sudo apt install netcat-openbsd # RHEL / CentOS / Fedora sudo dnf install nmap-ncat # macOS(Homebrew) # 標準の nc がそのまま使えます。Nmap Ncat が欲しい場合のみ brew install nmap
Debian/Ubuntu の netcat パッケージは中身を持たない移行用パッケージで、実体は netcat-openbsd などに委譲されています。名指しでインストールするなら netcat-openbsd を指定するのが確実です。
応答が無くても異常とは限らない
UDP はコネクションレスなプロトコルなので、送っても何も返ってこないのが普通です。ポートが開いていても、相手のアプリケーションが何かデータを返す作りになっていなければ無反応ですし、逆に閉じたポートに送っても nc 側では「成功」のように見えることがあります。
$ nc -u -v -w1 127.0.0.1 54321 Connection to 127.0.0.1 port 54321 [udp/*] succeeded!
このホストの54321番ポートで何も待ち受けていなくても、上のように「succeeded」と出ます。UDP はデータを送りつけるだけで相手の応答を待たない性質上、nc 側だけでは「本当に届いたか」を判断できません。ポートが開いているかどうかをちゃんと確認したい場合は、UDPポートが開いているか確認する方法 の手順を使ってください。
Windowsの場合
Windows は telnet クライアントが既定で無効になっており、そもそも nc も標準では入っていません。PowerShell の Test-NetConnection は TCP 専用で UDP には使えないなど、Linux/macOSとは勝手が異なります。Windows で試したい方は WindowsでUDP通信・ポート確認をする方法 を参照してください。
あわせて読みたい
- netcat(nc)でUDP通信する使い方まとめ(
-u-l-v-w-zなど、ncのオプションをもっと詳しく知りたい方向け) - UDPポートが開いているか確認する方法(「疎通しているのか分からない」ときの調べ方)
- WindowsでUDP通信・ポート確認をする方法(PowerShellやncatでの代替手段)
※以下は旧記事です。
Linux/MacなどでコマンドラインからTCP通信を行うには、telnetがよく使われますね。
HTTPアクセスをtelnetで行う例:
telnet example.com 80 GET / HTTP/1.1(改行) Host: example.com(改行) Connection: close(改行) (空行) HTTP 200 OK Content-Type: text/html ... 以下略
UDPでTCPと同じようにテキストベースの通信を行うには、netcat(ncコマンド)が便利です。
netcatはtelnetの機能拡張版ともいえるツールで、TCP/UDPプロトコルを扱う上ではぜひ導入しておきたいものです。
nc コマンドが手元にインストールされてない場合、
CentOS系Linuxなら sudo yum install netcat
Debian なら sudo apt-get install netcat
OS X(Homebrew)なら brew install netcat
でインストールできるかと思います。
netcatは基本的にはtelnetと同じ使い方ができます。
使い方:
netcat -u 接続先IPまたはホスト名 ポート
-u はUDP通信を表すオプションで、省略するとデフォルトでTCP通信になります。
telnet同様、パイプなしで実行すると、標準入力待ち状態になり、Ctrl-Cで切断できます。
また、telnetと違い、サーバになることもできます。
netcat -l -u -p port
-l は Listenモード(サーバモード)、
-u はudpプロトコルでの待受を意味します。(省略するとTCPプロトコル)
-p は待ち受けるポート番号です。
簡易通信サーバになって接続をテストすることも可能です。便利ですね。
もちろん、サーバ・クライアント両方ともncでも通信できます。
サーバ側コンソール(ローカル):
$ nc -l -p 55440 # 適当なTCPポート55440で待受(udpでもOK)
クライアント側コンソール(ローカル):
$ nc localhost 55440 # サーバにつなぐ。(TCPならtelnetでもOK) hogehoge(改行)
こうすると、サーバ側コンソールに hogehoge と表示されます。
逆にサーバ→クライアントにメッセージを送ることも可能です。
また、上記の例では同一ホストで実行していますが、もちろんIPアドレス、ドメイン指定などで別マシンとも通信できます。
ローカルでやると動くのに、別マシンにはつながらない、という場合はファイアウォールを確認するとだいたい解決するかと思います。
終了できない!と焦ったら、Ctrl-Cを推してみましょう。
ぜひご自身で色々試してみて下さい!
あわせて読みたい
- netcat(nc)でUDP通信する使い方まとめ(
-u-l-v-w-zなど、ncのオプションをもっと詳しく知りたい方向け) - UDPポートが開いているか確認する方法(「疎通しているのか分からない」ときの調べ方)
- WindowsでUDP通信・ポート確認をする方法(PowerShellやncatでの代替手段)