ネットワークの問題が発生した際、効率的に原因を特定するためには、体系的なアプローチと適切なコマンドの使用が不可欠です。
トラブルシューティングの一般的な手順
ネットワークトラブルシューティングは、OSI参照モデルの下位層から上位層へと順に確認していくのが一般的です。
- 物理層の確認: ケーブルの接続、ネットワークアダプタの状態、LEDインジケータなど。
- データリンク層/ネットワーク層の確認: IPアドレスの設定、サブネットマスク、ゲートウェイ、ルーティングなど。
- トランスポート層の確認: ポートの開放状況、ファイアウォール設定など。
- アプリケーション層の確認: サービスが正しく動作しているか、アプリケーションの設定など。
代表的なコマンド
ping
指定したホストとのネットワーク接続性を確認します。ICMPプロトコルを使用して、パケットが到達可能か、応答時間などを測定します。
ping [オプション] 宛先IPアドレスまたはホスト名
-c <回数>: 送信するパケットの回数を指定します。-i <秒数>: パケット送信の間隔を指定します。-n: ホスト名の名前解決を行いません(IPアドレスのまま表示)。
例:
ping -c 4 google.com # Googleに4回pingを送信
telnet
特定のホストの特定のポートへの接続性をテストします。アプリケーション層の疎通確認に利用できます。
telnet [オプション] 宛先IPアドレスまたはホスト名 [ポート番号]
-l <ユーザー名>: ログインユーザー名を指定します。
例:
telnet example.com 80 # example.comのWebサーバー (HTTP) への接続をテスト
traceroute / tracepath
送信元から宛先までのパケットの経路(経由するルーター)と、各ホップまでの応答時間を表示します。ネットワークのどこで遅延やパケットロスが発生しているかを特定するのに役立ちます。
traceroute [オプション] 宛先IPアドレスまたはホスト名
# または (tracerouteがインストールされていない場合など)
tracepath 宛先IPアドレスまたはホスト名
-i <インターフェース名>: 送信インターフェースを指定します。-T: TCPプロトコルを使用します。-I: ICMPプロトコルを使用します。-n: ホスト名の名前解決を行いません。
例:
traceroute -n 8.8.8.8 # GoogleのDNSサーバーまでの経路をIPアドレスで表示
ip route
Linuxカーネルのルーティングテーブルのエントリ情報を表示・操作します。
ip route [サブコマンド]
show: ルーティングテーブルの情報を表示します(デフォルト)。add <ネットワーク>: ルーティングテーブルにエントリを追加します。del <ネットワーク>: ルーティングテーブルからエントリを削除します。
例:
ip route show # 現在のルーティングテーブルを表示
ss (socket statistics)
ネットワーク接続、ルーティングテーブル、インターフェース統計などのソケット関連情報を表示します。netstat コマンドの代替として推奨されています。
ss [オプション]
-a: すべてのソケットを表示します(LISTEN状態のものも含む)。-l: LISTEN状態のソケットのみを表示します。-n: サービス名やホスト名の名前解決を行いません(ポート番号やIPアドレスのまま表示)。-t: TCPソケットを表示します。-u: UDPソケットを表示します。-p: ソケットを使用しているプロセスを表示します。
例:
ss -tuln # LISTEN状態のTCP/UDPソケットを数値で表示
tcpdump
ネットワークインターフェースを流れるパケットをキャプチャし、表示します。ネットワーク通信の詳細な分析に利用されます。
tcpdump [オプション] [フィルタ条件]
-c <パケット数>: キャプチャするパケットの数を指定します。-i <インターフェース名>: キャプチャするネットワークインターフェースを指定します。-n: ホスト名やポート番号の名前解決を行いません。-w <ファイル名>: キャプチャしたパケットをファイルに保存します。-v: 詳細な情報を表示します。
フィルタ条件の例:
host <IPアドレス>: 特定のIPアドレスとの通信をフィルタリングします。src <IPアドレス>: 送信元IPアドレスを指定します。dst <IPアドレス>: 宛先IPアドレスを指定します。port <ポート番号>: 特定のポート番号の通信をフィルタリングします。tcp,udp,icmp: プロトコルを指定します。
例:
sudo tcpdump -i eth0 -n port 80 # eth0インターフェースの80番ポートの通信をキャプチャ
tcpdump の実行には通常 sudo が必要です。
これらのコマンドを使いこなすことで、Linux環境でのネットワークトラブルシューティングを効果的に行うことができます。