server-memo.net

【Linux】pingコマンドの使い方

   

ネットワークの疎通確認等で良く使用する「ping」コマンドについて、色々と調べた結果をまとめておきます。(動作検証はCentOS7.3で実施)

普段何気なく使用しているコマンドも、あらためて調べてみると知らなかった使い方があったりして面白いです。

pingについて

「ping」は「ICMP」プロトコルの「echo request」パケットを宛先に送信して、宛先から「echo reply」パケットが帰ってくるかでネットワークの通信状態を確認します。

また、相手先からパケットが帰ってくるときの応答率(複数回パケットを送信した際に正常に帰ってきた割合)や応答時間でネットワークの通信状況もある程度確認することが出来ます。

ただし、ネットワークの途中にあるファイアウォール等で「ICMP」プロトコル(ping)を遮断している場合は、ネットワーク的に問題がなくても応答確認ができないので注意が必要です。

pingコマンドの使い方

基本は「ping」と入力した後に「宛先のIPアドレス」または「宛先のホスト名」入力することでネットワークの通信確認を行うことが出来ます。

オプションは必要に応じて指定していきます。

オプションで「ping」の送信回数(-cオプション)や実行時間を指定(-wオプション)していない場合、を停止させたい場合は「Ctrl」+「c」キーを押下します。

ping オプション 宛先IPアドレス(宛先ホスト名)

下記は実際に「ping」を実行した結果となります。

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=35.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=32.5 ms
^C    <--- 「Ctrl」+「c」で停止
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 32.517/33.879/35.241/1.362 ms

オプション一覧

「ping」で使用できるオプションの中から普段使いそうなものを抜粋しています。

オプション 説明
-4 IPv4を使用
-6 IPv6を使用
-a 通信に成功したら音を出す
-A 通信に失敗したら音を出す
-b ブロードキャストアドレスへpingを行う際に使用
-c 回数 送信回数を指定
-f flood pingを実行 (ものすごくたくさんpingを送信)
-i 秒 送信間隔を指定
-I NICまたはIPアドレス 送信元を指定
-n 送信結果でホスト名を表示せずにIPアドレスだけにする
-q ping statisticsのみを表示
-r 宛先ホストへ直接送信する(同一セグメントのみ通信可)
-R 通信経路を表示
-s パケットサイズ(byte) 送信パケットサイズを指定
-t TTL値を指定
-w 秒 pingの実行時間を指定
-W time out を指定

表示内容について

「ping」を実行した際の表示される内容について解説します。

項番 表示内容 説明
(1) 宛先サーバ 宛先として指定したサーバを表示
(2) 宛先IPアドレス 宛先として指定したサーバのIPアドレスを表示
(3) 送信パケットサイズ 送信するパケットサイズを表示
56(84)の意味は「56」byteのデータに「ICMP」のヘッダー情報の「8」byteとTCPのヘッダー情報の「20」byteがプラスされて合計「84」byteのデータが送信されることを表している
(4) 送信されたICMPのデータサイズ 送信されたICMPのデータサイズを表示
(「TCP」のヘッダー情報分は含まない)
(5) 宛先ホスト名(IPアドレス) 宛先をホスト名で指定した場合には宛先サーバのホスト名と(IPアドレス)が表示され、IPアドレスで宛先を指定し場合はホスト名は表示されない
ホスト名を指定した場合はIPアドレスを逆引したホスト名が表示される
(6) シーケンス番号 「ping」を送信した回数を表す番号
この番号に抜けがあった場合はその部分でパケットロス(通信失敗)が発生している
(7) TTLの値 TTLの数値
(8) 応答時間 パケットを送信してから帰ってくるまでの時間
(9) パケット送信回数 pingを送信した回数
(10) 正常にパケットが戻ってきた回数 pingを送信して宛先ホストから正常にパケットが戻ってきた回数
(11) パケットロス率 送信パケットに対するパケットロス(通信失敗)の割合
(12) 実行時間 pingを開始してから終了するまでに掛かった時間
(13) 応答時間統計 左から「最小」「平均」「最大」「標準偏差(ばらつき具合)」
上記画像の標準偏差は平均値である0.414の+-0.157msの範囲に大体おさまっている

icmp_seqでパケットロスを確認

下記の場合「icpm_seq」の「5」と「6」が表示されていないので、その部分でパケットロスが発生してることが分かります。

