プログラマのための IT 教科書

ネットワークの基礎

この部の 6 / 12 章 ・ 全体で 27 / 76 章 ・ 読了目安 45 分

この章を読むとできるようになること
  • CIDR を読んで使えるホスト数を計算できる
  • 同じネットワークか外かで経路が変わることを説明できる
  • VPC・サブネット・セキュリティグループの設定を理解できる

「つながりません」——実務で最も頻繁に発生し、 そして新人が最も手も足も出なくなる症状です。

原因を切り分けるには、パケットがどこを通っているかを頭の中に描ける必要があります。 この章はその土台を作ります。

次の章で扱う DNS・TCP・TLS は、すべてこの上に載っています。

この章の位置づけ

ネットワークは、真面目に学ぶと本1冊では足りません。 この章は実務で必要になる範囲に絞ってまとめたものです。

体系的に学びたくなったら、章末に挙げた資料に進んでください。 ただし、まずはここに書いてあることだけで、実務の切り分けはできます。

層 — どこの話をしているのかを区別する

トラブルの切り分けは、「どの層の問題か」を特定する作業です。

層何をするか識別子代表
アプリケーション中身のやり取りURLHTTP, gRPC, DNS
トランスポートどのアプリに渡すかポート番号TCP, UDP
ネットワークどの機械に届けるかIP アドレスIP, ICMP
データリンク隣の機器へ渡すMAC アドレスEthernet, Wi-Fi
物理電気・電波にするケーブル、電波

上の層は、下の層の詳細を知りません。 だから Wi-Fi でも有線でも HTTP は動きます。

そして障害は、下から順に確認するのが定石です。 IP が届いていないのに HTTP のヘッダを疑っても、時間を失うだけです。

同じネットワークの中 — MAC アドレスと ARP

同じ LAN(同じスイッチにぶら下がっている範囲)では、 IP ではなく MAC アドレスでやり取りしています。

MAC アドレス  機器に固有の識別子(例: 3c:22:fb:1a:2b:3c)
              工場出荷時に決まり、原則として変わらない
IP アドレス   ネットワーク上の「今いる場所」を表す。繋ぐ場所で変わる

例えるなら、MAC は個人の名前、IP は住所です。

IP アドレスは分かっているが MAC が分からない時、 「この IP の人、MAC を教えてください」と同じネットワーク全体に問いかけます。 これが ARP です。

arp -a          # 手元が把握している IP と MAC の対応表
なぜこれを知る必要があるか

実務で ARP を直接触ることは、ほとんどありません。

しかし、「同じネットワークの中か、外か」で通信の仕組みが変わることは、 切り分けで必ず効いてきます。

同じネットワーク内  → 直接届く(スイッチが中継)
違うネットワーク    → ルータに渡す(デフォルトゲートウェイ)

「同じサブネットの他のサーバーには繋がるのに、外には出られない」なら、 ルータかルーティングの問題だと即座に絞り込めます。

IP アドレスとサブネット — 実務で最も使う知識

これが分からないと、クラウドの VPC もファイアウォールも設定できません。

アドレスは2つの部分でできている

192.168.1.10 / 24
└─────┬─────┘ └┬┘
  アドレス     プレフィックス長

上位 24 ビット = ネットワーク部(どのネットワークか)
残り  8 ビット = ホスト部(その中の何番目か)

/24 は「上位24ビットがネットワーク部」という意味です。 この書き方を CIDR 表記と呼びます。

192.168.1.0/24  というネットワークに属するアドレス:
  192.168.1.0    ← ネットワークアドレス(そのネットワーク自身を指す。ホストに使えない)
  192.168.1.1    ← 使える(ルータに割り当てられることが多い)
  ...
  192.168.1.254  ← 使える
  192.168.1.255  ← ブロードキャストアドレス(全員宛て。ホストに使えない)

使えるホスト数: 256 - 2 = 254

よく使うサイズ

表記ホスト部アドレス数使えるホスト数
/320 bit11(特定の1台を指す)
/293 bit86
/284 bit1614
/248 bit256254
/1616 bit65,53665,534
/824 bit16,777,216約1677万

覚え方: /24 から数字が 1 減るごとに、アドレス数は2倍になります。

/24 = 256
/23 = 512
/22 = 1024
`0.0.0.0/0` の意味
0.0.0.0/0    ネットワーク部が 0 ビット = 「すべてのアドレス」

ファイアウォールの設定で 0.0.0.0/0 を許可すると、 全世界からのアクセスを許可するという意味になります。

□ 「とりあえず 0.0.0.0/0 で許可」→ SSH ポートが全世界に開く
□ セキュリティグループで最もよくある事故

同じ理由で、listen アドレスの 0.0.0.0 は「すべてのインターフェースで待ち受ける」 という意味です(Docker を使いこなすのコンテナの話)。

同じネットワークかどうかの判定

通信相手が同じネットワークにいるかは、ネットワーク部が一致するかで決まります。

自分:   192.168.1.10/24   → ネットワーク部 192.168.1
相手A:  192.168.1.50      → 一致 → 直接届ける
相手B:  192.168.2.50      → 不一致 → ルータ(デフォルトゲートウェイ)に渡す

