Day 5: ルーティング
今日学ぶこと
- ルーティングの基本概念
- 静的ルーティングと動的ルーティング
- ルーティングテーブルの読み方
- 距離ベクトル型プロトコル(RIP)
- リンクステート型プロトコル(OSPF)
- パスベクトル型プロトコル(BGP)
- デフォルトゲートウェイとtraceroute
ルーティングとは
ルーティングとは、パケットを送信元から宛先まで最適な経路で転送する仕組みです。ルーターはルーティングテーブルに基づいて、パケットを次のルーター(ネクストホップ)に転送します。
flowchart LR
subgraph NetA["ネットワークA\n192.168.1.0/24"]
PC["PC\n192.168.1.10"]
end
subgraph NetB["ネットワークB\n10.0.0.0/24"]
R1["ルーターA"]
end
subgraph NetC["ネットワークC\n172.16.0.0/24"]
R2["ルーターB"]
end
subgraph NetD["ネットワークD\n203.0.113.0/24"]
Server["サーバー\n203.0.113.50"]
end
PC -->|"1. デフォルトGW"| R1
R1 -->|"2. ネクストホップ"| R2
R2 -->|"3. 直接接続"| Server
style NetA fill:#3b82f6,color:#fff
style NetB fill:#f59e0b,color:#fff
style NetC fill:#8b5cf6,color:#fff
style NetD fill:#22c55e,color:#fff
ルーティングの基本動作
- パケットを受信する
- 宛先IPアドレスをルーティングテーブルと照合する
- 最長一致(Longest Prefix Match) で最適な経路を選択する
- ネクストホップにパケットを転送する
- 一致するルートがなければパケットを破棄(またはデフォルトルートに転送)
ルーティングテーブル
ルーティングテーブルは、ルーターが持つ経路情報のデータベースです。
# Show routing table (Linux)
ip route show
# Example output:
# default via 192.168.1.1 dev eth0
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
# 10.0.0.0/8 via 192.168.1.254 dev eth0
# Show routing table (Windows)
route print
# Show routing table (macOS)
netstat -rn
ルーティングテーブルの構成要素
| 要素 | 説明 | 例 |
|---|---|---|
| 宛先ネットワーク | パケットの宛先 | 192.168.1.0/24 |
| ネクストホップ | 次に転送するルーターのIP | 10.0.0.1 |
| 出力インターフェース | パケットを送出するインターフェース | eth0 |
| メトリック | 経路のコスト(小さい方が優先) | 10 |
| 経路の種類 | 直接接続、静的、動的(RIP、OSPFなど) | OSPF |
最長一致(Longest Prefix Match)
ルーターは、宛先IPアドレスに最も長く一致するプレフィックスの経路を選択します。
例:宛先が 192.168.1.100 の場合
| ルーティングエントリ | プレフィックス長 | ネクストホップ | 選択 |
|---|---|---|---|
| 0.0.0.0/0 | /0 | 10.0.0.1 | |
| 192.168.0.0/16 | /16 | 10.0.0.2 | |
| 192.168.1.0/24 | /24 | 10.0.0.3 | 選択 |
/24 が最も長く一致するため、ネクストホップ 10.0.0.3 が選択されます。
静的ルーティング vs 動的ルーティング
flowchart TB
subgraph Routing["ルーティングの種類"]
Static["静的ルーティング\n管理者が手動で設定"]
Dynamic["動的ルーティング\nプロトコルが自動学習"]
end
subgraph DProtocols["動的ルーティングプロトコル"]
DV["距離ベクトル型\nRIP"]
LS["リンクステート型\nOSPF, IS-IS"]
PV["パスベクトル型\nBGP"]
end
Dynamic --> DProtocols
style Static fill:#3b82f6,color:#fff
style Dynamic fill:#22c55e,color:#fff
style DV fill:#f59e0b,color:#fff
style LS fill:#8b5cf6,color:#fff
style PV fill:#ef4444,color:#fff
style Routing fill:#1e293b,color:#fff
style DProtocols fill:#1e293b,color:#fff
静的ルーティング
管理者がルーティングテーブルを手動で設定する方式です。
# Add a static route (Linux)
sudo ip route add 10.0.0.0/8 via 192.168.1.254
# Add a static route (Windows)
route add 10.0.0.0 mask 255.0.0.0 192.168.1.254
# Delete a static route (Linux)
sudo ip route del 10.0.0.0/8
| メリット | デメリット |
|---|---|
| 設定がシンプル | ネットワーク変更時に手動で更新が必要 |
| CPUやメモリの負荷が少ない | 大規模ネットワークでは管理が困難 |
| セキュリティが高い(予測可能) | 障害時の自動切り替えができない |
| 帯域幅を消費しない | スケーラビリティが低い |
動的ルーティング
ルーティングプロトコルを使って、ルーター間で経路情報を自動的に交換する方式です。
| メリット | デメリット |
|---|---|
| ネットワーク変更に自動対応 | 設定が複雑 |
| 障害時に経路を自動切り替え | CPU・メモリを消費 |
| 大規模ネットワークに対応 | 帯域幅を消費 |
| 管理コストが低い | セキュリティリスク(経路の改ざんなど) |
距離ベクトル型プロトコル:RIP
RIP(Routing Information Protocol)
RIPは最もシンプルな動的ルーティングプロトコルです。メトリックとしてホップ数(通過するルーター数)を使用します。
| 特徴 | 詳細 |
|---|---|
| アルゴリズム | Bellman-Ford |
| メトリック | ホップ数(最大15。16は到達不能) |
| 更新間隔 | 30秒ごとにルーティングテーブル全体をブロードキャスト |
| 収束速度 | 遅い |
| バージョン | RIPv1(クラスフル)、RIPv2(クラスレス、マルチキャスト) |
flowchart LR
subgraph RIPExample["RIPの経路選択"]
A["ルーターA"] -->|"1ホップ"| B["ルーターB"]
B -->|"1ホップ"| D["ルーターD\n(宛先)"]
A -->|"1ホップ"| C["ルーターC"]
C -->|"1ホップ"| E["ルーターE"]
E -->|"1ホップ"| D
end
style A fill:#3b82f6,color:#fff
style B fill:#22c55e,color:#fff
style C fill:#f59e0b,color:#fff
style D fill:#ef4444,color:#fff
style E fill:#f59e0b,color:#fff
style RIPExample fill:#1e293b,color:#fff
上の例では、A→B→D(2ホップ)とA→C→E→D(3ホップ)のうち、RIPはホップ数が少ない A→B→D を選択します。ただし、帯域幅や遅延は考慮しません。
RIPの問題点
- カウント・トゥ・インフィニティ: 障害発生時、ルーター間でメトリックが際限なく増加する問題
- 収束が遅い: ネットワーク変更が全体に伝わるまで時間がかかる
- スケーラビリティ: 最大15ホップの制限があり、大規模ネットワークには不向き
対策として、スプリットホライズン、ルートポイズニング、ホールドダウンタイマーなどが使われます。
リンクステート型プロトコル:OSPF
OSPF(Open Shortest Path First)
OSPFは、企業ネットワークで最も広く使われている動的ルーティングプロトコルです。ネットワーク全体のトポロジーマップを構築し、ダイクストラのアルゴリズム(SPF) で最短経路を計算します。
| 特徴 | 詳細 |
|---|---|
| アルゴリズム | Dijkstra(SPF) |
| メトリック | コスト(帯域幅に基づく。100Mbps基準) |
| 更新方式 | トポロジー変更時のみ(LSA: Link State Advertisement) |
| 収束速度 | 速い |
| エリア構造 | 階層的(バックボーン Area 0 + 通常エリア) |
OSPFのエリア構造
OSPFは大規模ネットワークを効率的に管理するため、エリアという単位に分割します。
flowchart TB
subgraph Area0["Area 0(バックボーン)"]
ABR1["ABR 1"]
ABR2["ABR 2"]
Core["コアルーター"]
ABR1 --- Core --- ABR2
end
subgraph Area1["Area 1"]
R1["ルーター1"]
R2["ルーター2"]
R1 --- R2
end
subgraph Area2["Area 2"]
R3["ルーター3"]
R4["ルーター4"]
R3 --- R4
end
ABR1 --- R1
ABR2 --- R3
style Area0 fill:#ef4444,color:#fff
style Area1 fill:#3b82f6,color:#fff
style Area2 fill:#22c55e,color:#fff
- Area 0(バックボーンエリア): すべてのエリアが接続される中心エリア
- ABR(Area Border Router): エリア間を接続するルーター
- 各エリア内で独立してSPF計算を実行するため、大規模ネットワークでも効率的
OSPFの動作手順
- 隣接関係の確立: Helloパケットで近隣ルーターを発見
- LSAの交換: ルーターが自身のリンク状態情報をフラッディング
- LSDBの構築: 全ルーターが同一のLink State Database(LSDB)を構築
- SPF計算: ダイクストラのアルゴリズムで最短経路ツリーを計算
- ルーティングテーブル更新: 計算結果をルーティングテーブルに反映
RIP vs OSPF
| 特徴 | RIP | OSPF |
|---|---|---|
| アルゴリズム | Bellman-Ford | Dijkstra |
| メトリック | ホップ数 | コスト(帯域幅ベース) |
| 最大規模 | 15ホップ | 事実上無制限 |
| 更新方式 | 定期的(30秒) | 変更時のみ |
| 収束速度 | 遅い | 速い |
| 帯域幅消費 | 大きい | 小さい |
| 設定の難易度 | 簡単 | 中程度 |
パスベクトル型プロトコル:BGP
BGP(Border Gateway Protocol)
BGPは、インターネットの骨格を支えるルーティングプロトコルです。AS(Autonomous System:自律システム) 間の経路制御を行います。
| 特徴 | 詳細 |
|---|---|
| 種類 | EGP(Exterior Gateway Protocol) |
| 用途 | AS間のルーティング(インターネットの骨格) |
| メトリック | パス属性(AS_PATH、NEXT_HOP、LOCAL_PREFなど) |
| プロトコル | TCP ポート179 |
| 現行バージョン | BGP-4 |
AS(自律システム)とは
ASは、単一の管理組織が運用するネットワークの集合です。各ASには一意のASN(AS Number) が割り当てられます。
flowchart LR
subgraph AS1["AS 65001\nISP A"]
R1["ルーターA"]
end
subgraph AS2["AS 65002\nISP B"]
R2["ルーターB"]
end
subgraph AS3["AS 65003\n企業C"]
R3["ルーターC"]
end
R1 <-->|"eBGP"| R2
R2 <-->|"eBGP"| R3
R1 <-->|"eBGP"| R3
style AS1 fill:#3b82f6,color:#fff
style AS2 fill:#8b5cf6,color:#fff
style AS3 fill:#22c55e,color:#fff
BGPの経路選択
BGPは単純なメトリックではなく、複数のパス属性に基づいてベストパスを選択します。
| 優先順位 | 属性 | 説明 |
|---|---|---|
| 1 | LOCAL_PREF | ローカル優先度(高い方が優先) |
| 2 | AS_PATH | 経由するASの数(短い方が優先) |
| 3 | ORIGIN | 経路の起源(IGP > EGP > Incomplete) |
| 4 | MED | Multi-Exit Discriminator(低い方が優先) |
| 5 | eBGP > iBGP | 外部BGPを優先 |
| 6 | IGPメトリック | ネクストホップへの内部コスト |
| 7 | ルーターID | 最も小さいIDを優先(タイブレーカー) |
iBGP と eBGP
- eBGP(External BGP): 異なるAS間で使用
- iBGP(Internal BGP): 同一AS内で使用
デフォルトゲートウェイ
デフォルトゲートウェイは、同一ネットワーク外の宛先にパケットを送信する際に使うルーターのアドレスです。ルーティングテーブルに一致するエントリがない場合、デフォルトゲートウェイにパケットを転送します。
デフォルトルート: 0.0.0.0/0 → デフォルトゲートウェイ
# Check default gateway (Linux)
ip route | grep default
# Check default gateway (Windows)
ipconfig | findstr "Default Gateway"
# Check default gateway (macOS)
netstat -rn | grep default
tracerouteでパケットの経路を追跡
traceroute(Windowsではtracert)は、パケットが宛先に到達するまでに通過するルーターを表示するツールです。
動作原理
- TTL=1のパケットを送信 → 最初のルーターが「Time Exceeded」を返す
- TTL=2のパケットを送信 → 2番目のルーターが「Time Exceeded」を返す
- TTL=nのパケットを送信 → 宛先に到達するまで繰り返す
sequenceDiagram
participant PC as PC
participant R1 as ルーター1
participant R2 as ルーター2
participant Dest as 宛先サーバー
PC->>R1: TTL=1のパケット
R1-->>PC: ICMP Time Exceeded(10ms)
Note over PC: Hop 1: ルーター1のIP
PC->>R1: TTL=2のパケット
R1->>R2: TTL=1に減少
R2-->>PC: ICMP Time Exceeded(25ms)
Note over PC: Hop 2: ルーター2のIP
PC->>R1: TTL=3のパケット
R1->>R2: TTL=2に減少
R2->>Dest: TTL=1に減少
Dest-->>PC: ICMP Port Unreachable(40ms)
Note over PC: Hop 3: 宛先に到達
# Traceroute (Linux/macOS)
traceroute example.com
# Example output:
# 1 192.168.1.1 1.234 ms 0.987 ms 1.102 ms
# 2 10.0.0.1 5.432 ms 4.876 ms 5.123 ms
# 3 172.16.0.1 12.345 ms 11.876 ms 12.098 ms
# 4 93.184.216.34 25.678 ms 24.567 ms 25.234 ms
# Traceroute (Windows)
tracert example.com
tracerouteの読み方
| 要素 | 説明 |
|---|---|
| ホップ番号 | 何番目のルーターか |
| IPアドレス | そのルーターのIPアドレス |
| 応答時間(3回分) | RTT(Round Trip Time)。3回測定 |
* * * |
応答なし(ファイアウォールでブロック等) |
パケットがインターネットを旅する流れ
flowchart LR
subgraph Home["自宅ネットワーク"]
PC["PC\n192.168.1.10"]
GW["ルーター\n192.168.1.1"]
end
subgraph ISP["ISPネットワーク"]
ISP1["ISPルーター1"]
ISP2["ISPルーター2"]
end
subgraph IX["インターネット交換点"]
IXR["IXルーター"]
end
subgraph Dest["宛先ネットワーク"]
DR["宛先ルーター"]
Server["Webサーバー"]
end
PC --> GW --> ISP1 --> ISP2 --> IXR --> DR --> Server
style Home fill:#3b82f6,color:#fff
style ISP fill:#f59e0b,color:#fff
style IX fill:#8b5cf6,color:#fff
style Dest fill:#22c55e,color:#fff
- 自宅ネットワーク: PCからデフォルトゲートウェイ(ルーター)へ
- ISPネットワーク: ISPのルーターを経由
- インターネット交換点(IX): ISP間の接続ポイント(BGPで経路制御)
- 宛先ネットワーク: 宛先のサーバーに到達
まとめ
本日の学習内容
| トピック | ポイント |
|---|---|
| ルーティング | パケットを最適な経路で宛先に転送する仕組み |
| ルーティングテーブル | 宛先ネットワーク、ネクストホップ、メトリックなどを保持 |
| 最長一致 | 最も長いプレフィックスに一致する経路を選択 |
| 静的 vs 動的 | 静的は手動設定、動的はプロトコルで自動学習 |
| RIP | ホップ数ベース。シンプルだが大規模には不向き |
| OSPF | コスト(帯域幅)ベース。エリア構造で大規模対応 |
| BGP | AS間のルーティング。インターネットの骨格 |
| traceroute | TTLを利用して経路上のルーターを特定 |
キーポイント
- 最長一致(Longest Prefix Match) がルーティングの基本原則
- RIPはシンプルだが15ホップの制限があり、小規模向け
- OSPFはエリア構造とSPFアルゴリズムで企業ネットワークに最適
- BGPはAS間の経路制御でインターネット全体を支えている
- tracerouteはTTLを1ずつ増やしてICMP Time Exceededで経路を特定
練習問題
基礎レベル
- 静的ルーティングと動的ルーティングのメリットをそれぞれ2つ挙げてください。
- RIPのメトリックは何で、最大値はいくつですか?
- デフォルトゲートウェイの役割を説明してください。
中級レベル
- 以下のルーティングテーブルがある場合、宛先
10.1.2.100のパケットはどこに転送されますか?宛先 ネクストホップ 10.0.0.0/8 192.168.1.1 10.1.0.0/16 192.168.1.2 10.1.2.0/24 192.168.1.3 0.0.0.0/0 192.168.1.254 - OSPFがRIPよりも大規模ネットワークに適している理由を3つ説明してください。
- tracerouteの出力で
* * *が表示される原因を3つ挙げてください。
チャレンジレベル
- BGPのAS_PATH属性を使った経路選択について、以下のシナリオで説明してください。AS100のルーターがAS200(宛先ネットワーク10.0.0.0/24)への経路を2つ持っています。
- 経路1: AS_PATH = AS300 AS200(AS300経由)
- 経路2: AS_PATH = AS400 AS500 AS200(AS400、AS500経由)
- OSPFのコスト計算について、以下のネットワークでルーターAからルーターDへの最短コスト経路を求めてください(基準帯域幅 = 100Mbps)。
- A → B: 100Mbps リンク
- B → D: 10Mbps リンク
- A → C: 1Gbps リンク
- C → D: 100Mbps リンク
- あなたのPCから
8.8.8.8(Google DNS)へのtracerouteを実行し、各ホップがどのような役割のルーターか推測してください。(実際にコマンドを実行して結果を分析)
参考リンク
- RFC 2328 - OSPF Version 2
- RFC 4271 - A Border Gateway Protocol 4
- RFC 2453 - RIP Version 2
- BGP Tutorial - Internet Society
次回予告
Day 6: DNS では、ドメイン名の仕組み、DNS名前解決のプロセス、DNSレコードの種類(A、AAAA、CNAME、MX、NS、TXT)、再帰クエリと反復クエリの違い、そしてdig/nslookupコマンドを使った実践的なDNSトラブルシューティングを学びます。