$ ping 192.168.1.103
PING 192.168.1.103 (192.168.1.103) 56(84) bytes of data.
64 bytes from 192.168.1.103: icmp_seq=1 ttl=64 time=0.194 ms
64 bytes from 192.168.1.103: icmp_seq=2 ttl=64 time=0.188 ms
64 bytes from 192.168.1.103: icmp_seq=3 ttl=64 time=0.550 ms
64 bytes from 192.168.1.103: icmp_seq=4 ttl=64 time=0.339 ms
64 bytes from 192.168.1.103: icmp_seq=7 ttl=64 time=0.466 ms
64 bytes from 192.168.1.103: icmp_seq=8 ttl=64 time=0.571 ms
64 bytes from 192.168.1.103: icmp_seq=9 ttl=64 time=0.582 ms
64 bytes from 192.168.1.103: icmp_seq=10 ttl=64 time=0.565 ms
^C
--- 192.168.1.103 ping statistics ---
10 packets transmitted, 8 received, 20% packet loss, time 9002ms
rtt min/avg/max/mdev = 0.188/0.431/0.582/0.160 ms

「ping statistics」部分でも10パケット送信して8パケットしか受信していないので2パケット分ロスが発生していることがわかります。

TTLについて

TTLはOSによって決められた初期値があり、そこから経由したルータやL3スイッチの数を引いた値が表示されています。

OSごとのTTL値
  • Windows 128
  • Linux 64
  • Solaris 255

ttlの値で対象ホストのOSを推測したり、通信経路の途中にあるルータやL3スイッチの数を推測することが出来ます。

TTLがある理由

TTL(Time To Live)とはパケットの生存期間を表していて、ネットワーク上でルータやL3スイッチ等のL3レベルの機器を通過するたびにその値を1ずつ減らしていき、この値が「0」になるとパケットは破棄されます。

このおかげで、ループが発生した場合などネットワーク上にパケットが永遠に存在するという自体が発生しないようになっています。

オプションについての説明

「ping」で使用できるオプションのうち普段使いそうなものについて説明をしていきます。

IPv4またはIPv6の指定 「-4」「-6」

「-4」「-6」オプションを使用することで、「IPv4」「IPv6」のどちらで「ping」を実行するかを指定することが出来ます。

IPv4を指定

ping -4 宛先ホスト名

IPv6を指定

ping -6 宛先ホスト名

回数を指定 「-c 回数」

「ping」の送信回数を指定したい場合は「-c 回数」オプションを使用します。

ping -c 回数 宛先ホスト

実行例

「ping」を3回送信する場合は以下のように指定します。

$ ping -c 3 192.168.1.103
PING 192.168.1.103 (192.168.1.103) 56(84) bytes of data.
64 bytes from 192.168.1.103: icmp_seq=1 ttl=64 time=0.206 ms
64 bytes from 192.168.1.103: icmp_seq=2 ttl=64 time=0.578 ms
64 bytes from 192.168.1.103: icmp_seq=3 ttl=64 time=0.654 ms

--- 192.168.1.103 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.206/0.479/0.654/0.196 ms

間隔指定 「-i 間隔(秒)」

「ping」の送信間隔は初期値で1秒となっていますが、それ以外の間隔で送信したい場合に「-i」オプションで送信間隔を秒単位で設定します。

ping -i 間隔(秒)

実行例

0.5秒間隔で「ping」を送信させたい場合「0.5」といったように指定をします。

# ping -i 0.5 192.168.1.103
PING 192.168.1.103 (192.168.1.103) 56(84) bytes of data.
64 bytes from 192.168.1.103: icmp_seq=1 ttl=64 time=0.213 ms
64 bytes from 192.168.1.103: icmp_seq=2 ttl=64 time=0.628 ms
64 bytes from 192.168.1.103: icmp_seq=3 ttl=64 time=0.604 ms
64 bytes from 192.168.1.103: icmp_seq=4 ttl=64 time=0.593 ms
^C
--- 192.168.1.103 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1501ms
rtt min/avg/max/mdev = 0.213/0.509/0.628/0.173 ms 
一般ユーザでの最小間隔制限

一般ユーザの場合は最小間隔は「0.2」秒となっていて、それ以下の場合はエラーとなります

$ ping -i 0.1 192.168.1.103
PING 192.168.1.103 (192.168.1.103) 56(84) bytes of data.
ping: cannot flood; minimal interval allowed for user is 200ms

rootユーザの場合は特に制限はありません。

パケットのサイズを指定 「-s サイズ(byte)」

「-s」オプションを使用することで、送信するパケットのサイズをbyte単位で指定することが出来ます。(※実際には指定したサイズにicmpのヘッダー情報(8 byte)がプラスされたサイズとなります。)

ping -s サイズ(byte) 宛先ホスト

実行例

パケットのサイズを100byteと設定したところ、icmpのヘッダ8byte分がプラスされて108byte送信されています。

