株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

pingがなくても疎通確認!"/dev/tcp"を使ってみる

こんにちは。ネットワールドSE殿貝です。
VMware by BroadcomのTanzu製品などKubernetesソリューションを触っていたりします。

コンテナ内や軽量なLinuxなどで、pingtelnetnc (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.1080 番ポートに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が入っていない環境などでは、この方法を覚えておくとトラブル対応のときにとても役立ちます。
こんなことが出来たのかーと思ってもらえたら嬉しいです。

ではまたー