ネットワークの基礎
この部の 6 / 12 章 ・ 全体で 27 / 76 章 ・ 読了目安 45 分
- CIDR を読んで使えるホスト数を計算できる
- 同じネットワークか外かで経路が変わることを説明できる
- VPC・サブネット・セキュリティグループの設定を理解できる
「つながりません」——実務で最も頻繁に発生し、 そして新人が最も手も足も出なくなる症状です。
原因を切り分けるには、パケットがどこを通っているかを頭の中に描ける必要があります。 この章はその土台を作ります。
次の章で扱う DNS・TCP・TLS は、すべてこの上に載っています。
ネットワークは、真面目に学ぶと本1冊では足りません。 この章は実務で必要になる範囲に絞ってまとめたものです。
体系的に学びたくなったら、章末に挙げた資料に進んでください。 ただし、まずはここに書いてあることだけで、実務の切り分けはできます。
層 — どこの話をしているのかを区別する
トラブルの切り分けは、「どの層の問題か」を特定する作業です。
| 層 | 何をするか | 識別子 | 代表 |
|---|---|---|---|
| アプリケーション | 中身のやり取り | URL | HTTP, 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
よく使うサイズ
| 表記 | ホスト部 | アドレス数 | 使えるホスト数 |
|---|---|---|---|
/32 | 0 bit | 1 | 1(特定の1台を指す) |
/29 | 3 bit | 8 | 6 |
/28 | 4 bit | 16 | 14 |
/24 | 8 bit | 256 | 254 |
/16 | 16 bit | 65,536 | 65,534 |
/8 | 24 bit | 16,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 で許可」→ 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 # macOSdefault 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 クライアントが 0.0.0.0/0 の経路を追加し、
すべての通信を VPN 経由にした場合に起きます。
逆に、社内システムだけを VPN 経由にする設定(スプリットトンネル)だと、 必要な経路が入っていなくて社内に届かないことがあります。
ip route を見れば、どちらなのか一目で分かります。
ポート番号 — どのアプリに渡すか
IP アドレスは機械を指しますが、1台の機械では複数のアプリが動いています。 どのアプリに渡すかを決めるのがポート番号です。
通信相手は「IP アドレス : ポート番号」の組で決まる
203.0.113.5:443
| 範囲 | 用途 |
|---|---|
| 0〜1023 | well-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
| TCP | UDP | |
|---|---|---|
| 到達保証 | ある(再送する) | ない |
| 順序 | 保証する | しない |
| 接続 | 事前に確立する(3ウェイ) | いきなり送る |
| 速度 | 遅い(確認の往復がある) | 速い |
| 用途 | HTTP, DB, gRPC | DNS, 動画・音声, 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 のように切る) |
| ルーティング | ルートテーブル |
| ファイアウォール | セキュリティグループ / ファイアウォールルール |
| NAT | Cloud 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)。
実務の落とし穴まとめ
0.0.0.0/0で許可 — 全世界に開く。セキュリティグループの事故の定番- サブネットマスクの不一致 — 片方向だけ通信できるという奇妙な症状
- サブネットを小さく切りすぎる — 後からアドレスが足りなくなる
- 接続を毎回張り直す — エフェメラルポートが枯渇する
- MTU を疑わない — 大きいリクエストだけ失敗する
- Pod IP を直接指定 — 再作成で変わる
127.0.0.1で listen — 外から繋がらない(Docker を使いこなす)- プライベート 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 を見ていきます。