連載
» 2017年01月23日 05時00分 UPDATE

ネットワークコマンドの使い方:ping 〜ネットワークの疎通を確認する

pingは、ネットワーク疎通を確認したいホストに対してIPパケットを発行し、そのパケットが正しく届いて返答が行われるかを確認するためのコマンドだ。この確認にはICMP(ICMPv6)またはUDPを用い、さまざまなエラーに応じたステータスを把握することも可能

[中屋静治(ルーズデイズ),@IT]

目的と用途

 pingは、ネットワーク疎通を確認したいホストに対してIPパケットを発行し、そのパケットが正しく届いて返答が行われるかを確認するためのコマンドだ。この確認にはICMP(ICMPv6)またはUDPを用い、さまざまなエラーに応じたステータスを把握することも可能。

 pingコマンドが正常に実行できれば、通常はホスト間のネットワークは正常であると判断される。また統計値を表示することで、基本的なネットワーク性能を簡易に計測することもできる。

 エラーが発生した場合には、何らかのネットワーク障害が発生していると考えられる。ただし、pingコマンドでもICMPパケットの返答内容からある程度のエラーの原因は把握できるものの、実際には、別の方法でも詳細に確認すべきであることに注意しよう。例えば、NICのハード障害なのかルーターの障害なのかの切り分けは、それぞれの機器を実際に確認しなければ、あくまで推測の域を出ないということだ。

 また、経路や相手ホストによっては意識的にICMPを拒否や破棄(ドロップ)しているかもしれない。あくまで、ネットワーク全体ではなくコマンドを発行したホストからの観測結果であることに留意しよう。

 なお、pingは一般的には「ピン」または「ピング」と発音される。

書式

Windows(Windows 10)の場合

IPv4/v6兼用

ping [-t] [-a] [-n 要求数] [-l サイズ] [-f] [-i TTL] [-v TOS] [-r ホップ数] [-s ホップ数] [[-j ホスト一覧] | [-k ホスト一覧]] [-w タイムアウト] [-R] [-S ソースアドレス] [-c コンパートメント] [-p] [-4] [-6] 疎通確認対象先ホスト(ホスト名またはIPアドレス)

-t ユーザーからの停止が要求されない限り、パケットの送受信を無限に繰り返す。途中で統計を表示しつつ続けるにはControl+Breakを、停止するにはControl+Cを押す
-a 指定された対象先ホストがIPアドレスであった場合にはホスト名を逆引きして表示する
-n パケット送受信の回数(試行回数)を指定する
-l パケットのデータ部サイズを指定する。デフォルトは32バイト
-f IPパケットの分割(フラグメント)を禁止する。IPv4のみ
-i パケットのTTL(Time To Live)を指定された値に設定する
-v パケットのTOS(Type Of Service)を指定された値に設定する。IPv4のみ。ただしもう使用されていない
-r IPパケットのオプション部(Route Recording)に経由したルーターのアドレスを記録する(最大9個まで)。IPv4のみ
-s IPパケットのオプション部(Time Stamping)に経由したルーターのアドレスと時間を記録する(最大4個まで)。IPv4のみ
-j 経由すべきゲートウェイ(ルーター)のアドレスを最大9個まで指定できる。ただし指定されていないゲートウェイも経由できる(loose source routed)。IPv4のみ
-k 経由すべきゲートウェイ(ルーター)のアドレスを最大9個まで指定できる。ただし指定されていないゲートウェイは経由しない(strict source routed)。IPv4のみ
-w タイムアウト時間を指定する。単位はミリ秒
-R IPv6においてヘッダに記録されたルーティング情報から逆ルートもテストする。ただしセキュリティ上の問題からRFC 5095において禁止された
-S 自身ではない別のホストを送信元ホストとして指定する。ただしもちろん結果は自身へは返ってこない。あくまで試験用オプション
-c ルーティング コンパートメント(VPN時にユーザーのインタフェースごとにルーティング情報を保持し、インターネットからのトラフィックを制御する機能)識別子を指定する
-p Hyper-V ネットワーク仮想化プロバイダーを指定する
-4 IPv4の使用を強制する
-6 IPv6の使用を強制する

