こんにちは。ネットワールドSE殿貝です。
VMware by BroadcomのTanzu製品などKubernetesソリューションを触っていたりします。
コンテナ内や軽量なLinuxなどで、ping
や telnet
、nc (netcat)
が使えないことってありますよね。
でも、ちょっとした疎通確認がしたい。
そんなときに使える小技が bash
に備わっている /dev/tcp
という仕組みです。
この記事では、その使い方と、TCP・ICMP・UDPの違いも含めて紹介します。

/dev/tcp/host/port
でできること
bashには「/dev/tcp/host/port」という特殊な書き込み先が存在します。
これは実際には実在するデバイスファイルではなく、bashが内部的に提供している疑似デバイスのようなものです。
試しにこんなコマンドを実行してみます:
echo -n "" > /dev/tcp/192.168.1.10/80
これは 192.168.1.10
の 80
番ポートにTCPで接続を試みる、という意味になります。
接続に成功すれば正常終了、失敗すればエラーになります。
疎通確認として使うなら以下の形で使うとよいかもしれません:
echo -n "" > /dev/tcp/192.168.1.10/80 && echo "OK" || echo "NG"
ポートが開いていればOKが返ってきて、閉じていればNGが返ってくる形です。
追加のパッケージも不要で、bashさえあれば使えるので、最小構成の環境では非常に役立ちます。
ICMP(ping)とTCP接続の違い
ここでひとつポイントです。
「ping
が通る」=「そのポートに接続できる」ではないし、
「ポートが開いている」=「ネットワークに到達できる」とも限りません。
これは使っているプロトコルが違うためです。
方法 | 使用プロトコル | 目的 |
---|---|---|
ping |
ICMP | ホストに到達できるか確認 |
/dev/tcp/host/port |
TCP | 特定ポートが開いているか |
たとえば…
- ホストが存在していても、指定のポートが開いていなければ
/dev/tcp
は「接続拒否」になります。 - ファイアウォールがTCPをブロックしていると、
ping
は通るのに/dev/tcp
はタイムアウトになります。 - 逆に、ICMPがブロックされていれば
ping
は通らないけれど、TCPポートへの接続は可能な場合もあります。
なので、確認したいのが「ホストの到達性」なのか「サービスの起動状況」なのかで、使う方法を選ぶ必要があるわけですね。
UDPには対応してないの?
実はbashでは/dev/udp/host/port
という書き方も可能です。
しかし、これはUDPパケットを一方的に送るだけで、相手から応答があるかどうかも確認できません。
UDPはコネクションレスなプロトコルなので、TCPのように接続確立がなく、「相手が受け取ったかどうか」さえもわからないのです。
つまり:
/dev/tcp
→ 接続成功 or 失敗が判断できる(疎通確認に◎)/dev/udp
→ パケットは送れるが、応答がないので疎通確認には不向き(△)
UDPで本格的な疎通確認をしたい場合は、nmap
などのツールを使ったほうがいいでしょう。
まとめ
- bashの
/dev/tcp/host/port
は、コンテナや最小構成のLinuxでも使える疎通確認手段 - ICMP(ping)とTCP接続確認は目的が異なる
- UDPには対応しているようで、していないような微妙な扱いなので注意
ping
が入っていない環境などでは、この方法を覚えておくとトラブル対応のときにとても役立ちます。
こんなことが出来たのかーと思ってもらえたら嬉しいです。
ではまたー