🌐
概念 #TCP/IP #ネットワーク #IP #ルーティング #NAT #ICMP 📚 TCPIPネットワーク

ネットワーク層(IP)詳解

IPアドレス・サブネット・ルーティング・ICMP・NATを徹底解説。「どこへ届けるか」を担う層の全機能。

ネットワーク層の責務

データリンク層が「隣のホップへの配送」を担うのに対し、ネットワーク層はエンドツーエンド(送信元から最終宛先まで)の経路制御を担う。

┌──────────────────────────────────────────────────────┐
│  ネットワーク層(Layer 3)                              │
│  責務:エンドツーエンドのパケット転送                   │
│  主なプロトコル:IP, ICMP, ARP(実装上の位置はここ)    │
│  識別子:IPアドレス                                    │
│  単位:パケット                                        │
└──────────────────────────────────────────────────────┘

ベストエフォート型:IPは「できる限り届ける」が、届ける保証はしない。順序保証・再送もしない。それらはトランスポート層(TCP)の役割。


IPアドレスの構造

IPv4アドレス(32ビット)

IPアドレス:192.168.1.100
  ↓ 2進数で表すと
  11000000.10101000.00000001.01100100

┌──────────────────────────────────┐
│         32ビット全体              │
│  ネットワーク部    │  ホスト部     │
│  (どのネットワーク) │ (そのPC識別)  │
└──────────────────────────────────┘

CIDR(Classless Inter-Domain Routing)

192.168.1.0/24/24 はサブネットマスクのビット数。

/24 の意味:先頭24ビットがネットワーク部

IPアドレス:    192.168.1.100
               11000000.10101000.00000001.01100100
サブネットマスク:11111111.11111111.11111111.00000000 = 255.255.255.0
                └────────────────────────┘└────────┘
                      ネットワーク部        ホスト部
                      (192.168.1)          (100)

ネットワークアドレス(ホスト部=0): 192.168.1.0
ブロードキャストアドレス(ホスト部=全1): 192.168.1.255
使用可能ホスト数: 2^8 - 2 = 254台(0と255は特殊用途)

CIDR早見表

CIDRサブネットマスクホスト数用途例
/8255.0.0.016,777,214大規模ネットワーク(旧クラスA)
/16255.255.0.065,534中規模ネットワーク
/24255.255.255.0254一般的なLAN
/25255.255.255.128126LANの分割
/28255.255.255.24014小規模セグメント
/30255.255.255.2522ルーター間のリンク
/32255.255.255.2551ホストルート・ループバック

プライベートアドレス空間

インターネットに直接ルーティングされない、LAN内専用のアドレス(RFC 1918)。

範囲CIDR用途
10.0.0.0 〜 10.255.255.25510.0.0.0/8大規模LAN、クラウドVPC
172.16.0.0 〜 172.31.255.255172.16.0.0/12中規模LAN、Dockerデフォルト
192.168.0.0 〜 192.168.255.255192.168.0.0/16家庭・小規模オフィスLAN

その他特殊なアドレス:

  • 127.0.0.1/8(ループバック):自分自身
  • 169.254.0.0/16(リンクローカル):DHCPが失敗した時のOS自動割り当て
  • 0.0.0.0/0(デフォルトルート):「どこへでも」を意味するルーティング表現

IPv4ヘッダの全フィールド

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─────────────┼──────────────────────────────────────────┤
│Ver│IHL│    DSCP/ECN  │            Total Length                  │
├──────────────────────┼───┼─┼────────────────────────────────────┤
│      Identification  │Flg│DF│        Fragment Offset             │
├──────────────────────┼─────────────────────────────────────────┤
│       TTL            │  Protocol  │         Header Checksum       │
├─────────────────────────────────────────────────────────────────┤
│                       Source IP Address                          │
├─────────────────────────────────────────────────────────────────┤
│                    Destination IP Address                        │
└─────────────────────────────────────────────────────────────────┘
フィールドビット説明
Version4IPv4=4, IPv6=6
IHL4ヘッダ長(32bit単位)。通常5=20バイト
DSCP/ECN8QoS優先度・輻輳通知
Total Length16IPパケット全体の長さ(ヘッダ+ペイロード)
Identification16フラグメント時の識別子(同じIDのフラグメントを再結合)
Flags3bit1=DF(フラグメント禁止), bit2=MF(後続フラグメントあり)
Fragment Offset13フラグメントの開始位置(8バイト単位)
TTL8ホップ通過ごとに-1。0になるとルーターが廃棄しICMP送信
Protocol8TCP=6, UDP=17, ICMP=1
Header Checksum16ヘッダのチェックサム(ペイロードは対象外)
Source IP32送信元IPアドレス
Destination IP32宛先IPアドレス

フラグメンテーション

MTU(通常1500バイト)を超えるパケットはIPレベルで分割される。

元パケット(4000バイトのデータ + 20バイトIPヘッダ = 4020バイト)
   ↓ MTU=1500 のネットワークを通過
Fragment 1: offset=0,    len=1480バイト, MF=1(後続あり)
Fragment 2: offset=185,  len=1480バイト, MF=1(8バイト×185=1480)
Fragment 3: offset=370,  len=1040バイト, MF=0(最後)

DF(Don’t Fragment)ビット:このビットが立っているとルーターはフラグメントせず廃棄しICMP(Type3 Code4)を返す。TCP は通常DFビットを立ててPath MTU Discoveryを行う。


ルーティング:パケットの経路決定

ルーティングテーブルの読み方

# Linuxでのルーティングテーブル表示
ip route show