Mac(macOS 10.12)の場合

IPv4用

ping [-AaCDdfnoQqRrv] [-b バインドインタフェース] [-c 試行回数] [-G Sweep最大データサイズ] [-g Sweep最小データサイズ] [-h Sweep加算データサイズ] [-i 間隔時間] [-k トラフィッククラス] [-K ネットサービスタイプ] [-l preloadパケット数] [-M mask | time] [-m TTL] [-P IPsecポリシー] [-p パディング・パターン] [-S ソースアドレス] [-s パケットサイズ] [-t タイムアウト時間] [-W 待機時間] [-z TOS] [--apple-connect] [--apple-print] 疎通確認対象先ホスト(ホスト名またはIPアドレス)

-A パケットロスの場合、ベル音を鳴らす
-a パケットを正常に受け取れた場合、ベル音を鳴らす
-C 携帯ネットワークのインタフェースの利用を禁止する(Apple独自オプション)
-D パケットの分割(フラグメント)を禁止する
-d パケットのSO_DEBUGオプションを指定する
-f Flood pingモードを指定する
-n 出力をIPアドレスのみに抑制する(ホスト名の逆引きを行わない)
-o 1パケットだけ正常に確認できたら終了する
-Q ICMPエラーメッセージは表示しない
-q 出力抑制モード。途中経過を表示しない
-R RECORD_ROUTEオプションを指定して、IPバケットのオプション部(Route Recording)に経由したルーターのアドレスを記録する(最大9個まで)
-r 通常のルーティングを無視して直接確認対象先ホストへパケットを送る。これはルーティングテーブルに記載されていないインタフェースからテストしたいときなどに利用できる
-v 詳細モード。通常は無視される他のICMPパケットも表示する
-b 複数のネットワークインタフェース(NIC)がある場合どのインタフェースをバインドするか名前(例えばen0など)で指定する
-c パケット送受信の回数(試行回数)を指定する
-G Sweep Ping時の最大データサイズ。ただし実際はICMPヘッダサイズ8バイトが付加される
-g Sweep Ping時の最小データサイズ。デフォルトは0。ただし実際はICMPヘッダサイズ8バイトが付加される
-h Sweep Ping時のデータへの加算データサイズ。デフォルトは1
-i 送信パケットの間隔時間(秒)。デフォルトは1秒。スーパーユーザーなら小数でも指定可能。-fオプションと同時に指定できない
-k RFC 2474に定義されるトラフィッククラスを指定する(Apple独自オプション)
-K トラフィッククラスとしてネットワークサービスタイプを指定する(Apple独自オプション)
-I 実際の送信処理前に極力早く指定された数のパケット(preload)を送信しておく。スーパーユーザーしか指定できない
-M ICMP_ECHOメッセージの代わりにICMP_MASKREQまたはICMP_TSTAMPを送信する。'mask'を指定するとICMP_MASKREQパケットを送信して確認対象先ホストのネットマスクを表示する。'time'を指定するとICMP_TSTAMPパケットを送信して起動時・送信時・受信時のタイムスタンプを表示する
-m パケットのTTLを指定された値に設定する
-P IPsecのポリシーを指定する
-p パケットのパディング(データの埋め合わせ)データのパターンを指定する。例えばffは全てのデータを1で埋めることを示す
-S 自身ではない別のホストを送信元ホストとして指定する。ただしもちろん結果は自身へは返ってこない。あくまで試験用オプション
-s パケットのデータ部サイズを指定する。デフォルトは56バイト
-t タイムアウト時間を指定するとされているが、実際には-cオプションと同様の動作となるようだ
-W 送信してから受信までどれだけ待機するかをミリ秒で指定する
-z パケットのTOS(Type Of Service)を指定された値に設定する
--apple-connect 指定された対象先ホストへ直接接続して実行する(Apple独自オプション)
--apple-time パケットの送信時刻を結果の各行に表示する(Apple独自オプション)

IPv6用