この判定を間違えると、通信できません。

自分:   192.168.1.10/24
相手:   192.168.1.50/16   ← マスクが違う
→ 自分から見れば同じネットワーク、相手から見れば違うネットワーク
→ 行きは届くが、帰りが返ってこない

「片方向だけ通信できる」という奇妙な症状の原因になります。

プライベート IP と NAT

インターネットで使える IP アドレス(グローバル IP)は有限で、有料です。 そのため、社内やクラウドの内部ではプライベート IP を使います。

10.0.0.0/8         大きい。クラウドの VPC でよく使われる
172.16.0.0/12      Docker が既定で使うことがある
192.168.0.0/16     家庭やオフィスの LAN

これらのアドレスは、インターネット上には存在できません。 だから外に出る時に、グローバル IP に書き換えます。これが NAT です。

[PC 192.168.1.10:52341] → [ルータ] → [インターネット 203.0.113.5:41002]
                            ↑ 送信元 IP とポートを書き換え、対応表を持つ
                            ← 返ってきたら、元に戻して PC へ渡す
なぜ「外から中には入れない」のか

NAT の対応表は、内側から出た通信の分しか作られません。

外から 203.0.113.5 に来たパケットは、 中の誰宛てか分からないので捨てられます。

だから、

□ 家庭のPCは、外から直接アクセスされない(結果的な防御になっている)
□ サーバーを公開するには、明示的に「このポートはこの機器へ」と設定が必要
   (ポートフォワーディング)
□ クラウドでは、外部からアクセスさせたいものにだけグローバル IP や
   ロードバランサを付ける

クラウドの基礎の「VM にグローバル IP を付けずに踏み台経由で入る」も、この考え方です。

ルーティング — 経路の決め方

自分のネットワークの外に出す時、どのルータに渡すかを決めるのがルーティングです。

# 経路表を見る
ip route          # Linux
netstat -rn       # macOS
default via 192.168.1.1 dev en0        ← どれにも当てはまらない時はここへ(デフォルトゲートウェイ)
192.168.1.0/24 dev en0                 ← このネットワークは直接届く
10.8.0.0/16 via 10.8.0.1 dev utun0     ← VPN 経由

より具体的な(プレフィックス長が長い)経路が優先されます。

10.0.0.0/8   → ルータA
10.0.5.0/24  → ルータB     ← 10.0.5.x 宛てはこちらが選ばれる
VPN を繋いだら社内には入れるが、外に出られない

VPN クライアントが 0.0.0.0/0 の経路を追加し、 すべての通信を VPN 経由にした場合に起きます。

逆に、社内システムだけを VPN 経由にする設定(スプリットトンネル)だと、 必要な経路が入っていなくて社内に届かないことがあります。

ip route を見れば、どちらなのか一目で分かります。

ポート番号 — どのアプリに渡すか

IP アドレスは機械を指しますが、1台の機械では複数のアプリが動いています。 どのアプリに渡すかを決めるのがポート番号です。

通信相手は「IP アドレス : ポート番号」の組で決まる
   203.0.113.5:443
範囲用途
0〜1023well-known(22:SSH, 80:HTTP, 443:HTTPS, 53:DNS, 5432:PostgreSQL は 1024超)
1024〜49151登録済み(3000, 8080 などもここ)
49152〜65535エフェメラルポート(送信側が一時的に使う)
エフェメラルポートの枯渇

クライアントが接続するたびに、送信元ポートが1つ消費されます。

大量の短い接続を繰り返すと、使えるポートが枯渇します。 TIME_WAIT 状態の接続がポートを保持し続けることも一因です。

ss -s                    # 状態ごとの接続数を見る
ss -tan | awk '{print $1}' | sort | uniq -c

症状は「しばらく動くと突然接続できなくなる」です。

対策は、接続を使い回すこと(HTTP の Keep-Alive、 コネクションプール。性能と負荷対策)。 毎回新しい接続を張る実装は、規模が大きくなると必ず問題になります。

Linux で「1024未満のポートで listen するには root 権限が必要」という制約があるのは、 コンテナを非 root で動かす時(Docker を使いこなす)に効いてきます。 アプリは 8080 で listen し、外側で 80 に変換するのが定石です。

TCP と UDP

TCPUDP
到達保証ある(再送する)ない
順序保証するしない
接続事前に確立する(3ウェイ)いきなり送る
速度遅い(確認の往復がある)速い
用途HTTP, DB, gRPCDNS, 動画・音声, QUIC

迷ったら TCP です。UDP を選ぶのは、 「多少落ちても、速いほうが価値がある」場合に限られます。

なお、HTTP/3 は UDP の上に作られています(QUIC)。 「信頼性が要らない」のではなく、TCP の制約を避けるために、 必要な仕組みを自前で持っているという構成です。

MTU — 一度に送れる大きさ

1回で送れるデータの上限を MTU と呼びます(Ethernet では通常 1500 バイト)。 これを超えるデータは、分割されて送られます。

「小さいリクエストは通るのに、大きいものだけ失敗する」

