Tools

pingの使い方

ネットワーク構築作業などで頻繁に使われるツール。IPアドレスを指定することにより、そのIPアドレスまでのIPプロトコルでの疎通性を確認できる。
"ピングを打つ"などと表現される。

pingはネットワーキングにおいて最も基本的なコマンドだぞ!

pingの目的

pingはIP端末がほかのIP端末までの疎通性(リーチャビリティ)を確認する際に使用される。

  • 送信側端末がICMP ECHO REQUESTを送信し、受信側端末がICMP ECHO REPLYを返す
  • 応答する側はpingツールではなく、ICMPとよばれるIPスタックの機能を使うため、受信側で特別なアプリおよび設定は要らない
  • 端末だけではなく、ルータ、スイッチなどのネットワーク機器も応答する

つまりpingとはICMP echo requestを送信するためのツール

REPLYが返ってくればネットワーク的に問題は無いと言うことだね!

基本的な使い方

 command
ping {宛先のhostnameまたはIPアドレス}

以下にmacOSからpingを行った実行例を示す。

宛先からの応答が有る場合の例

> ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1): 56 data bytes
64 bytes from 192.168.2.1: icmp_seq=0 ttl=115 time=5.787 ms
64 bytes from 192.168.2.1: icmp_seq=1 ttl=115 time=4.347 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=115 time=10.555 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=115 time=3.840 ms
^C
--- 192.168.2.1 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 3.840/6.132/10.555/2.651 ms

1行目: pingをIPアドレス 192.168.2.1に対して実行している

3〜6行目: ICMP ECHO REPLYを受信していることがわかる
       "ttl"とはルータを経由するたびに値が一つ減らされる変数。初期値はreplyを返した端末が決める(Windows=128, Mac, Linux=64)
       timeはrequestを送ってからreplyを受け取るまでの時間(round-trip time)
7行目: ^Cとあるが、ここでCtrl-Cを押すことによりpingを中断させている。macOSの場合、中断させない限りずっとpingを出し続ける
8行目: この行以降はpingの結果の統計情報を表示している
9行目: pingコマンドにより、4パケットが送信され、その応答を4パケットつまりすべての応答が正しく完了できたことがわかる
10行目: round-trip timeの統計値が表示されている

packet loss無しということはネットワークが正しく動いている、ということだね!

宛先からの応答が無い場合の例

> ping 192.168.3.1
PING 192.168.3.1 (192.168.3.1): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- 192.168.3.1 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss

この場合、replyをもらえていないのでネットワーク経路上のどこかに問題が潜んでいる可能性がある

そもそも存在しない宛先にpingしている可能性もね!

その他の便利な使い方

pingにはたくさんのオプションが指定できる。以下に便利なオプションを紹介する。

Don't Fragment bit を立てつつサイズ指定しMTUを探る

Don't Fragment bitをonにしたパケットが狭いMTUを持つインタフェースを通ろうとすると、そのデバイスから通過可能なMTUを記述したICMPが返ってくる。これを観察することにより経路上のMTUの最小値を確認できる。

MacOS

> ping 192.168.9.1 -D -s 1472
PING 192.168.9.1 (192.168.9.1): 1472 data bytes
36 bytes from 192.168.100.1: frag needed and DF set (MTU 1454)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 dc05 7efa   0 0000  3e  01 aba8 192.168.1.1  192.168.9.1

Request timeout for icmp_seq 0
^C
--- 192.168.9.1 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
  • 1行目がコマンド。-DでDon't Fragment bitをON。-sでサイズ指定。1472byteにするとEthernet上でIP 1500byte(Ethernet = 1518byte)のフレームが出せる
  • 3行目で192.168.100.1のアドレスを持つデバイスからMTUが1454であることの通知を受け取ったことがわかる
  • したがってこのpingは失敗する。成功させるためにはサイズを1454 - 28 = 1426byte以下にする必要がある。(28 = IP header 20 + Timestamp 8)

これと同様な動作を端末が自動的に行って宛先毎に適切なMTUを記憶するのがPath MTU Discovery (PMTUD)だ!

ubuntu

$ ping 192.168.9.1 -s 1472
PING 192.168.9.1 (192.168.9.1) 1472(1500) bytes of data.
From 192.168.100.1 icmp_seq=1 Frag needed and DF set (mtu = 1454)
^C
--- 192.168.9.1 ping statistics ---
3 packets transmitted, 0 received, +1 errors, 100% packet loss, time 2028ms
  • linux (ubuntu)の場合、オプションを指定しなくてもDon't Fragment bitがONで送信されるので、サイズを-sで指定すれば良い
  • 3行目でMTUが1454byteであることがわかる

Windows11

> ping 192.168.9.1 -f -l 1472

192.168.9.1 に ping を送信しています 1472 バイトのデータ:
192.168.100.1 からの応答: パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。
パケットの断片化が必要ですが、DF が設定されています。

192.168.9.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 1、損失 = 3 (75% の損失)、
  • Windowsの場合、-fでDon't Fragment bitを立てる。またサイズは-lで指定する
  • 4行目から、192.168.100.1でMTUを超えたことは表示されるが、具体的なMTU値は表示されない
  • 10行目で「受信 = 1」となっている。WindowsはICMP ECHO REPLY以外の返答を得ても受信とカウントする様子

Flood Ping (全力でPing送出)

Flood Pingとは端末が全力でPingを行うこと。Super Userの権限が必要。
ネットワークデバイスのカウンタの増加を追って通過経路を特定したり、回線の使用帯域をある程度あげてスクリプトのロジックを試したりできる。
生成されるトラフィックの量は端末や回線の性能に依存するが立派なDoS攻撃とみなされるのでインターネット上のホストに対して行ってはいけない
クローズドなラボ環境で使おう。

厳密な検証をする場合はiperf等のツールを使った方がいいよ

MacOS

> sudo ping 192.168.100.1 -f -s 1472
PING 192.168.100.1 (192.168.100.1): 1472 data bytes
.^C
--- 192.168.100.1 ping statistics ---
129093 packets transmitted, 129092 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.292/0.397/3.592/0.052 ms
  • -fがFlood pingのオプション。Super Userで実行する必要がある
  • “Replyがあり次第”、または“毎秒100回”のどちらか早いほうでパケットを送出する
  • したがって一つのプロセスではさほど負荷はかからないが、複数のプロセスで実行するとより負荷をかけられる

自分が管理していないホストにこれやっちゃダメだぞ!

ubuntu

$ sudo ping 192.168.100.1 -f -s 1472
PING 192.168.100.1 (192.168.100.1) 1472(1500) bytes of data.
.^C
--- 192.168.100.1 ping statistics ---
2879 packets transmitted, 2878 received, 0.0347343% packet loss, time 1186ms
rtt min/avg/max/mdev = 0.208/0.307/11.870/0.221 ms, ipg/ewma 0.411/0.326 ms
  • ほぼMacOSと同じ

Windowsマシンへのpingについて

Windows端末はデフォルトの状態ではICMP Echo Requestに反応しない。ファイアウォールの設定を変更する必要がある。詳しくはこちらの記事を見てほしい。

Windowsマシンがpingに反応しない

Windows端末にpingを打っても返事が来ない。。。逆の方向だとOKなのに!
という場合はまずここと確認してください。

続きを見る

-Tools
-, ,