ping6 [-CDdfHmnNoqtvwW] [-a 検索タイプ] [-b バッファサイズ] [-B バインドインタフェース] [-c 試行回数] [-G Sweep最大データサイズ[,Sweep最小データサイズ[,Sweep加算データサイズ]]] [-g ゲートウェイ] [-h 最大ホップ数] [-I インタフェース] [-i 間隔時間] [-k トラフィッククラス] [-K ネットサービスタイプ] [-l preloadパケット数] [-P IPsecポリシー] [-p パディング・パターン] [-S ソースアドレス] [-s パケットサイズ] [-z トラフィッククラス] [--apple-connect] [--apple-print] [ホップス ...] 疎通確認対象先ホスト(ホスト名またはIPアドレス)

-C 携帯ネットワークのインタフェースの利用を禁止する
-D IPv6のフラグメンテーションを禁止する
-d パケットのSO_DEBUGオプションを指定する
-f Flood pingモードを指定する
-H 結果のIPアドレスから名前を逆引きしてホスト名で表示する
-m パケットのフラグメンテーションを禁止する
-n 出力をIPアドレスのみに抑制する(ホスト名の逆引きを行わない)
-N マルチキャストアドレスグループを取得する
-o 1パケットだけ正常に確認できたら終了する
-q 出力抑制モード。途中経過を表示しない
-t Echo Requestではなく、RFC 4620に規定されているICMPv6のノード情報検索を送信する。-sオプションは同時に指定できない
-v 詳細モード。通常は無視される他のICMPパケットも表示する
-w ICMPv6のノード情報検索でDNS名検索を行う
-W -wオプションと同じだがドラフト段階での実装の後方互換のために残されている
-a Echo Requestではなく、RFC 4620に規定されているICMPv6のノード情報検索を送信する。逆引きでの名前解決やIPv6アドレスの取得などが行える
-b バッファサイズを指定する
-B 複数のネットワークインタフェース(NIC)がある場合、どのインタフェースをバインドするか名前(例えばen0など)で指定する
-c パケット送受信の回数(試行回数)を指定する
-G Sweep Ping時の最大データサイズまた最小データサイズ、加算データサイズを指定する
-g ゲートウェイのアドレスを指定する
-h 最大ホップ数を指定する
-I 指定したインタフェースのアドレスをソースアドレスとして指定する
-i 送信パケットの間隔時間(秒)。デフォルトは1秒。小数でも指定可能。-fオプションと同時に指定できない
-I 実際の送信処理前に極力早く指定された数のパケット(preload)を送信しておく。スーパーユーザーしか指定できない
-P IPsecのポリシーを指定する
-p パケットのパディング(データの埋め合わせ)データのパターンを指定する。例えばffは全てのデータを1で埋めることを示す
-S 指定されたIPアドレスから実行する(Source Addressを指定する)
-s パケットのデータ部サイズを指定する。デフォルトは56バイト
-z IPv6のトラフィッククラスを指定する
--apple-connect 指定された対象先ホストへ直接接続して実行する(Apple独自オプション)
--apple-time パケットの送信時刻を結果の各行に表示する(Apple独自オプション)
ホップス IPv6のルーティングヘッダを指定する

Linux(Ubuntu 16.04 LTS)の場合

IPv4およびv6兼用

[ping|ping6] [-aAbBdDfhLnOqrRUvV] [-c 試行回数] [-F フローラベル] [-i 間隔時間] [-I インタフェース・アドレス] [-l preloadパケット数] [-m mark] [-M pmtudiscオプション] [-N ノード情報オプション] [-w 起動時間] [-W タイムアウト] [-p パディング・パターン] [-Q TOS] [-s パケットサイズ] [-S 送信バッファサイズ] [-t TTL] [-T タイムスタンプオプション] [ホップス ...] 疎通確認対象先ホスト(ホスト名またはIPアドレス)

