ネットワークトラブルの切り分け

network
Author

Ryo Nakagami

Published

2025-09-26

Modified

2025-09-29

⚠️ トラブル

  • Ubuntu 24.04 LTSにて,S3 storage s3.amazonaws.com にある日突然接続できなくなった

🔍 トラブルシューティングフローチャート

---
config:
  layout: elk
---
flowchart LR
    A["ネットワークに問題発生"] --> B["ping ホスト名を実行"]
    B --> C{"応答あり?"}
    C -- YES --> D["名前解決 & 通信OK"]
    C -- NO --> E["ping IPアドレスを実行"]
    E --> F{"応答あり?"}
    F -- YES --> G["名前解決の問題<br>DNS設定確認"]
    F -- NO --> H["ネットワーク未接続<br>ケーブル/ルータ確認"]

    %% フォントサイズをノードごとに指定
    style A font-size:1.2em
    style B font-size:1.2em
    style C font-size:1.2em
    style D font-size:1.2em
    style E font-size:1.2em
    style F font-size:1.2em
    style G font-size:1.2em
    style H font-size:1.1em

今回のトラブルでは,掃除のタイミングでケーブルを抜いており,物理的にケーブルが刺さっていませんでした...

pingコマンド

Definition 1 pingコマンド

  • pingコマンドは指定したホストとの間でネットワークが疎通しているかどうかを調べるコマンド
  • ping ホスト名を実行すると,サイズの小さなパケットを相手に送信して,その応答を調べる
  • ping6/usr/bin/ping6 -> ping* とシンボリックリンクになっている
ping [option] destination

pingコマンドは相手のコンピューターに対してICMPメッセージ(ネットワーク層のプロトコル)を送信し,その応答で通信状況を判断します.以下の例ではグローバルIPアドレスに対してですが, プライベートIPアドレスに対して送信することも可能です.

sequenceDiagram
    participant PC as ユーザー端末
    participant Router as ルーター
    participant Target as 宛先サーバー (例: google.com)

    %% ICMP Echo Request
    PC ->> Router: ICMP Echo Request
    Router ->> Target: ICMP Echo Request

    %% ICMP Echo Reply
    Target -->> Router: ICMP Echo Reply
    Router -->> PC: ICMP Echo Reply

    %% Note
    Note over PC,Target: PCは応答を受け取ってRTT(Round-Trip Time,往復時間)を計測

Figure 1

Example 1 ping出力

% ping 8.8.8.8 -c 3
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=117 time=7.46 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=17.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=14.1 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 7.463/13.149/17.850/4.297 ms
  • 8.8.8.8: Google Public DNS
  • ttl: time to live, パケットがネットワーク上を通過できる最大ホップ数を指定する値

Options

オプション 意味
-4 IPv4を使用する(pingコマンドのデフォルト)
-6 IPv6を使用する(ping6コマンドのデフォルト)
-c 回数 パケットを送る回数
-i 秒数 個々の送信の後に待つ秒数(デフォルトは1秒)
-w 秒数 状況を問わず、pingコマンドの実行を指定した秒数で終了
-n 数値出力のみを行う(IPアドレスからホスト名を検索しない)
-q 開始と終了時の要約のみで他は表示しない(quiet)
-v 詳細な出力を行う(verbose)
-p パターン 送出するパケットを埋める値をパターンで指定(例: -p ff で全て 1 で埋めたパケット)
-s サイズ 送出するパケットのサイズを指定(デフォルト 56バイト+ICMPヘッダ8バイト=合計64バイト)
-R 経路を記録する
-r 通常のルーティングを無視して接続する
-I インタフェース 指定したインタフェースからマルチキャストパケットを送る
-L マルチキャストパケットのループバックを抑制する
-t TTL値 Time To Liveを設定する

pingコマンドを用いた問題の切り分け

テスト内容 コマンド例 結果 考えられる原因 / 対策
IPv4 外部接続 ping 8.8.8.8 ✅ 応答あり IPv4経路は正常
IPv4 外部接続 ping 8.8.8.8 ❌ 応答なし IPv4経路問題(ルーティング・ファイアウォール等)
IPv6 外部接続 ping -6 2001:4860:4860::8888 ✅ 応答あり IPv6経路は正常
IPv6 外部接続 ping -6 2001:4860:4860::8888 ❌ 応答なし IPv6経路問題(ルーティング・ICMPv6制限・ISP未対応)
特定インターフェース経由 ping -I eno1 8.8.8.8 ✅ / ❌ インターフェース選択による疎通確認、VPN/物理NIC切替の検証

