AWS Learning
Networking

CIDR (Classless Inter-Domain Routing)

Classless Inter-Domain Routing, IP Address Ranges, Subnet Calculation

CIDR là gì?

CIDR (Classless Inter-Domain Routing) là cách viết gọn để mô tả dải IP addresses.

CIDR Notation:
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│    10.0.0.0/16                                                  │
│    ────┬────  ─┬─                                               │
│        │      │                                                 │
│   Base IP    Subnet Mask (số bit cố định)                       │
│                                                                 │
│   /16 = 16 bits đầu cố định, 16 bits sau thay đổi được          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Giải thích bằng hình ảnh

IP Address = 32 bits (4 octets × 8 bits)

10.0.0.0/16 nghĩa là:
┌────────────────────────────────────────────────────────────────┐
│  10      .    0       .    0       .    0                      │
│  ▼            ▼            ▼            ▼                      │
│ 00001010 . 00000000 . 00000000 . 00000000                      │
│ ├───────────────────┤ ├────────────────────┤                   │
│   16 bits CỐ ĐỊNH      16 bits THAY ĐỔI ĐƯỢC                   │
│   (Network portion)    (Host portion)                          │
│                                                                │
│ → Các IP từ 10.0.0.0 đến 10.0.255.255 đều thuộc dải này        │
│ → Tổng: 2^16 = 65,536 IPs                                      │
└────────────────────────────────────────────────────────────────┘

Cách đọc CIDR

Công thức tính số IP

Số IP = 2^(32 - subnet mask)

Ví dụ:
  /16 → 2^(32-16) = 2^16 = 65,536 IPs
  /24 → 2^(32-24) = 2^8  = 256 IPs
  /28 → 2^(32-28) = 2^4  = 16 IPs
  /32 → 2^(32-32) = 2^0  = 1 IP (chính xác 1 địa chỉ)

Quy tắc nhớ nhanh

┌─────────────────────────────────────────────────────────────────┐
│  SUBNET MASK     SỐ IPs       GHI NHỚ                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│     /8       16,777,216    (Class A - rất lớn)                  │
│     /16      65,536        (Class B - VPC mặc định)             │
│     /24      256           (Class C - subnet phổ biến)          │
│     /28      16            (Subnet nhỏ nhất AWS cho phép)       │
│     /32      1             (Chính xác 1 IP)                     │
│                                                                 │
│  Mỗi khi tăng 1:  /24 → /25 → /26 → /27                         │
│  Số IP giảm CÒN NỬA: 256 → 128 → 64 → 32                        │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Bảng tham chiếu nhanh

CIDRSubnet MaskSố IPsIPs khả dụng (AWS)Use Case
/8255.0.0.016,777,216-Class A network
/16255.255.0.065,53665,531VPC lớn
/20255.255.240.04,0964,091VPC vừa
/24255.255.255.0256251Subnet phổ biến
/25255.255.255.128128123Subnet vừa
/26255.255.255.1926459Subnet nhỏ
/27255.255.255.2243227Subnet nhỏ
/28255.255.255.2401611Subnet nhỏ nhất (AWS)

⚠️ AWS Reserved IPs: Mỗi subnet, AWS giữ lại 5 IPs đầu và cuối (Network, Router, DNS, Reserved, Broadcast)


Private IP Ranges

Theo RFC 1918, có 3 dải IP private (không dùng trên Internet):

┌─────────────────────────────────────────────────────────────────┐
│                    PRIVATE IP RANGES                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  10.0.0.0/8        10.0.0.0 → 10.255.255.255                    │
│                    16,777,216 IPs (Class A)                     │
│                    → Phổ biến cho VPC                           │
│                                                                 │
│  172.16.0.0/12     172.16.0.0 → 172.31.255.255                  │
│                    1,048,576 IPs (Class B)                      │
│                    → AWS Default VPC dùng 172.31.0.0/16         │
│                                                                 │
│  192.168.0.0/16    192.168.0.0 → 192.168.255.255                │
│                    65,536 IPs (Class C)                         │
│                    → Phổ biến cho home network                  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
RangeClassSố IPsThường dùng cho
10.0.0.0/8A16MEnterprise, AWS VPC
172.16.0.0/12B1MAWS Default VPC
192.168.0.0/16C65KHome/Small office