-a パケットを正常に受け取れた場合、ベル音を鳴らす
-A パケットロスの場合、ベル音を鳴らす
-b ブロードキャストアドレスへの送信を行うことを指定する
-B ソースアドレスが変更されることを禁止する
-d パケットのSO_DEBUGオプションを指定する
-D 各出力行へタイムスタンプを付加する
-f Flood pingモードを指定する
-h ヘルプを表示する
-L マルチキャストのループの制限を行う
-n 出力をIPアドレスのみに抑制する(ホスト名の逆引きを行わない)
-O 不明なICMP_ECHOメッセージを次のパケットを送る前に出力する(調査のために、-Dオプションなどと一緒に利用すると便利)
-q 出力抑制モード。途中経過を表示しない
-r ルーティングテーブルを無視して直接パケットを指定したホストに転送するように指示する。すなわち、同一の物理ネットワーク上に目的のホストがない場合はエラーになる
-R IPパケットのオプション部(Route Recording)に経由したルーターのアドレスを記録する(最大9個まで)
-U ユーザーが受け取る実際のレイテンシを表示する。例えばノーマルではDNS検索の失敗時間などは含まれていない
-v 詳細モード。通常は無視される他のICMPパケットも表示する
-V バージョン情報を表示する
-c パケット送受信の回数(試行回数)を指定する
-F IPv6のフローラベルを指定する
-i 送信パケットの間隔時間(秒)。デフォルトは1秒。-fオプションと同時に指定できない
-I 指定されたインタフェース(ネットワークカード名。バインドされたIPアドレスでも可)を用いて実行する
-I 実際の送信処理前に極力早く指定された数のパケット(preload)を送信しておく。スーパーユーザーしか指定できない
-m パケットへのタグ付けをする
-M Path MTU Discoveryの調査が行える。引数に"do"を指定するとIPのフラグメンテーションを禁止するので、-sオプションと組み合わせることで経路上の最小MTUが調査できる。"dont"ではこれを禁止しない。また"want"はローカル環境ではフラグメンテーションは行うが外部に対しては禁止する。基本的には"do"で調査可能だろう
-N Echo Requestではなく、RFC 4620に規定されているICMPv6のノード情報検索を送信する。逆引きでの名前解決やIPv6アドレスの取得などが行える
-w コマンドの起動時間を指定する。単位は秒
-W 受信パケットのタイムアウト時間
-p パケットのパディング(データの埋め合わせ)データのパターンを指定する。例えばffは全てのデータを1で埋めることを示す
-Q パケットのTOS(Type Of Service)を指定された値に設定する。IPv6の場合はトラフィックコントロール値を指定する
-s パケットのデータ部サイズを指定する。デフォルトは56バイト
-S 送信バッファサイズ
-t パケットのTTLを指定された値に設定する
-T 通常はあまり使用されないがIPヘッダでタイムスタンプ要求を行う。これにより経由するノードでのタイムスタンプ応答が表示される。"tsonly"はタイムスタンプのみを表示する。"tsandaddr"はタイムスタンプとノードのアドレスが、"tsprespec"では引数に経由するノードを指定できる
ホップス IPv6のルーティングヘッダを指定する

使用方法

 pingコマンドで最も単純な使い方は、疎通を確認したいホストのホスト名またはIPアドレスを指定する方法である。

Windowsでの使用例