# 出力例
default via 192.168.1.1 dev eth0 proto static
10.0.0.0/8 via 10.0.0.1 dev eth1 proto static
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
ルーティングテーブルの構造:
┌──────────────────┬─────────────────┬───────────┬────────┐
│  宛先ネットワーク  │  ネクストホップ  │  出力 I/F │ メトリック│
├──────────────────┼─────────────────┼───────────┼────────┤
│  0.0.0.0/0       │  192.168.1.1    │  eth0     │  100   │ ← デフォルトルート
│  10.0.0.0/8      │  10.0.0.1       │  eth1     │  50    │
│  192.168.1.0/24  │  直結            │  eth0     │  0     │ ← 直接接続
└──────────────────┴─────────────────┴───────────┴────────┘

最長一致(Longest Prefix Match)

宛先IPに対して、最もプレフィックスが長い(具体的な)エントリが優先される。

宛先IP: 10.10.20.5 の場合

エントリ候補:
  0.0.0.0/0     → 一致(0ビット一致)
  10.0.0.0/8    → 一致(8ビット一致)
  10.10.0.0/16  → 一致(16ビット一致)
  10.10.20.0/24 → 一致(24ビット一致)← 最長一致。これを使う

「より具体的なルートが優先される」という原則。

動的ルーティングプロトコル

プロトコル種別用途
RIPディスタンスベクタ小規模(使われなくなっている)
OSPFリンクステート企業内ネットワーク(IGP)
BGPパスベクタインターネットバックボーン(EGP)

エンジニアが実務で意識するのは主にBGP(クラウドプロバイダとの接続)とOSPF(オンプレ内ルーティング)。


ICMP:ネットワーク層の制御メッセージ

ICMPはIPの補助プロトコルで、エラー通知・診断に使われる。

ICMPパケット = IPヘッダ(Protocol=1)+ ICMPヘッダ + データ

主要なICMPメッセージ

TypeCode意味用途
00Echo Replypingの応答
30Dest Unreachable: Net宛先ネットワーク到達不可
31Dest Unreachable: Host宛先ホスト到達不可
33Dest Unreachable: Portポートが開いていない(UDP)
34Dest Unreachable: Frag neededPath MTU Discovery
80Echo Requestpingの送信
110Time ExceededTTL切れ(tracerouteが利用)
120Parameter Problemヘッダ不正

ping と traceroute の仕組み

# ping の動作
ping 8.8.8.8
# 1. ICMP Echo Request(Type8)を送信
# 2. 宛先から ICMP Echo Reply(Type0)が返る
# 3. RTT(往復時間)を計測

# traceroute の動作
traceroute 8.8.8.8
# TTL=1 でパケット送信 → 最初のルーターで TTL切れ → ICMP Time Exceeded(Type11)受信 → 1ホップ目のIPアドレス判明
# TTL=2 でパケット送信 → 2ホップ目で TTL切れ → 2ホップ目のIP判明
# ...最終宛先まで繰り返す

NAT/NAPT:プライベートアドレスでインターネット接続

IPv4アドレスの枯渇対策として、多くの環境でNAT(Network Address Translation)が使われる。

NAPT(IPマスカレード)の動作

【送信時(内→外)】
LAN内PC (192.168.1.10:54321) → Internet (203.0.113.5:443)

NATルーターの変換テーブル:
┌─────────────────────┬──────────────────────┬──────────────────────┐
│ 内部 (src IP:port)  │ 外部 (変換後 IP:port) │ 宛先 (dst IP:port)   │
├─────────────────────┼──────────────────────┼──────────────────────┤
│ 192.168.1.10:54321  │ 1.2.3.4:40001        │ 203.0.113.5:443      │
│ 192.168.1.20:54322  │ 1.2.3.4:40002        │ 203.0.113.5:443      │
└─────────────────────┴──────────────────────┴──────────────────────┘
      ↑ 複数の内部IPが1つのグローバルIPを共有(ポート番号で識別)

【受信時(外→内)】
Internet (203.0.113.5:443) → NATルーター (1.2.3.4:40001)
→ テーブルから 40001 = 192.168.1.10:54321 を逆引き
→ 192.168.1.10:54321 へ転送

NATの問題点とエンジニアへの影響

問題1:サーバーとしての動作が難しい
  → 外部からの着信接続はNATテーブルにエントリがないと転送先不明
  → 対策:ポートフォワーディング(特定ポートを内部ホストに固定転送)

問題2:アプリケーションがIPアドレスをペイロードに埋め込む
  → SIPなどのプロトコルはIPをアプリデータ内に書く → NATが書き換えられない
  → 対策:ALG(Application Layer Gateway)でペイロードも書き換え

問題3:接続追跡テーブルのメモリ
  → 高接続数サーバーでは「conntrack: table full」エラー
  → sysctl net.netfilter.nf_conntrack_max で調整

ルーティング実践:ip コマンドチートシート

# ルーティングテーブル確認
ip route show
ip route show table all  # 全ルーティングテーブル

# 特定宛先の経路確認(どのインターフェースを使うか)
ip route get 8.8.8.8
# 出力例: 8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.10

# 静的ルートの追加
ip route add 10.0.0.0/8 via 192.168.2.1 dev eth1

# 静的ルートの削除
ip route del 10.0.0.0/8

# インターフェースのIPアドレス確認
ip addr show

# NATテーブルの確認(conntrack)
conntrack -L
conntrack -s 192.168.1.10  # 特定IPのセッション

ネットワーク診断フロー

接続できない!→
  1. ip addr show         → 自分のIPが正しく設定されているか
  2. ip route show        → デフォルトゲートウェイが設定されているか
  3. ping <ゲートウェイIP>  → L3レベルでGWに届くか
  4. ping 8.8.8.8         → インターネットへのL3疎通
  5. ping google.com      → DNS解決は別問題(L7)
  6. traceroute 8.8.8.8   → どのホップで詰まっているか

出典: TCP/IP入門・図解入門