Địa chỉ IP là gì

IP (Internet Protocol) là định danh logic của một thiết bị trên mạng. Khác với MAC address (định danh vật lý gắn với card mạng), IP address:

  • Có thể thay đổi (DHCP, cấu hình lại).
  • Mang thông tin về vị trí mạng (phần network + phần host).
  • Được dùng để định tuyến qua nhiều hop.

IPv4 và IPv6

IPv4 viết dạng 192.168.1.10, 32 bit, khoảng 4,3 tỷ địa chỉ (không gian public đã cạn; nhà mạng thường dùng CGNAT, nhiều khách hàng chung một địa chỉ public, nên bạn hay thấy IP WAN trên router khác IP mà trang “what is my ip” hiển thị). IPv6 viết dạng 2001:db8::1, 128 bit. Trọng tâm là IPv4 vì phần lớn VPC và lab vẫn mô tả bằng IPv4, nhưng CIDR, gateway, bảng định tuyến vẫn là ngôn ngữ chung.

IPv6 cần nhớ thêm vài điểm khi gặp trong log cloud / dual-stack:

  • NDP (Neighbor Discovery) đảm nhiệm vai trò tương tự ARP ở IPv4 (tìm “MAC” của neighbor trên link).
  • Subnet người ta hay gặp là prefix /64 trên một segment (SLAAC, nhiều chính sách cloud/host giả định /64 trên interface).
  • Địa chỉ link-local fe80::/10 chỉ dùng trên một link (không route qua router như địa chỉ global); khi debug ping6/tcpdump sẽ thấy thường xuyên.

Nhiều cluster Kubernetes và VPC giờ bật dual-stack (IPv4 + IPv6 cùng lúc): mỗi gia đình địa chỉ vẫn có gateway và route riêng, chỉ là bạn có hai bảng tuyến song song cần kiểm tra khi trục trặc.

Dải IPv4 private và đặc biệt (hay gặp khi thiết kế VPC / VPN)

DảiGhi chú
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16RFC 1918, private; dùng nội bộ, NAT ra internet.
100.64.0.0/10RFC 6598, shared (CGNAT, một số dịch vụ overlay); tránh “tình cờ” trùng khi ghép mạng.
169.254.0.0/16Link-local (APIPA): không có DHCP vẫn tự gán; trên cloud còn dùng cho metadata endpoint (ví dụ AWS 169.254.169.254).

Tránh chồng các dải trên với mạng văn phòng/VPN khi làm hybrid cloud, cùng ý với peering: route phải trỏ một cách không mơ hồ.


Subnet và CIDR

Subnet là nhóm địa chỉ IP liên tục được quản lý chung. CIDR (Classless Inter-Domain Routing) là cách viết subnet gọn:

  10 . 0 . 1 . 0 / 24
                    ^^^
                    | |
                    | +-- 8 bit cuối: phần host trong subnet
                    +---- 24 bit đầu: prefix (định danh mạng)
          ^^^^^^^^^^^^^^^
          địa chỉ bắt đầu (network) của subnet
CIDRSố bit hostSố IPDùng cho
/3112 (2 usable)P2P (RFC 3021)
/3024 (2 usable)P2P (kiểu cũ)
/28416 (14 usable)Subnet nhỏ
/248256 (254 usable)Subnet phổ biến nhất
/161665 536VPC toàn bộ
/824~16 triệuRange lớn (10.0.0.0/8)

Trên router và cloud, /31 cho link point-to-point rất phổ biến (chỉ hai đầu, không còn “mất” địa chỉ cho network/broadcast như mô hình /30 cũ).

Quy tắc nhanh: hai địa chỉ IP cùng subnet nếu phần network (prefix) giống nhau. Ví dụ 10.0.1.510.0.1.200 cùng /24 (10.0.1.0/24) → nói chuyện trực tiếp được.


MAC vs IP, ai dùng cho gì


  flowchart LR
    subgraph A[App A<br/>10.0.1.5<br/>MAC aa:bb:cc]
    end
    subgraph B[App B<br/>10.0.1.20<br/>MAC dd:ee:ff]
    end
    A <-->|Ethernet LAN<br/>cùng subnet| B
  • MAC dùng trong phạm vi một segment L2 (LAN, VLAN, bridge trong Docker).
  • IP dùng để định tuyến qua nhiều mạng khác nhau.

Khi A biết IP của B nhưng chưa biết MAC, A gửi ARP broadcast: “10.0.1.20 là ai? Cho tôi biết MAC của bạn.” B trả lời, A cache lại.


Default gateway, cửa ra khỏi subnet

Khi A (10.0.1.5/24) muốn liên lạc với C (10.0.2.30):


  sequenceDiagram
    participant A as A (10.0.1.5)
    participant GW as Default Gateway (10.0.1.1)
    participant Router as Router
    participant C as C (10.0.2.30)

    A->>A: Kiểm tra routing table
    A->>GW: Gửi gói tới Default Gateway
    GW->>Router: Tra routing table
    Router->>Router: Chuyển tới Subnet 10.0.2.0/24
    Router->>C: C nhận gói

