Bắt Đầu Nhanh: Chia Subnet Trong 5 Phút
Sáu tháng cấu hình VLAN trên các switch production — và debug lỗi routing lúc 2 giờ sáng — dạy tôi một điều rõ ràng: chia subnet là thứ phân biệt “tôi biết networking” với “tôi thực sự hiểu networking.” Tôi mất một thời gian dài đến mức xấu hổ mới thực sự quen với nó. Khi quen rồi, tôi mới nhận ra mình đã suy nghĩ phức tạp hóa vấn đề suốt thời gian đó.
Đây là ý tưởng cốt lõi: một địa chỉ IPv4 như 192.168.1.0/24 có hai phần — phần mạng và phần host. Ký hiệu /24 (CIDR notation) có nghĩa là 24 bit dành cho mạng, còn lại 8 bit cho host.
Công thức bạn cần ngay bây giờ:
Số host khả dụng = 2^(32 - độ_dài_prefix) - 2
Ví dụ:
/24 → 2^8 - 2 = 254 hosts
/25 → 2^7 - 2 = 126 hosts
/26 → 2^6 - 2 = 62 hosts
/27 → 2^5 - 2 = 30 hosts
/28 → 2^4 - 2 = 14 hosts
/30 → 2^2 - 2 = 2 hosts ← liên kết WAN point-to-point
Phần “-2” là để trừ đi địa chỉ mạng (IP đầu tiên) và địa chỉ broadcast (IP cuối cùng). Cả hai đều không thể gán cho host.
Tìm Hiểu Sâu: Phép Tính Nhị Phân Đằng Sau Việc Chia Subnet
Bạn không cần phải yêu thích nhị phân. Nhưng bạn cần đủ thành thạo để tính một subnet trên bảng trắng trong buổi phỏng vấn — hoặc khi có người đang la hét rằng hệ thống production đang sập.
Subnet Mask Hoạt Động Như Thế Nào
Subnet mask có 32 bit: các bit 1 liên tiếp theo sau là các bit 0 liên tiếp. Các bit 1 xác định mạng. Các bit 0 xác định host trong mạng đó.
/24 mask dạng nhị phân:
11111111.11111111.11111111.00000000 = 255.255.255.0
/26 mask dạng nhị phân:
11111111.11111111.11111111.11000000 = 255.255.255.192
Tính Địa Chỉ Mạng, Broadcast và Dải Khả Dụng
Hãy cùng đi qua từng bước với 192.168.10.50/26.
Bước 1 — Chuyển sang nhị phân:
IP: 192.168.10.50 = 11000000.10101000.00001010.00110010
Mask: /26 = 11111111.11111111.11111111.11000000
Bước 2 — Địa chỉ mạng (phép AND từng bit):
11000000.10101000.00001010.00110010
AND
11111111.11111111.11111111.11000000
= 11000000.10101000.00001010.00000000
= 192.168.10.0
Bước 3 — Địa chỉ broadcast (đặt tất cả bit host thành 1):
11000000.10101000.00001010.00111111
= 192.168.10.63
Bước 4 — Dải khả dụng: 192.168.10.1 đến 192.168.10.62 — 62 địa chỉ host khả dụng.
Module ipaddress có sẵn trong Python xác minh điều này ngay lập tức:
import ipaddress
network = ipaddress.ip_network('192.168.10.50/26', strict=False)
print(f"Mạng: {network.network_address}")
print(f"Broadcast: {network.broadcast_address}")
print(f"Khả dụng: {network.num_addresses - 2}")
print(f"Đầu tiên: {list(network.hosts())[0]}")
print(f"Cuối cùng: {list(network.hosts())[-1]}")
Kết quả:
Mạng: 192.168.10.0
Broadcast: 192.168.10.63
Khả dụng: 62
Đầu tiên: 192.168.10.1
Cuối cùng: 192.168.10.62
Trên Linux, ipcalc xử lý điều tương tự từ terminal:
ipcalc 192.168.10.50/26
Nâng Cao: VLSM và Thiết Kế Subnet Thực Tế
VLSM (Variable Length Subnet Masking) là lúc việc chia subnet không còn là lý thuyết nữa. Thay vì các khối có kích thước bằng nhau, bạn định cỡ từng subnet theo khối lượng công việc thực tế. Tôi từng thấy một /24 duy nhất được chia thành hàng chục VLAN tại một văn phòng 40 người — nếu không có VLSM, hơn 100 địa chỉ sẽ bị chôn vùi mãi mãi trong các khối quá lớn mà không ai yêu cầu.
VLSM: Tình Huống Thực Tế
Bạn có 192.168.1.0/24 và cần phân bổ subnet cho bốn phòng ban:
- Kinh doanh: 100 host
- IT: 50 host
- Ban giám đốc: 10 host
- Liên kết WAN: 2 host
Luôn phân bổ subnet lớn nhất trước để tránh phân mảnh:
Kinh doanh (100 host):
Cần: 2^7 = 128 địa chỉ → /25
Subnet: 192.168.1.0/25
Dải: 192.168.1.1 – 192.168.1.126
Broadcast: 192.168.1.127
IT (50 host):
Cần: 2^6 = 64 địa chỉ → /26
Subnet: 192.168.1.128/26
Dải: 192.168.1.129 – 192.168.1.190
Broadcast: 192.168.1.191
Ban giám đốc (10 host):
Cần: 2^4 = 16 địa chỉ → /28
Subnet: 192.168.1.192/28
Dải: 192.168.1.193 – 192.168.1.206
Broadcast: 192.168.1.207
Liên kết WAN (2 host):
Cần: 2^2 = 4 địa chỉ → /30
Subnet: 192.168.1.208/30
Dải: 192.168.1.209 – 192.168.1.210
Broadcast: 192.168.1.211
Tổng cộng: 128 + 64 + 16 + 4 = 212 địa chỉ sử dụng trên tổng số 256. Gọn gàng và hiệu quả.
Chia /24 Thành Các Khối Bằng Nhau
Đôi khi các subnet có kích thước bằng nhau chính xác là thứ bạn cần. Mỗi lần mượn thêm một bit từ phần host sẽ nhân đôi số lượng subnet:
# Chia 10.0.0.0/24 thành 4 subnet /26 bằng nhau
# Mượn 2 bit từ phần host (2^2 = 4 subnet)
python3 -c "
import ipaddress
net = ipaddress.ip_network('10.0.0.0/24')
for subnet in net.subnets(new_prefix=26):
print(subnet)
"
Kết quả:
10.0.0.0/26
10.0.0.64/26
10.0.0.128/26
10.0.0.192/26
Bài Học Xương Máu Từ Mạng Production
Những điều không có trong sách giáo khoa:
- Dùng /30 cho liên kết WAN point-to-point, không dùng /31 — trừ khi bạn đã xác nhận cả hai đầu hỗ trợ RFC 3021. Nhiều thiết bị cũ âm thầm loại bỏ traffic /31.
- Kiểm tra trước khi đẩy lên production. Chạy
ipcalchoặc đoạn Python ở trên trước khi chạm vào bất kỳ cấu hình router hay firewall nào. Một chữ số bị nhầm trong subnet mask đã từng khiến tôi mất ba giờ debug. - Căn chỉnh subnet theo các ranh giới tự nhiên. VLAN 10 ánh xạ gọn vào
10.0.10.0/24, VLAN 20 vào10.0.20.0/24. Cách đặt địa chỉ theo quy luật giúp việc troubleshoot lúc 2 giờ sáng bớt đau đầu hơn rất nhiều. - Ghi chép các phân bổ của bạn. NetBox và phpIPAM được xây dựng đúng cho mục đích này. Một bảng tính cũng ổn. Dù bạn chọn gì, hãy ghi lại — một IP conflict từ subnet không được ghi chép có thể ngốn cả ngày để tháo gỡ.
- Học thuộc /24 đến /30. Trong thực tế, khoảng 95% tác vụ chia subnet rơi vào dải này. Còn lại bạn có thể tính nhanh khi cần.
Bảng tham khảo nhanh:
Prefix | Mask | Số địa chỉ | Khả dụng
/24 | 255.255.255.0 | 256 | 254
/25 | 255.255.255.128 | 128 | 126
/26 | 255.255.255.192 | 64 | 62
/27 | 255.255.255.224 | 32 | 30
/28 | 255.255.255.240 | 16 | 14
/29 | 255.255.255.248 | 8 | 6
/30 | 255.255.255.252 | 4 | 2
Hãy tự tính thủ công bằng nhị phân vài lần để khắc sâu trực giác. Sau đó, dựa vào ipcalc và Python cho bất cứ thứ gì liên quan đến production. Không có phần thưởng nào cho việc tính nhẩm khi server đang sập cả.

