Linux ネットワークテスト

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linux で ping コマンドを使用したネットワークテストについて学びます。ネットワークテストは、接続性の問題を診断し、ネットワークパフォーマンスを測定し、デバイス間が適切に通信できることを確認するために不可欠です。

ping コマンドは、Linux システムで利用可能な最も基本的なネットワークテストツールの 1 つです。このコマンドは、ICMP (Internet Control Message Protocol) エコー要求パケットをターゲットホストに送信し、ICMP エコー応答パケットを待つことで機能します。このシンプルなメカニズムにより、リモートホストに到達可能かどうかを確認し、パケットが宛先に到達して戻ってくるまでの往復時間を測定することができます。

この実験を完了することで、ネットワークテストツールの実践的な経験を積み、ネットワークトラブルシューティングに必要なスキルを身につけることができます。

基本的なネットワークテストに ping コマンドを使用する

このステップでは、ping コマンドを使用して、自分のコンピュータとネットワーク上の別のホストとの間の接続性をテストする方法を学びます。ping コマンドは、ターゲットアドレスにエコー要求を送信し、応答を待つことで、ホストに到達可能かどうかを確認できます。

まず、ターミナルを開き、プロジェクトディレクトリにいることを確認します。

cd ~/project

テストしたい IP アドレスを保存するテキストファイルを作成しましょう。これにより、ネットワークテストを整理することができます。

echo "8.8.8.8" > ~/project/ping_hosts.txt

このコマンドは、Google のパブリック DNS サーバの IP アドレス 8.8.8.8 を含む ping_hosts.txt という名前のファイルを作成します。

では、次のコマンドを使用して最初の ping テストを実行しましょう。

ping -c 4 $(cat ~/project/ping_hosts.txt)

上記のコマンドは以下のことを行います。

  • ping: ping ユーティリティを呼び出します。
  • -c 4: ping を 4 つのパケットに制限します(デフォルトでは、ping は Ctrl+C で停止するまで続きます)。
  • $(cat ~/project/ping_hosts.txt): ファイルから IP アドレスを読み取ります。

このコマンドを実行すると、次のような出力が表示されるはずです。

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=116 time=14.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=13.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=13.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=13.7 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 13.676/13.963/14.513/0.329 ms

この出力は以下を示しています。

  • システムはターゲットホストに 4 つのパケットを正常に送信しました。
  • ターゲットホストはすべての 4 つのパケットに応答しました。
  • パケット損失は 0% でした。
  • 往復時間 (rtt) は平均で約 14 ミリ秒でした。

到達できないホストに ping を送信すると、次のような表示がされることがあります。

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.

--- 192.168.1.100 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3062ms

これは、ターゲットホストから応答が受信されなかったことを示しており、ホストがオフライン、到達不能、または ICMP エコー要求をブロックしている可能性があります。

別の IP アドレスで別の例を試してみましょう。今回は、一般的なローカルネットワークゲートウェイアドレスを使用します。

ping -c 4 192.168.1.1

応答はネットワーク構成によって異なります。この IP がゲートウェイであれば、非常に低いレイテンシ(通常は 1 ミリ秒未満)で ping 応答が成功するはずです。そうでない場合は、タイムアウトまたは「Destination Host Unreachable」メッセージが表示されることがあります。

ping 出力の理解と分析

基本的な ping コマンドの使い方を学んだので、その出力をより詳細に解釈する方法を探ってみましょう。ping の結果を理解することは、ネットワークの問題を診断するために不可欠です。

まず、ping_hosts.txt ファイルに別のホストを追加しましょう。

echo "1.1.1.1" >> ~/project/ping_hosts.txt

このコマンドは、Cloudflare の DNS サーバの IP アドレスをファイルに追加します。>> 演算子は、内容をファイルに上書きするのではなく追加します(> は上書きします)。

ファイルの内容を確認しましょう。

cat ~/project/ping_hosts.txt

次のように表示されるはずです。

8.8.8.8
1.1.1.1

では、2 番目のアドレスに ping を送信し、出力を分析しましょう。

ping -c 4 $(tail -n 1 ~/project/ping_hosts.txt)

tail -n 1 コマンドは、ファイルの最後の行を抽出します。これは Cloudflare の DNS サーバの IP アドレスです。

次のような出力が表示されるはずです。

PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=9.32 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=57 time=8.76 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=57 time=8.92 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=57 time=9.08 ms

--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 8.756/9.019/9.317/0.210 ms

この出力を詳細に分解してみましょう。

  1. ヘッダー: PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.

    • これは、ターゲットの IP アドレスと ping パケットのサイズ(データ 56 バイト、ヘッダーを含めて 84 バイト)を示しています。
  2. 個々のエコー応答:

    • 64 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=9.32 ms
    • bytes from: 応答のサイズを示します。
    • icmp_seq: パケットのシーケンス番号です。
    • ttl: Time To Live の略で、パケットが無限に循環するのを防ぐ値です。
    • time: 往復時間(ミリ秒)です。
  3. 要約統計情報:

    • 4 packets transmitted, 4 received, 0% packet loss, time 3005ms
    • 送信されたパケット数、受信されたパケット数、パケット損失率、および総時間を示します。
    • rtt min/avg/max/mdev = 8.756/9.019/9.317/0.210 ms
    • 往復時間の最小値、平均値、最大値、および平均偏差です。

ping コマンドにいくつかの追加オプションを使用して、より多くの情報を取得しましょう。

ping -c 4 -i 0.5 -s 100 1.1.1.1

このコマンドは以下のことを行います。

  • -c 4: 4 つのパケットを送信します。
  • -i 0.5: パケット間の間隔を 0.5 秒に設定します(デフォルトは 1 秒)。
  • -s 100: パケットサイズを 100 バイトに変更します(デフォルトは 56 バイト)。

パケットサイズが大きく、間隔が短い出力が表示されるはずです。

PING 1.1.1.1 (1.1.1.1) 100(128) bytes of data.
108 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=9.33 ms
108 bytes from 1.1.1.1: icmp_seq=2 ttl=57 time=9.19 ms
108 bytes from 1.1.1.1: icmp_seq=3 ttl=57 time=9.11 ms
108 bytes from 1.1.1.1: icmp_seq=4 ttl=57 time=9.20 ms

--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 1503ms
rtt min/avg/max/mdev = 9.108/9.205/9.326/0.079 ms

ping の結果を分析する際には、次の重要な指標に注意してください。

  1. パケット損失: 0% を超えるパーセンテージは、ネットワークの問題を示します。
  2. レイテンシ: 高い時間(特に 100ms を超える場合)は、ネットワークの混雑を示している可能性があります。
  3. 時間の不一致: 最小値と最大値の間に大きな差がある場合は、ネットワークの不安定性を示しています。

たとえば、高いパケット損失は以下のことを示している可能性があります。

  • ネットワークの混雑
  • ハードウェアの問題
  • ファイアウォールの制限
  • ルーティングの問題

高いレイテンシは以下のことを示している可能性があります。

  • サーバまでの物理的な距離
  • ネットワークの混雑
  • 接続品質の低下
  • ルーティングの非効率性

高度な ping オプションと実用的なアプリケーション

ping コマンドの基本とその出力の解釈方法を理解したので、いくつかの高度なオプションと、ping がネットワーク診断に役立つ実用的なシナリオを探ってみましょう。

まず、ホストを継続的に監視し、結果をログに記録する簡単なシェルスクリプトを作成しましょう。

nano ~/project/monitor_host.sh

エディタに次のスクリプトを入力します。

#!/bin/bash

## シンプルなネットワーク監視スクリプト
HOST=$1
INTERVAL=$2
LOG_FILE=~/project/ping_log.txt

echo "Starting monitoring of $HOST at $(date)" > $LOG_FILE

while true; do
  ping -c 1 $HOST | grep "time=" >> $LOG_FILE
  sleep $INTERVAL
  echo "---" >> $LOG_FILE
done

Ctrl+O を押してファイルを保存し、Enter を押し、Ctrl+X でエディタを終了します。

スクリプトを実行可能にします。

chmod +x ~/project/monitor_host.sh

では、Google の DNS サーバを数秒間監視するためにスクリプトを実行しましょう。

~/project/monitor_host.sh 8.8.8.8 2 &
sleep 10
kill $!

これにより、以下のことが行われます。

  1. 監視スクリプトをバックグラウンドで起動します。
  2. 10 秒間待機します。
  3. スクリプトを停止します。

ログを確認しましょう。

cat ~/project/ping_log.txt

タイムスタンプ付きのいくつかの ping 結果が表示されるはずです。