ネットワークインターフェース一覧の確認

インターフェース一覧のみを出力する場合は

ip link show

を実行します.実行結果例として

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ...
4: tailscale0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...

または

$ ls /sys/class/net/
docker0@  eno1@  lo@  tailscale0@

でも確認することができます.

Example 2 ネットワークインターフェース例

インターフェース名 種類 説明
lo ループバック ローカル内部通信専用.自分自身との通信に使用される(127.0.0.1 / ::1).
eno1 有線LAN(Ethernet) 物理 NIC.Onboard NIC.マザーボード直付けのポート 1
enp6s0 有線LAN(Ethernet) 物理 NIC.複数NIC構成の場合の追加ポート.
wlp13s0 無線LAN(Wi-Fi) Wi-Fi接続用の物理 NIC.無線ネットワークに接続される.
docker0 仮想ブリッジ Docker が作成する仮想ネットワーク.コンテナ間通信やホスト通信に使用.
br-xxxxxxxxxxx 仮想ブリッジ Docker などが作成するカスタムブリッジ.コンテナ専用ネットワーク用.
tailscale0 VPN仮想NIC Tailscale VPN用の仮想インターフェース.VPN経由の通信に使用.

基本的には

  • wlから始まる: ワイヤレス
  • enから始まる: 有線LAN

という命名規則になっています.またp6s0といった数値はPCIバス番号とスロット番号に対応しています

部分 意味
wl ワイヤレス(Wireless LAN)デバイス
p13 PCI バス番号(このデバイスが接続されているバスの位置)
s0 スロット番号(同じバス内でのスロット位置)

Appendix: ICMP

IPはUDP(トランスポート層プロトコル)と同じコネクションレス型の通信を行うため,データが相手に届いたかどうかについては感知しません. IPデータグラムの通信状況を確認するためのネットワーク層プロトコルとして,ICMP(Internet Control Message Protocol)という仕組みが考案されました.

主にpingコマンドやtracerouteコマンドで使用されます.

NoteICMPはあくまでIPの補助
  • ICMPメッセージは単独で送られることはなく,IPのヘッダが付与されて送られる
  • あくまでも「IPを助けるプロトコル」
  • IPデータグラムは,IPヘッダがついたデータ(トランスポート層でのセグメントに対応)のこと.

ICMPヘッダ

block-beta
  columns 3
  A["<strong>タイプ(8bit)</strong><br>メッセージの種類を表す"]:1
  B["<strong>コード(8bit)</strong><br>エラー原因などを示す"]:1
  C["<strong>チェックサム(16 bit)</strong><br>データが無事かどうかを確認"]:2
  
  style A fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style B fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style C fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em

主なタイプ一覧

ICMP Type NICMPv6 Type 種類 説明
0 129 Echo Reply メッセージが無事に届きました
3 1 Destination Unreachable 宛先に到達できませんでした
5 137 Redirect ルーティング経路の変更通知
8 128 Echo Request このメッセージが届いたら,返事をください
11 3 Time Exceeded TTLやフラグメント再構築時間超過

sequenceDiagram
    participant PC as 自端末 (Type 8)
    participant Router as ルーター
    participant Target as 宛先ホスト (Type 0)

    %% ICMP Echo Request
    PC ->> Router: ICMP Echo Request (Type 8)
    Router ->> Target: ICMP Echo Request (Type 8)

    %% ICMP Echo Reply
    Target -->> Router: ICMP Echo Reply (Type 0)
    Router -->> PC: ICMP Echo Reply (Type 0)

Appendix: PPPoE方式

IPv4ではPPPoE接続方式が使用されています.一方,IPv6ではPPPoE接続方式に加えて,IPoE方式が利用できます.ここでは従来のPPPoE方式を解説します.

Definition 2 Point-to-Point Protocol(PPP)

  • 2点間で1対1の通信を行ためのデータリンク層プロトコル
  • データをPPPフレームにカプセル化して伝送
  • 1対1の通信なのでMACアドレスは基本的には使わない