# ping -s 100 192.168.1.103
PING 192.168.1.103 (192.168.1.103) 100(128) bytes of data.
108 bytes from 192.168.1.103: icmp_seq=1 ttl=64 time=0.219 ms
108 bytes from 192.168.1.103: icmp_seq=2 ttl=64 time=0.502 ms
108 bytes from 192.168.1.103: icmp_seq=3 ttl=64 time=0.561 ms
^C
--- 192.168.1.103 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.219/0.427/0.561/0.150 ms

経路を表示 「-R」

「-R」オプションは「ECHO_REQUEST」パケットに「RECORD_ROUTE」オプションを組み込むことで、宛先ホストまでの経路を表示させることが出来きます。

ping -R 宛先ホスト

ただし、「ping」の「man」によるとこのオプションを破棄または無視するホストも多いよなので、通信経路を確認する場合は「traceroute」コマンドを使用した方が良いでしょう。

実行例

通信経路が表示された場合の例です。(表示結果を一部「xxx」で隠しています。)

$ ping -R -c 3 www.server-memo.net
PING www.server-memo.net (133.242.16.216) 56(124) bytes of data.
64 bytes from 133.242.16.216 (133.242.16.216): icmp_seq=1 ttl=53 time=59.3 ms
RR:     localhost.localdomain (192.168.1.105)
        xxxxxxxxx (xxx.xxx.xxx.xxx)
        xxxxxxxxx (xxx.xxx.xxx.xxx)
        xxxxxxxxx (xxx.xxx.xxx.xxx)
        xxxxxxxxx (xxx.xxx.xxx.xxx)
        as4685.ix.jpix.ad.jp (210.171.224.125)
        tkort3-iskrt3.bb.sakura.ad.jp (157.17.131.33)
        iskrt3-rt1s.bb.sakura.ad.jp (103.10.113.109)
        iskrt1s.bb.sakura.ad.jp (103.10.112.29)

64 bytes from 133.242.16.216 (133.242.16.216): icmp_seq=2 ttl=53 time=58.5 ms   (same route)
64 bytes from 133.242.16.216 (133.242.16.216): icmp_seq=3 ttl=53 time=66.9 ms   (same route)

--- www.server-memo.net ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 58.562/61.626/66.951/3.779 ms

NICを指定 「-I」

「-I」オプションを使用することでpingによってパケットを送信するNICを指定できます。

ping -I NIC名 宛先ホスト

宛先ホスト名を表示しない 「-n」

「ping」の宛先をホスト名で指定した場合に「-n」オプションを使用すると、実行結果を表示する際に宛先のIPアドレスのみを表示するようになります。

ping -n 宛先ホスト名

実行例

-n オプションを使用しない場合

「216.58.197.163」に設定されている逆引きの情報がホスト名「nrt12s02-in-f3.1e100.net」として表示されています。

$ ping -c 3 www.google.co.jp
PING www.google.co.jp (216.58.197.227) 56(84) bytes of data.
64 bytes from nrt13s49-in-f3.1e100.net (216.58.197.227): icmp_seq=1 ttl=55 time=29.3 ms
64 bytes from nrt13s49-in-f3.1e100.net (216.58.197.227): icmp_seq=2 ttl=55 time=26.8 ms
64 bytes from nrt13s49-in-f3.1e100.net (216.58.197.227): icmp_seq=3 ttl=55 time=25.5 ms

--- www.google.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 25.583/27.262/29.360/1.581 ms
-n オプションを使用した場合

逆引きを行わずIPアドレスのみ表示されています

$ ping -c 3 -n www.google.co.jp
PING www.google.co.jp (216.58.197.227) 56(84) bytes of data.
64 bytes from 216.58.197.227: icmp_seq=1 ttl=55 time=30.1 ms
64 bytes from 216.58.197.227: icmp_seq=2 ttl=55 time=28.8 ms
64 bytes from 216.58.197.227: icmp_seq=3 ttl=55 time=26.0 ms

--- www.google.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 26.041/28.356/30.185/1.731 ms

音を鳴らす 「-a」「-A」

「ping」で疎通確認を行う場合に「-a」「-A」オプションを使用することで、通信が「成功」「失敗」それぞれの場合に音を出させることが出来ます。

通信成功時に音を出す

ping -a 宛先ホスト

通信失敗時に音を出す -A

ping -A 宛先ホスト

実行時間を指定 「-w 秒数」

「-w」オプションを使用することで「ping」を送信し続ける時間を秒単位で指定することが出来ます。

ping -w 秒数 宛先ホスト

実行例

5秒間0.5秒間隔で「ping」を送信させています。