では、いくつかの高度な ping オプションを探ってみましょう。

  1. TTL (Time To Live) の設定:
ping -c 4 -t 64 8.8.8.8

-t オプションは TTL 値を設定します。これは、パケットが破棄される前に通過できるネットワークホップの数を定義します。

  1. Flood ping (sudo が必要):
sudo ping -c 10 -f 8.8.8.8

-f オプションは、可能な限り速くパケットを送信します。これはストレステストに役立ちますが、注意して使用する必要があります。

  1. 可聴 ping:
ping -c 4 -a 8.8.8.8

-a オプションは、ホストが応答したときに可聴ベル音を鳴らします。これは、トラブルシューティング中に画面を見ていないときに便利です。

  1. 期限付きタイミング:
ping -c 4 -w 2 8.8.8.8

-w オプションは、秒単位で期限を設定します。その期限を過ぎると、送信したパケット数に関係なく ping が停止します。

実用的なトラブルシューティングシナリオを探ってみましょう。traceroute を使用して、宛先までのネットワークパスを簡単に可視化します(traceroute は ping と似た動作をしますが、パケットがたどる経路を表示します)。

traceroute 8.8.8.8

このコマンドは、パケットが宛先に到達するために通過する各ホップ(ルーター)を表示します。次のような表示がされるでしょう。

traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  _gateway (10.0.2.2)  0.113 ms  0.087 ms  0.083 ms
 2  * * *
 3  * * *
 4  8.8.8.8  14.080 ms  13.849 ms  14.399 ms

アスタリスク (*) は、タイムアウトまたは traceroute 要求に応答しないルーターを表します。

では、異なるホストの ping 結果を記録する簡単な表を作成しましょう。

echo -e "Host\tMin Time\tAvg Time\tMax Time\tPacket Loss" > ~/project/ping_results.txt

Google の DNS を表に追加しましょう。

result=$(ping -c 5 8.8.8.8 | tail -1)
min=$(echo $result | awk -F/ '{print $4}')
avg=$(echo $result | awk -F/ '{print $5}')
max=$(echo $result | awk -F/ '{print $6}')
loss=$(ping -c 5 8.8.8.8 | grep -o "[0-9]*%" | head -1)
echo -e "8.8.8.8\t$min ms\t\t$avg ms\t\t$max ms\t\t$loss" >> ~/project/ping_results.txt

そして、Cloudflare の DNS を追加します。

result=$(ping -c 5 1.1.1.1 | tail -1)
min=$(echo $result | awk -F/ '{print $4}')
avg=$(echo $result | awk -F/ '{print $5}')
max=$(echo $result | awk -F/ '{print $6}')
loss=$(ping -c 5 1.1.1.1 | grep -o "[0-9]*%" | head -1)
echo -e "1.1.1.1\t$min ms\t\t$avg ms\t\t$max ms\t\t$loss" >> ~/project/ping_results.txt

結果の表を表示しましょう。

cat ~/project/ping_results.txt

両方の DNS サーバの ping 統計が書式付きで表示されるはずです。これを使用して、それらのパフォーマンスを比較することができます。

まとめ

この実験では、Linux でネットワークテストに ping コマンドを使用する方法を学びました。以下の実践的な経験を積みました。

  • リモートホストへの接続性を確認するために基本的な ping コマンドを使用する
  • ネットワークの問題を診断するために ping の出力を解釈する
  • ネットワークテストをカスタマイズするために様々な ping オプションを使用する
  • ネットワーク接続性を監視するスクリプトを作成する
  • ネットワークパフォーマンスを評価するために ping 統計を分析する
  • ネットワークパスを可視化するために traceroute などの関連ツールを使用する

これらのスキルはネットワークのトラブルシューティングに不可欠であり、単純な障害から複雑なパフォーマンス問題まで、幅広い接続性の問題を診断するのに役立ちます。

Linux システムを引き続き扱う際には、ping は利用可能な多くのネットワーク診断ツールの 1 つに過ぎないことを覚えておいてください。他の有用なツールには、traceroutenetstatnmaptcpdumpwireshark などがあり、これらは総合的なネットワークトラブルシューティングツールキットを構成します。

ネットワーク接続性を効果的にテストする方法を理解することで、様々な環境でのネットワークシステムの保守とトラブルシューティングにより適した状態になりました。