C:\>ping www.example.com
www.example.com [93.184.216.119]に ping を送信しています 32 バイトのデータ:    <---(1)
93.184.216.119 からの応答: バイト数 =32 時間 =104ms TTL=52     <---(2)
93.184.216.119 からの応答: バイト数 =32 時間 =105ms TTL=52
93.184.216.119 からの応答: バイト数 =32 時間 =104ms TTL=52
93.184.216.119 からの応答: バイト数 =32 時間 =104ms TTL=52
93.184.216.119 の ping 統計:    <---(3)
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒): 
    最小 = 104ms、最大 = 105ms、平均 = 104ms

 この例は、www.example.comに対してpingが成功していることを示している。表示内容を確認してみよう。

 (1)コマンドの対象ホストを示す。これは引数で与えられた疎通確認対象先ホストだ。また、「32バイト」とは送信されるICMPパケットのデータサイズを示している。ここではデフォルト値が用いられているが、必要であればこの値はオプションで変更できる。

 (2)コマンドの途中経過を示すのがこのパートだ。この例では4回パケットの送受信を行い、それぞれの回のステータスを表示している。この試行回数は変更することもできる。

 対象ホストのIPアドレスとともに、バイト数は受信したICMPパケットのデータサイズを示している。時間はパケットを送信してから受信するまでにかかった時間だ。単位はミリ秒である。“<”または“>”は、示された時間以下または以上の時間がかかっていることを示す。時間があまりにあまりに小さい(あるいは大きい)場合に、このように省略されてしまう。

 TTLはTime To Live(tracerouteを参考)を示す。IPパケットにおける「生存時間」(通過可能なゲートウェイ/ルーター数=ホップ数という)である。ここでは結果が表示されているので、既に通過したルーターでの減算を含んでいる。

 (3)最後に試行の結果(統計)が表示される。送信と受信は、それぞれ送信/受信したパケットの総数だ。また損失は、送信したが受信できなかったパケットの数とその損失率を示す。ここでは4回の試行で失敗した送受信はなかったので、損失率は0%となっている。

 また、全体の試行のうち、送受信にかかった最小時間、最大時間、平均時間がラウンドトリップの概算時間として表示される。ホスト間のネットワークのスループットをここから測定できる。

 ホストがIPv6に対応していればping6コマンドを用いるなどでIPv6としてpingを行うことも可能だ。この場合は一般的にICMPv6が用いられることになるが、表示自体はIPv4とも変わらない。基本的な機能はv4とほぼ同じと考えて問題ない。

Linuxでの使用例(IPv6)

$ ping6 www.example.com
PING www.example.com(2606:2800:220:6d:26bf:1447:1097:aa7) 56 data bytes
64 bytes from 2606:2800:220:6d:26bf:1447:1097:aa7: icmp_seq=1 ttl=56 time=127 ms
64 bytes from 2606:2800:220:6d:26bf:1447:1097:aa7: icmp_seq=2 ttl=56 time=127 ms
64 bytes from 2606:2800:220:6d:26bf:1447:1097:aa7: icmp_seq=3 ttl=56 time=127 ms
64 bytes from 2606:2800:220:6d:26bf:1447:1097:aa7: icmp_seq=4 ttl=56 time=127 ms
^C
--- www.example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 127.041/127.300/127.767/0.290 ms

結果から何が分かるか

対象ホストとのネットワーク疎通が正常であること

 pingコマンドが成功すれば、物理的なネットワークまでは正常に機能していることは確認できる。

  • 自身のホストのネットワーク設定と稼働
  • 対象ホストのネットワーク設定と稼働
  • 途中のネットワーク/ルーターの設定と稼働

 以上がそろわなければ、pingコマンドは正常終了しないはずだからだ。pingコマンドが正常なのに、他のコマンドやWebブラウザなどのアプリケーションが使用できない場合は、それらアプリケーション特有の問題である、と切り分けることができる。

ネットワーク性能の推測

 statisticsの表示からネットワークのスループットが推測できる。例えば、「Minimum」「Maximum」などの試行時間に着目したとき、目の前のホストでは0msでも、海外のホストとの通信では数百〜数千msであるなど、ネットワーク環境に応じてかなりの差が出ることが分かるだろう。

 逆に、ほぼ同じネットワーク環境にあるホスト同士での差が激しいようであれば、対象ホスト自身やネットワークの経路に何らかの問題があると推測可能だ。同じホストの調査において差が非常にばらつくという場合には、時間帯によってネットワークが混み合っているなど、利用頻度が高いことが想定される。

コラム:ICMPでの応答は有効にしておくべきか?

 pingコマンドはネットワークの基本的な稼働状況を確認するのに便利だが、ネットワーク管理者によってはpingに使用されるICMPパケットを拒否している場合もある。

 不正アクセスなど、外部からの悪意あるユーザーにさまざまな情報を知られる(または足掛かりにされる)リスクを低減したいという理由からだ。

 しかし一方で、ICMPはネットワークの「健康状態」を通知するというネットワークの正常な運用には欠かせない機能も提供する。

 このように、ICMPでの応答をフィルタリングしてよいかどうかは時々議論になる。

 筆者としては、ICMPを特に破棄(エラーも返さず何の反応もしない状態)すると、やはり正常な運用に問題が出る場合があり、自身より他のネットワークへの影響が大きい場合もあり得ることや、不正アクセスの足掛かりとしてはそれほど致命的な情報を漏らすわけでもないことから、少なくとも破棄はしない方がよいと考えている。

 とはいえ、実際にはケースバイケースなので、応答を無効にしたい場合は、その明確なメリットが何かをよく考えるようにしよう。