$ ping -i 0.5 -w 5 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=11.5 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=9.40 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=7.81 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=6.02 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=3.42 ms
64 bytes from 192.168.1.1: icmp_seq=6 ttl=255 time=3.95 ms
64 bytes from 192.168.1.1: icmp_seq=7 ttl=255 time=12.9 ms
64 bytes from 192.168.1.1: icmp_seq=8 ttl=255 time=12.0 ms
64 bytes from 192.168.1.1: icmp_seq=9 ttl=255 time=10.7 ms
64 bytes from 192.168.1.1: icmp_seq=10 ttl=255 time=9.00 ms

--- 192.168.1.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 4511ms
rtt min/avg/max/mdev = 3.422/8.689/12.983/3.172 ms

10パケット送信時に4511ms(約4.511秒)経過していて、11パケット目を送信すると「-w」オプションで指定している5秒を過ぎてしまうので、10パケットで送信を終了しています。

ブロードキャストアドレスにpingを送信 「-b」

ブロードキャストアドレスにpingを送信する場合には「-b」オプションを指定する必要があります。

「-b」オプションを指定しないと、下記のようにブロードキャストアドレスに「ping」を送信することが出来ません。

$ ping 192.168.1.255
Do you want to ping broadcast? Then -b

「-b」オプションを指定すると、ブロードキャストアドレスに「ping」を送信することが可能になります。

$ ping -c 2 -b 192.168.1.255
WARNING: pinging broadcast address
PING 192.168.1.255 (192.168.1.255) 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=10.9 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=10.9 ms (DUP!)
64 bytes from 192.168.1.9: icmp_seq=1 ttl=64 time=211 ms (DUP!)
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=9.47 ms

--- 192.168.1.255 ping statistics ---
2 packets transmitted, 2 received, +2 duplicates, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 9.475/60.616/211.022/86.839 ms

※ブロードキャストアドレスに「ping」を送信して、複数のホストから応答があった場合は(DUP!)が表示されます。

Linuxはブロードキャストへのpingに応答しない

LinuxのホストはSmurf攻撃の対策としてブロードキャストアドレス宛の「ICMP echo request」(エコーリクエスト)には応答しないように「/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts」の値が「1」に設定されています。

$ cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
1

ブロードキャスト宛の「ICMP echo request」に応答させたい場合は、「/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts」の値を「0」に設定する必要があります。

TIPS

「ping」を使用する際に知っているとちょっと役立つ情報をまとめました。

pingを終了させずに統計情報を表示

「ping」の実行中に[Ctrl] + [\]キーを押下することで、「ping」を中断することなく統計情報を確認することが出来ます。

$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=8.17 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=3.59 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=4.32 ms
3/3 packets, 0% loss, min/avg/ewma/max = 3.596/5.365/7.190/8.172 ms <-- [Ctrl] + [\]キーを押下
64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=4.83 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=3.63 ms
5/5 packets, 0% loss, min/avg/ewma/max = 3.596/4.911/6.487/8.172 ms  <-- [Ctrl] + [\]キーを押下
64 bytes from 192.168.1.1: icmp_seq=6 ttl=255 time=3.55 ms
64 bytes from 192.168.1.1: icmp_seq=7 ttl=255 time=5.77 ms

pingに時刻を表示させる

「date」コマンドと組み合わせることで、「ping」に実現時刻の情報を付与することが出来ますす。(dateコマンドの部分は適宜変更してください)

$ ping 192.168.1.1 | while read line; do echo `date +'%Y-%m-%d_%H:%M:%S'` $line; done

bashで$()が使用できるなら、こっちのほうが見やすいかも。

$ ping 192.168.1.1 | while read line; do echo $(date '+%Y-%m-%d %H:%M:%S') $line; done 
$ ping 192.168.1.1 | while read line; do echo `date +'%Y-%m-%d_%H:%M:%S'` $line; done
2017-07-28_01:06:36 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
2017-07-28_01:06:36 64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=4.15 ms
2017-07-28_01:06:37 64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=13.9 ms
2017-07-28_01:06:38 64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=11.6 ms
2017-07-28_01:06:39 64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=9.11 ms
2017-07-28_01:06:40 64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=7.26 ms

ログに出力

teeコマンドと組わせることで画面に「ping」の実行状況を表示させながらログも取得することができます。

ping 宛先ホスト | tee -i ログ出力先

実行例

「ping」実行時のログを「ping.log」というファイルに出力させています。

$ ping -c 5 192.168.1.1 | tee -i ping.log
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=14.1 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=11.4 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=9.21 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=7.51 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=6.65 ms

--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 6.656/9.804/14.145/2.729 ms

ログ出力先として指定した「ping.log」ファイルの中身を確認してみると、実行結果が出力されていることが確認できます。

$ cat ping.log
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=14.1 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=11.4 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=9.21 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=7.51 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=255 time=6.65 ms

--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 6.656/9.804/14.145/2.729 ms

 

 - ping