CIDR trong AWS VPC

VPC CIDR Block

AWS VPC cho phép:
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   VPC CIDR:    /16 đến /28                                      │
│                                                                 │
│   /16 = 65,536 IPs    (lớn nhất)                                │
│   /28 = 16 IPs        (nhỏ nhất)                                │
│                                                                 │
│   Khuyến nghị: /16 cho production (nhiều subnet, room to grow)  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

AWS Reserved IPs trong mỗi Subnet

Khi bạn tạo subnet, AWS tự động giữ lại 5 IPs đầu tiên và cuối cùng - bạn không thể dùng những IP này cho EC2.

Ví dụ cụ thể: Subnet 10.0.1.0/24

Subnet 10.0.1.0/24 = 256 IPs (từ 10.0.1.0 đến 10.0.1.255)

┌────────────────┬──────────────────────────────┬─────────────────┐
│   IP Address   │   AWS dùng để làm gì?        │   Bạn dùng được?│
├────────────────┼──────────────────────────────┼─────────────────┤
│   10.0.1.0     │   Network address            │   ❌ Reserved   │
│   10.0.1.1     │   VPC Router (local gateway) │   ❌ Reserved   │
│   10.0.1.2     │   DNS Server                 │   ❌ Reserved   │
│   10.0.1.3     │   Reserved cho tương lai     │   ❌ Reserved   │
│   ─────────────│──────────────────────────────│─────────────────│
│   10.0.1.4     │   ← IP đầu tiên bạn dùng được│   ✅ Usable     │
│   10.0.1.5     │                              │   ✅ Usable     │
│   ...          │                              │   ✅ Usable     │
│   10.0.1.254   │   ← IP cuối cùng bạn dùng    │   ✅ Usable     │
│   ─────────────│──────────────────────────────│─────────────────│
│   10.0.1.255   │   Broadcast address          │   ❌ Reserved   │
└────────────────┴──────────────────────────────┴─────────────────┘

Tổng: 256 IPs - 5 Reserved = 251 IPs bạn dùng được

Giải thích từng IP Reserved

IPTênMục đích
x.x.x.0Network AddressĐịnh danh subnet (quy ước mạng, không gán cho host)
x.x.x.1VPC RouterRouter nội bộ của VPC (local route dùng IP này)
x.x.x.2DNS ServerDNS của VPC (VPC Base + 2, Route 53 Resolver)
x.x.x.3ReservedAWS giữ cho tương lai, chưa dùng
x.x.x.255BroadcastĐịa chỉ broadcast (quy ước mạng)

Ví dụ với subnet nhỏ /28

Bạn tạo subnet 10.0.1.0/28 (16 IPs):

10.0.1.0   ← Network (AWS reserved)
10.0.1.1   ← Router (AWS reserved)
10.0.1.2   ← DNS (AWS reserved)
10.0.1.3   ← Future (AWS reserved)
10.0.1.4   ← EC2 đầu tiên của bạn ✅
10.0.1.5   ← EC2 thứ hai ✅
...
10.0.1.14  ← EC2 cuối cùng ✅
10.0.1.15  ← Broadcast (AWS reserved)

→ Chỉ có 11 IPs dùng được (16 - 5 = 11)

Tại sao quan trọng?

⚠️ TRAP: Bạn nghĩ /28 = 16 IPs → Đủ cho 16 EC2?
   → SAI! Chỉ có 11 IPs thực sự dùng được!

TÍNH TOÁN ĐÚNG:
┌──────────┬────────────┬─────────────┐
│  Subnet  │  Tổng IPs  │  Usable IPs │
├──────────┼────────────┼─────────────┤
│   /28    │     16     │     11      │
│   /27    │     32     │     27      │
│   /26    │     64     │     59      │
│   /25    │    128     │    123      │
│   /24    │    256     │    251      │
└──────────┴────────────┴─────────────┘

💡 Nhớ: Luôn trừ 5 khi tính số IP thực sự dùng được trong AWS subnet!


Chia Subnet

Ví dụ: Chia VPC 10.0.0.0/16 thành các subnets

VPC: 10.0.0.0/16 (65,536 IPs)