失敗例からネットワーク障害を推測する

失敗例1:IPアドレスへのルーティング不可時など(存在しないIPアドレス/ネットワーク指定)

C:\>ping 192.168.10.1
Pinging 192.168.10.1 with 32 bytes of data:
Reply from 203.100.100.49: Destination net unreachable.
Reply from 203.100.100.49: Destination net unreachable.
Reply from 203.100.100.49: Destination net unreachable.
	:

 途中で現れている203.100.100.49は、エラーを報告している(恐らくは)ルーターのIPアドレスを示している。経路上このルーターの時点でルーティングが不可であることが確認されたのだろうと理解できる。

 「Destination net unreachable」というメッセージはICMPのTypeおよびCodeに関係している。Destination Unreachable(Type=3)/Net Unreachable(Code=0)の結果を表示している訳だ。

 これはDestination Host Unreachableとともに最も多いエラーだろう。

失敗例2:ルーティング設定ミスによるループ(一部マスクしている)

C:\>ping 150.224.XXX.XXX
Pinging 150.224.XXX.XXX with 32 bytes of data:
Reply from 130.XXX.76.17: TTL expired in transit.
Reply from 130.XXX.76.17: TTL expired in transit.
Reply from 130.XXX.76.17: TTL expired in transit.
Reply from 130.XXX.76.17: TTL expired in transit.
Ping statistics for 150.224.XXX.XXX:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum =  0ms, Average =  0ms

 TTL(Time To Live)の超過によるエラーがルーターから報告されている。詳しくはtracerouteによる調査が必要だが、多くの場合、途中のルーターのルーティング設定ミスによるループに陥っていると考えられる。特に社内システムなどでサブネットマスクの設定ミス、デフォルトゲートウェイの設定ミスなどで引き起こされることがある。またごくまれだが、接続されている物理ネットワーク(セグメント)数が多く、古いOSやアプリケーションではTTLが小さいために発生する場合もある。

失敗例3:ホスト名解決の失敗

C:\>ping www.unknown.net
Unknown host www.unknown.net.

 これは、パケット送出以前に、DNS検索においてIPアドレスの名前解決に失敗している。恐らくはホスト名が間違っているか、DNSの設定ミスであることが推測される。

失敗例4:対象ホストからの応答がタイムアウト(一部マスクしている)

C:\>ping host1.example.net
Pinging host1.example.net [211.XXX.XXX.190] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
	:

 対象ホストからの応答が届かず、タイムアウトしている場合である。これも非常によく見掛けるエラーだ。単純にホスト自身が停止しているケースや、応答時のルーティングが間違っているケース、途中のルーターがICMPパケットやUDPパケットなどをフィルタしてしまっているケースもある。

 タイムアウトエラーなので明快に原因は特定しにくいが、まずは相手ホストの存在や稼働をうたがってみよう。

コラム:Windowsファイアウォールでの設定

 Windowsファイアウォールは、Windows自身を外部からの不正なアクセスから簡易にマシンを守ってくれる便利な機能ではあるが、「パブリックネットワーク」への接続時にはかなり厳しくアクセス制限が施されている。

 ICMPも例外ではなく拒否対象となっているので、pingなどには反応しないようになる。設定を確認するなら、コントロールパネルから「Windowsファイアウォール」を起動して、以下のエントリーを確認してみよう。


関連ネットワーク・コマンド/ツール

ping 〜ネットワークの疎通を確認する

traceroute(tracert) 〜ネットワークの経路を調査する


ネットワークコマンド使い方


更新履歴

【2017/01/23】最新の状況に合わせて内容を精査の上、更新しました

【2001/08/30】初版公開


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。