Cấu hình sai gateway → nội bộ subnet chạy ổn, ra ngoài timeout.


Routing table

Mỗi host và router có routing table, danh sách “với prefix X, gửi qua interface/gateway Y”:

# Linux
ip route show

# Output điển hình:
default via 10.0.1.1 dev eth0        # mọi đích không khớp → gateway
10.0.1.0/24 dev eth0 proto kernel    # subnet local → gửi trực tiếp
172.17.0.0/16 dev docker0 proto kernel  # subnet Docker bridge

Lệnh cần nhớ:

ip -4 addr show          # địa chỉ IP của từng interface
ip route show            # bảng routing IPv4
ip -6 route show         # bảng routing IPv6 (khi bật dual-stack)
ip route get 8.8.8.8     # gói tới 8.8.8.8 sẽ đi đường nào?

Áp dụng trong DevOps / cloud

VPC trên cloud:


  flowchart TB
    subgraph VPC[VPC 10.0.0.0/16]
        subgraph Public[public subnet 10.0.1.0/24]
        end
        subgraph Private[private subnet 10.0.2.0/24]
        end
        subgraph DB[DB subnet 10.0.3.0/24]
        end
    end
    Public -->|route → Internet Gateway| IGW[Internet Gateway]
    Private -->|route → NAT Gateway| NAT[NAT Gateway]
    DB -->|không có route ra internet| None[ ]

- Chọn CIDR cho VPC đủ rộng (`/16`) để chia nhiều subnet sau.
- Tránh chồng lấp CIDR giữa hai VPC muốn peering.

**Kubernetes:**

- Mỗi Node có Pod CIDR riêng (ví dụ `192.168.1.0/24`) do CNI quản lý.
- Dải **ClusterIP** của Service là **cấu hình cluster** (`serviceClusterIPRange` / cờ kubeadm…), thường thấy `10.96.0.0/12` nhưng **không cố định**, tránh hard-code trong tài liệu nội bộ.
- CNI hiện đại (Cilium, Calico eBPF, …) có thể dùng **datapath** khác iptables thuần, nhưng gói vẫn có đích IP/Pod IP, logic “cùng subnet vs qua gateway” vẫn giúp đặt câu hỏi đúng khi debug.
- Cluster **dual-stack**: Pod/Service có thể có cả IPv4 và IPv6; khi đó cần xem policy và route cho từng gia đình địa chỉ.

Hiểu routing table (và policy route nếu có) giúp trace "vì sao Pod A không tới được Pod B trên node khác".

---

## Điều cần giữ khi debug mạng

- **CIDR** là ngôn ngữ chung của cloud, Kubernetes và network config.
- Hai host **cùng subnet** nói trực tiếp qua MAC; **khác subnet** phải qua gateway/router.
- Nắm **dải private, link-local, CGNAT** giúp thiết kế VPC/VPN và đọc đúng hiện tượng “IP nào là của ai”.
- IPv6: nhớ **NDP** thay ARP, hay gặp **/64** và **link-local `fe80::`**; dual-stack = kiểm tra cả hai họ địa chỉ khi lỗi chỉ xảy ra một phía.
- `ip route` (và `ip -6 route` khi dùng IPv6) là lệnh đầu tiên cần chạy khi nghi ngờ vấn đề routing trên Linux.

---

## Câu hỏi hay gặp

### `10.10.5.100/22` và `10.10.7.200/22` có cùng subnet không?

**Trả lời:** **Có.** Với `/22`, khối thường là `10.10.4.0/22` (bao phủ `10.10.4.0`–`10.10.7.255`). Cả hai địa chỉ đều nằm trong cùng một mạng con đó.

### Ping được máy cùng LAN nhưng không ping/ra được internet, kiểm tra gì trước?

**Trả lời:** Nghi **default gateway**, **bảng định tuyến** (`ip route`), route `0.0.0.0/0`, và trên cloud **NAT/SG/NACL** cho traffic đi ra, không phải lỗi “cùng subnet”.

### Vì sao hai VPC peering phải có CIDR không chồng?

**Trả lời:** Nếu hai bên dùng **cùng dải địa chỉ**, bảng route không thể quyết định gói thuộc VPC nào, **định tuyến mơ hồ**. Cần đổi CIDR hoặc kiến trúc khác (ví dụ TGW, VPN overlay riêng).

---

_Bài tiếp theo (Giai đoạn I):_ [TCP, UDP và cổng (socket)](/posts/network/03-tcp-udp-va-cong/), sau khi biết IP tới đâu, tầng giao vận quyết định **ai nhận và tin cậy thế nào**.