VPN やトンネルを経由すると、追加のヘッダの分だけ MTU が小さくなります。

□ 小さいリクエスト → 通る
□ 大きいリクエスト → 途中で捨てられ、応答が返らない(タイムアウト)

この症状を見たら MTU を疑ってください。 「なぜか特定の API だけ失敗する」の、地味だが実在する原因です。

# 分割を禁止して、通るサイズを調べる(macOS)
ping -D -s 1472 8.8.8.8

クラウドと Kubernetes でどう現れるか

ここまでの知識は、そのままクラウドの設定画面に出てきます。

概念クラウドでの姿
ネットワークVPC
サブネットサブネット(10.0.1.0/24 のように切る)
ルーティングルートテーブル
ファイアウォールセキュリティグループ / ファイアウォールルール
NATCloud NAT / NAT ゲートウェイ
デフォルトゲートウェイインターネットゲートウェイ
サブネットのサイズは後から変えにくい

VPC を 10.0.0.0/16、サブネットを /24 で切ったとします。

1サブネットあたり使えるアドレス: 約250
Kubernetes では、Pod ごとに IP が割り当てられることがある
→ Pod が250を超えた時点で、それ以上スケールできない

「アドレスが足りなくなってクラスタを作り直す」 は実際に起きます。 最初に余裕を持って設計してください(クラウドの基礎)。

Kubernetes では、さらに層が重なります。

Pod IP        Pod ごとに割り当てられる。再作成のたびに変わる
Service       変わらない仮想 IP(ClusterIP)。Pod への振り分けを担う
DNS           service-name.namespace.svc.cluster.local で解決される

「Pod の IP を直接指定してはいけない」理由は、これで説明がつきます(コンテナと Kubernetes)。

実務の落とし穴まとめ

  1. 0.0.0.0/0 で許可 — 全世界に開く。セキュリティグループの事故の定番
  2. サブネットマスクの不一致 — 片方向だけ通信できるという奇妙な症状
  3. サブネットを小さく切りすぎる — 後からアドレスが足りなくなる
  4. 接続を毎回張り直す — エフェメラルポートが枯渇する
  5. MTU を疑わない — 大きいリクエストだけ失敗する
  6. Pod IP を直接指定 — 再作成で変わる
  7. 127.0.0.1 で listen — 外から繋がらない(Docker を使いこなす)
  8. プライベート IP に外から繋ごうとする — NAT の対応表が無い

まとめ

  • 切り分けはどの層の問題かを特定する作業。下から順に見る
  • MAC は名前、IP は住所。同じネットワークか外かで経路が変わる
  • CIDR(/24 など)はネットワーク部の長さ。 /24 は254台、数字が1減るごとにアドレス数は2倍
  • 0.0.0.0/0 はすべて。ファイアウォールでは危険、listen では必要
  • プライベート IP は外に出られない。NAT が書き換える。 だから外から中には入れない
  • 経路はより具体的なものが優先。ip route で確認する
  • 通信相手は IP:ポート の組。エフェメラルポートは枯渇する
  • 迷ったら TCP。HTTP/3 は UDP の上に必要な仕組みを自前で持つ
  • MTU は「大きいものだけ失敗する」の原因
  • これらはそのまま VPC・サブネット・セキュリティグループとして現れる

さらに学ぶには

この章は実務で必要な範囲に絞っています。 体系的に学ぶなら、次が定番です。

資料特徴
3分間ネットワーク基礎講座日本語。1テーマずつ短く読める。最初の1つに向く
Cloudflare Learning Center英語。図が分かりやすく、DNS・TLS・CDN が特に充実
High Performance Browser Networking英語・全文無料。TCP/TLS/HTTP を性能の観点から。次の章の理解が深まる
『ネットワークはなぜつながるのか』(日経BP)書籍。ブラウザに URL を打ってから画面が出るまでを1冊で追う
『マスタリングTCP/IP 入門編』(オーム社)書籍。定番の教科書。手元に置いて引く用
読む順番の提案
1. この章と次の章を読む(実務の切り分けはここまでで足りる)
2. 詰まった箇所だけ、上の資料で該当部分を読む
3. 余裕ができたら『ネットワークはなぜつながるのか』を通読する

最初から体系的に読もうとすると、たいてい途中で止まります。 必要になった時に引くほうが定着します(新しい言語をどう学ぶか)。

公式ドキュメント

上の資料は解説です。仕様そのものを確かめたい時はこちらに戻ってください。

対象リンク
RFC Editor(プロトコルの仕様)https://www.rfc-editor.org/
IANA(ポート番号・IP アドレスの割り当て)https://www.iana.org/numbers
JPNIC(日本のアドレス管理・用語集)https://www.nic.ad.jp/ja/
誰がどう決めているかは規格は誰が決めているのか

章末問題

`192.168.10.0/24` のサブネットに、サーバーを最大何台置けますか。

社内の別サーバーには繋がるのに、インターネットには出られません。最初に確認するのは?

次の章では、この上で動く DNS・TCP・TLS を見ていきます。

読み終わったら記録しておくと、目次で進み具合が分かります。