はじめに
この記事はAWSに自作アプリをデプロイするための学習記録です。
筆者の自己紹介
- 異業種、実務未経験からフルスタックエンジニアを目指して転職活動中
- 2024年10月から学習を開始、オンラインスクール卒業を経て、現在も学習を継続中
ポートフォリオアプリ:https://github.com/geek-3340/Fameal_app/tree/main
前回までの記事:
今回の内容
前回まではLinuxコマンドの基礎・応用についてまとめてきました。
今回はAWSのVPC(仮想ネットワーク)設計をする上で必須の基礎知識となるネットワーク基礎(IPアドレス・サブネット・CIDR・NATなど)について
特にCIDR記法は、AWSでVPCを作る時に10.0.0.0/16みたいな表記が大量に出てくるんですが、ここを理解せずに進めると「呪文を写経している」状態になりかねないので、理解できるように丁寧に解説していきます。
学習記録
IPアドレスについて
IPアドレスとは、ネットワーク上における機器の住所
インターネット上の全てのPC・スマホ・サーバー・ルーターなどは固有のIPアドレスを持っており、これがないと「どこに通信を送ればいいか」が決まらない
現在主流のIPv4は192.168.1.1のように4つの数字をドットで区切った形式で表現される
192 . 168 . 1 . 1
↑ ↑ ↑ ↑
8bit 8bit 8bit 8bit = 合計32bit
各数字は0〜255の範囲(8ビット = 2の8乗 = 256通り)で表現され、合計約43億通りのアドレスが作れる
43億通りでは世界中の機器をカバーできないため、NAT(後述)やIPv6が登場した、という背景がある
自分のIPを確認
ip addr
出力例
1: lo: <LOOPBACK,UP,LOWER_UP> ...
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet 172.x.x.x/20 scope global eth0
注目すべきは以下の2つ
-
lo(loopback): 自分自身を指す特殊なIPアドレスで、IPは常に127.0.0.1。よくあるhttp://localhost:8000などにアクセスする時のlocalhostがこれ -
eth0: メインのネットワークインターフェース。私(Windows→WSL)の場合ここに表示されているIPがWSL2のIP
プライベートIPとパブリックIP
IPアドレスは大きく分けて2種類ある
パブリックIP
インターネット上で世界に1つだけの一意なIP
ICANNという組織が管理しており、ISP(インターネットプロバイダ)経由で割り当てられる
自分の自宅のグローバルIPは以下のコマンドで確認可能
curl ifconfig.me
プライベートIP
特定のネットワーク内だけで使えるIP
家のWi-Fiに繋がってる機器は全部プライベートIPを持っている
プライベートIPに使える範囲は3つだけ予約されている
| 範囲 | CIDR表記(後述) | 主な用途 |
|---|---|---|
10.0.0.0 〜 10.255.255.255
|
10.0.0.0/8 |
大規模ネットワーク、AWS VPCでよく使う |
172.16.0.0 〜 172.31.255.255
|
172.16.0.0/12 |
Docker、WSL2のデフォルト |
192.168.0.0 〜 192.168.255.255
|
192.168.0.0/16 |
家庭用ルーター等 |
例として、
- 先ほどの
ip addrで見えたWSL2のIP(172.x.x.x)は、仮想ネットワークの中のプライベートIP - 家のWi-FiからPCへの参照するアドレスは
192.168.x.xになっているはず
なぜ分けるのか
パブリックIPの枯渇問題が一番の理由
43億個では世界中の機器を賄えないので、以下のような運用になっている
- 家庭・社内ではプライベートIPを使う(自由に何個でも振れる)
- インターネットに出る時だけ、ルーターがパブリックIPに変換する(NATを用いる、後述)
これで「1つのパブリックIPで、家中の機器が同時にインターネットに出られる」状態が実現する
CIDR記法を理解する
ここがAWSのVPC設計で呪文に見えるか、意味が見えるかの分かれ目
CIDR (Classless Inter-Domain Routing) とは、IPアドレスの範囲を表す記法
192.168.1.0/24のように、IPアドレス + スラッシュ + 数字で書く
スラッシュの後の数字はプレフィックス長と呼ばれ、「先頭から何ビットがネットワーク部か」を示している
プレフィックス長の意味
IPv4は32ビットなので、プレフィックス長は0〜32の範囲を取る
192.168.1.0/24
↑
「先頭24ビットがネットワーク部、残り8ビットがホスト部」
- ネットワーク部: 「どのネットワークに属するか」を示す共通部分
- ホスト部: 「そのネットワーク内のどの機器か」を示す個別部分
例えば192.168.1.0/24の場合
192 . 168 . 1 . 0
└────ネットワーク部────┘ └ホスト部┘
(先頭24ビット固定) (8ビット自由)
ネットワーク部は固定となるため
このネットワークでは192.168.1.0 〜 192.168.1.255の256個のIPが使える
プレフィックス長 → IP個数の対応表
| プレフィックス | ホストビット数 | IP個数 | 例 |
|---|---|---|---|
/16 |
16 | 65,536個 |
10.0.0.0/16 = 10.0.0.0 〜 10.0.255.255
|
/24 |
8 | 256個 |
192.168.1.0/24 = 192.168.1.0 〜 192.168.1.255
|
/32 |
0 | 1個 | 単一IPを指す |
計算式: IP個数 = 2のホストビット数乗
/24なら2の8乗 = 256、/16なら2の16乗 = 65,536、というように計算できる
AWSのVPC設計を解読してみる
AWSのVPC構築では以下のような構成がよく出てくる
VPC: 10.0.0.0/16
├── パブリックサブネット 1: 10.0.1.0/24
├── パブリックサブネット 2: 10.0.2.0/24
├── プライベートサブネット 1: 10.0.11.0/24
└── プライベートサブネット 2: 10.0.12.0/24
CIDRの知識をベースに翻訳すると以下のようになる
-
VPC
10.0.0.0/16:10.0.0.0〜10.0.255.255の65,536個のIP空間を確保 -
サブネット
10.0.1.0/24: VPCのCIDR範囲内から10.0.1.0〜10.0.1.255の256個の領域を割り当て - 同様に
10.0.2.0/24は次の256個、10.0.11.0/24はちょっと離れた範囲の256個
つまり、「大きい入れ物(VPC)の中を、用途別に小さく区切る(サブネット)」 という設計
/16と/24の関係を絵にするとこんな感じ
VPC /16 (65536個のIP)
┌─────────────────────────────────────────────┐
│ 10.0.0.0 ─────────────────── 10.0.255.255 │
│ │
│ ┌──/24──┐ ┌──/24──┐ ┌──/24──┐ ... │
│ │10.0.1 │ │10.0.2 │ │10.0.11│ │
│ │ .0 ~ │ │ .0 ~ │ │ .0 ~ │ │
│ │ .255 │ │ .255 │ │ .255 │ │
│ └───────┘ └───────┘ └───────┘ │
└─────────────────────────────────────────────┘
なぜ「11、12」と離れた番号を使うかというと、「将来 .3 .4 .5 ... を別の用途で追加できるよう余裕を残している」 という設計思想によるもの
ルーティング
ルーティングとは、パケットがどの経路を通って宛先に届くかを決める仕組み
https://google.comにアクセスする時の通信は、以下のような旅をしている
あなたのPC
↓
家のルーター (192.168.x.x ネットワークの出口)
↓
ISPのルーター
↓
インターネット上の複数のルーター (世界中をホップ)
↓
GoogleのデータセンターのIP
各ルーターは「この宛先IPなら、次はあのルーターに渡せばいい」というルートテーブル(経路表) を持っていて、それを見てパケットを次へ次へとバトンタッチしている
自分の経路を見てみる
ip route
出力例
default via 172.x.x.1 dev eth0
172.x.x.0/20 dev eth0 proto kernel scope link src 172.x.x.x
読み方
-
default via 172.x.x.1: 「どこに送るか決まらないパケットは、172.x.x.1(= デフォルトゲートウェイ)に送る」 -
172.x.x.0/20 dev eth0: 「同じネットワーク(自分と同じ172.x.x.0/20の範囲)宛なら、eth0から直接送る」
デフォルトゲートウェイ = 「自分のネットワーク外への出口となるルーター」のこと
家庭で言えばWi-Fiルーターがコレに該当する
tracerouteで経路を可視化
sudo apt install -y traceroute
traceroute google.com
各行が「経由したルーター」を表しており、自分からGoogleまで何ホップかかってるかが見える
だいたい10〜20ホップくらいになるはず
各行の*は「応答返してくれないルーター」(セキュリティ上、応答しない設定が多い)
tracerouteを使うと「インターネットは無数のルーターの中継で成り立っている」というイメージが視覚化されて理解が深まる
NAT (Network Address Translation)
「家には10台の機器があるのに、パブリックIPは1個しかない。どうやって全機器がインターネットに出るのか?」これを解決するのがNATである
NATの動き
[PC1: 192.168.1.10] ─┐
[PC2: 192.168.1.11] ─┼─→ [ルーター: 内側 192.168.1.1, 外側 203.0.113.5] ─→ インターネット
[Phone: 192.168.1.12]┘
PC1がGoogleにリクエストを送る時の流れ
- PC1が「送信元 192.168.1.10 → 宛先 google.com」のパケットを送る
- ルーターが「
192.168.1.10はプライベートIPだからインターネットに出せない」と判断し、送信元を自分のパブリックIP203.0.113.5に書き換える - ルーターは「レスポンスが返ってきた時、それがPC1宛だと分かるように、変換表(NATテーブル)に記録」
- Googleからのレスポンスは
203.0.113.5宛で返ってくる - ルーターが変換表を見て「このレスポンスはPC1宛てだ」と判断、宛先を
192.168.1.10に書き換えてPC1に渡す
これがNAT (Network Address Translation) の仕組み
AWSでのNAT
後ほどのWeekで出てくるNATゲートウェイは、これのAWSマネージドサービス版
[プライベートサブネットのEC2] → [NATゲートウェイ] → [インターネットゲートウェイ] → インターネット
プライベートサブネットのEC2にNATが必要な理由
プライベートサブネットの機器は、セキュリティのためインターネットから直接アクセスできないようにしてある
でも、こちら側からOSアップデートや外部APIに繋ぎたい時はある
そういう「出る時だけ通る出口」がNATゲートウェイ
ちなみにNATゲートウェイは月50ドル近くかかるため、学習中の地味なコストの主犯だったりする
ゲートウェイ
ここまで何度か出てきた言葉の整理
ゲートウェイとは、ネットワーク間の出入り口のこと
-
家庭: Wi-Fiルーターが、家庭内ネットワーク(
192.168.x.x)とインターネットの間のゲートウェイ -
AWS VPC:
- インターネットゲートウェイ (IGW): VPCとインターネットの間のゲートウェイ
- NATゲートウェイ: プライベートサブネットからインターネット方向への片道ゲートウェイ
- VPC Endpoint: VPCとAWSサービス(S3など)の間のゲートウェイ
「ゲートウェイ」という言葉自体は概念的なもので、具体的な実装は文脈によって違うという認識でOK
ポートのおさらい
ポートとは、1台のサーバーで複数のプログラムを区別するための番号
http://example.com:80
↑
ポート番号
1台のサーバー(1つのIPアドレス)に対して通信を行う際
- Webサーバーは80番(HTTP)または443番(HTTPS)
- AWSのEC2やDockerコンテナなどへのリモート接続(SSH)は22番
- DBは5432番
のように窓口を分けることで、1つのサーバー(IPアドレス)から同時に複数のサービスを提供できる
よく出るポート番号
| ポート | プロトコル | 用途 |
|---|---|---|
| 22 | SSH | リモートログイン |
| 80 | HTTP | Web(暗号化なし) |
| 443 | HTTPS | Web(暗号化あり) |
| 3306 | MySQL | DB |
| 5432 | PostgreSQL | DB |
| 6379 | Redis | キャッシュ・セッション |
| 8000, 8080, 3000 | - | 開発用によく使う |
ssコマンドで、自分のマシンで開いてるポートが確認できる
sudo ss -tlnp
| オプション | 意味 |
|---|---|
-t |
TCPだけ |
-l |
LISTEN状態(受付中)のものだけ |
-n |
数字表記(名前解決しない) |
-p |
どのプロセスが使ってるか表示 |
本番サーバーで「80番ポートで何が動いているか確認」したい時に使えるコマンド
おわりに
今回はネットワーク基礎についての解説でした!
特にCIDR記法はAWSのVPC設計で頻出するので、ここを押さえておくと今後の理解が一気に進みそうな手応えがあります。
この領域は奥が深く、書籍などで学習をしてより深く理解することをお勧めします。
最後に筆者が現在読み進めている、ネットワークについて分かりやすく解説した書籍を照会します!
ご覧いただきありがとうございました🔥