sequenceDiagram
    participant A as Computer A
    participant B as Computer B

    A ->> B: 通信をしたいときは,<br>通信要求を相手に送信
    B ->> A: 接続する資格を持ったユーザーか確認<br>(ユーザー認証)
    B ->> A: 通信条件について,相談
    B ->> A: 通信を開始

    %% 接続
    Note over A,B: 接続が確立した状態

Figure 2

PPPフレーム

block-beta
  columns 2
  A["<strong>開始符号(8bit)</strong><br>01111110が入る"]:1
  B["<strong>アドレス(8bit)</strong><br>固定値(11111111)が入る"]:1
  C["<strong>制御部(8 bit)</strong><br>伝送を制御するための情報"]:1
  D["<strong>プロトコル部(8 bit)</strong><br>上位層のプロトコルを指定"]:1
  E["<strong>データ</strong><br>カプセル化されたIPヘッダ/TCPヘッダ/アプリケーションヘッダ/データが入る"]:2
  F["<strong>FCS(Frane Check Sequence) (32bit)</strong><br>フレームが壊れていないかどうかを調べる値"]:2
  G["<strong>終了符号(8bit)</strong><br>01111110が入る"]:2

  style A fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style B fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style C fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style D fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style E fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style F fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em
  style G fill:#fff,stroke:#000,stroke-width:2px,font-size:1.5em

Definition 3 PPPoE

  • イーサネットフレーム上にPPPフレームをカプセル化するための通信プロトコル
  • PPPoEを用いることで,イーサネット上にある2台のコンピューター間で認証を行える
  • 光回線を使ってアクセスサーバー経由でインターネットに接続するときに使う

PPPoEは,PPPの昨日をEthernet上で利用するためのプロトコルです.PPPoEはLAN上においてもユーザ認証が可能で,IPアドレスの割当も可能という特徴があります.

PPPoEフレーム

PPPoEフレームは,Ethernetフレームに包まれて運ばれていきます.PPPoEフレームの構成は以下

block-beta
  columns 4
  A["version(4 bit)<br>PPPoEのバージョン情報"]:1
  B["タイプ(4 bit)<br>PPPoEのタイプ情報"]:1
  C["コードビット(8 bit)<br>PPPoEのパケットの種類"]:2
  D["Session ID(16 bit)<br>PPPoEを使った通信を行うための固有値"]:4
  E["データ長(16 bit)<br>最大64KB"]:4
  F["データ<br>PPPヘッダが入る"]:4

IP通信確立までのステップ

PPPoE接続を行ってIP通信ができるようになるまでには,DiscoveryステージとPPPセッションステージの2つのステップを踏む必要があります.

ステージ 説明
Discoveryステージ 最初にPPPoEセッションをはるまで(=PPPoEセッションIDの割り当てを行うまで)
PPPセッションステージ PPP通信による認証実施ステージ(IPアドレス割当まで)

PPPoE接続が上手くいかない場合,一般的には「PPPセッションステージ」での認証トラブルが多いです.

sequenceDiagram
    participant C as PPPoEクライアント (PC)
    participant S as PPPoEサーバー (ISP AC)
    participant R as RADIUSサーバー
    participant G as 接続先 (google.com)

    %% --- Discovery Stage ---
    C ->> S: PADI (接続要求ブロードキャスト)
    S ->> C: PADO (サービス提供応答)
    C ->> S: PADR (AC選択 → 接続要求)
    S ->> C: PADS (セッション確立・Session ID付与)

    Note over C,S: PPPoE セッション確立

    %% --- PPP Session Stage (LCP + 認証) ---
    C ->> S: LCPネゴシエーション
    S ->> C: 認証要求 (PAP/CHAP)
    C ->> S: 認証応答

    %% --- 認証処理 (RADIUS連携) ---
    S ->> R: Access-Request (ユーザー名/パスワード)
    R ->> S: Access-Accept (認証成功, 属性情報[IP割当等])

    S ->> C: 認証成功通知 + IPアドレス割当

    Note over C,S: PPP セッション確立 (グローバルIP付与)

    %% --- IP通信 Stage ---
    C ->> G: HTTPリクエスト (例: https://google.com)
    G ->> C: HTTPレスポンス (Googleページ返却)

Figure 3

References