├── Public Subnet AZ-A:  10.0.0.0/24   (256 IPs) → 10.0.0.0 - 10.0.0.255
├── Public Subnet AZ-B:  10.0.1.0/24   (256 IPs) → 10.0.1.0 - 10.0.1.255
├── Private Subnet AZ-A: 10.0.10.0/24  (256 IPs) → 10.0.10.0 - 10.0.10.255
├── Private Subnet AZ-B: 10.0.11.0/24  (256 IPs) → 10.0.11.0 - 10.0.11.255
├── DB Subnet AZ-A:      10.0.20.0/24  (256 IPs) → 10.0.20.0 - 10.0.20.255
└── DB Subnet AZ-B:      10.0.21.0/24  (256 IPs) → 10.0.21.0 - 10.0.21.255

Quy tắc chia subnet

┌─────────────────────────────────────────────────────────────────┐
│                    KHÔNG ĐƯỢC OVERLAP!                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ✅ OK:                                                         │
│     10.0.0.0/24  (10.0.0.0 - 10.0.0.255)                        │
│     10.0.1.0/24  (10.0.1.0 - 10.0.1.255)                        │
│     → Không trùng nhau                                          │
│                                                                 │
│  ❌ WRONG:                                                      │
│     10.0.0.0/16  (10.0.0.0 - 10.0.255.255)                      │
│     10.0.1.0/24  (10.0.1.0 - 10.0.1.255)                        │
│     → /24 nằm trong /16, bị overlap!                            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Ví dụ thực tế

1. Startup nhỏ (10-50 EC2s)

VPC: 10.0.0.0/20 (4,096 IPs) - đủ dùng, tiết kiệm

├── Public:  10.0.0.0/24  (251 usable)
├── Private: 10.0.1.0/24  (251 usable)
└── DB:      10.0.2.0/24  (251 usable)

2. Production (100+ EC2s, multi-AZ)

VPC: 10.0.0.0/16 (65,536 IPs) - room to grow

AZ-A:
├── Public:  10.0.0.0/24
├── Private: 10.0.10.0/24
└── DB:      10.0.20.0/24

AZ-B:
├── Public:  10.0.1.0/24
├── Private: 10.0.11.0/24
└── DB:      10.0.21.0/24

AZ-C:
├── Public:  10.0.2.0/24
├── Private: 10.0.12.0/24
└── DB:      10.0.22.0/24

3. Multi-VPC / Multi-Region

⚠️ QUAN TRỌNG: Các VPC không được overlap CIDR nếu muốn peering!

Region US-East-1:
├── VPC-Prod:    10.0.0.0/16
└── VPC-Dev:     10.1.0.0/16    ← Khác block!

Region AP-Southeast-1:
├── VPC-Prod:    10.2.0.0/16    ← Khác block!
└── VPC-Dev:     10.3.0.0/16    ← Khác block!

→ Tất cả có thể peering với nhau vì không overlap!

Tips & Tricks

1. Luôn plan trước

❌ Sai: Tạo VPC /24 rồi phát hiện không đủ IP
✅ Đúng: Tạo VPC /16, chia subnet /24 → room to grow

2. Naming convention cho subnets

10.0.[tier].[az].0/24

tier: 0-9 = public, 10-19 = private, 20-29 = database
az: 0 = AZ-A, 1 = AZ-B, 2 = AZ-C

Ví dụ:
  10.0.0.0/24  = Public AZ-A
  10.0.1.0/24  = Public AZ-B
  10.0.10.0/24 = Private AZ-A
  10.0.11.0/24 = Private AZ-B
  10.0.20.0/24 = Database AZ-A
  10.0.21.0/24 = Database AZ-B

3. Kiểm tra overlap online

Dùng các tool online để verify:

4. Bảng cheat sheet

/16 = 65,536 IPs    = Chia được 256 subnet /24
/20 = 4,096 IPs     = Chia được 16 subnet /24
/24 = 256 IPs       = Subnet phổ biến nhất
/28 = 16 IPs        = Nhỏ nhất AWS cho phép (11 usable)
/32 = 1 IP          = Chính xác 1 địa chỉ (dùng trong Security Group)

Liên kết

Nguồn: AWS VPC CIDR blocks