IP 寻址与子网划分
这一课你将能做到
- 手算任意 /24 到 /30 子网的网络号、广播址、可用主机数
- 用 VLSM 把一个 C 段按需求切成不浪费的多个子网
- 配置私有地址并解释 NAT 如何让 30 台设备共享一个公网 IP
为什么要学
子网划分是网络面试的第一道硬菜,也是云上建 VPC、K8s 规划 Service CIDR 的日常。不会算,云控制台里「可用 IP 数量 251」你都读不懂;会算,所有 CIDR 记法一眼见底。这一课用查表法把二进制运算变成套路题。
先建立图像
IPv4 = 32 bit,按 . 分四段,每段 8 bit
192.168.10.66 → 11000000.10101000.00001010.01000010
└──── 网络位(相同的部分 = 同一子网)────┘└─主机位─┘
掩码 /24 = 255.255.255.0 → 前 24 位是网络位,后 8 位是主机位
主机位 8 bit → 2^8 = 256 个地址,可用 256-2 = 254(去掉网络号与广播址)
一句话心法:掩码决定切在哪,块大小 = 256 − 掩码末字节。
跟着做
步骤 1:速查表背下来
| 前缀 | 掩码 | 可用主机 | 典型用途 |
|---|
| /24 | 255.255.255.0 | 254 | 部门网段 |
| /25 | 255.255.255.128 | 126 | 半个 C |
| /26 | 255.255.255.192 | 62 | 小部门 |
| /27 | 255.255.255.224 | 30 | 服务器组 |
| /28 | 255.255.255.240 | 14 | DMZ |
| /29 | 255.255.255.248 | 6 | 小簇 |
| /30 | 255.255.255.252 | 2 | 设备互联 |
| /31 | 255.255.255.254 | 2(RFC 3021) | 点对点专线 |
| /32 | 255.255.255.255 | 1 | 单主机 / 回环 |
步骤 2:手算一个子网
例:192.168.10.66/26 → 掩码 255.255.255.192,块大小 256−192=64。
- 网络号:64 的倍数中 ≤66 的最大值 = 192.168.10.64
- 广播址:.64 + 63 = .127
- 可用范围:.65–.126,共 62 个
用工具验证:
python3 -c "import ipaddress;print(ipaddress.ip_network('192.168.10.66/26', strict=False))"
# 192.168.10.64/26
步骤 3:VLSM 实战——一个 C 段切五块
需求:A 部门 100 台、B 部门 50 台、服务器 20 台、两条点对点互联。从大往小切,起始地址对齐自己的块大小:
192.168.10.0/25 → A 部门(可用 126)
192.168.10.128/26 → B 部门(可用 62)
192.168.10.192/27 → 服务器(可用 30)
192.168.10.224/30 → 互联 1(可用 2)
192.168.10.228/30 → 互联 2(可用 2)
VLSM 铁律:先满足最大的,每个子网的起点必须落在其块大小的整数倍上。
步骤 4:在 Linux 上配地址并验证
sudo ip addr add 192.168.10.66/26 dev eth0
ip -brief addr show eth0
ping -c2 192.168.10.65 # 同子网直连
ping -c2 8.8.8.8 # 不通?看下一节 NAT
步骤 5:看懂 NAT
# 家用路由器 / 云主机最常见的伪装 NAT
sudo iptables -t nat -L POSTROUTING -n -v | head
# 内网 192.168.10.0/24 出网时源 IP 被改成出口 IP,回包按连接表改回来
K8s 节点出网 SNAT 成节点 IP,同一个原理。NAT 是有状态的:主动出站的回包能回来,外部主动进来的没有映射。
讲清楚要点
- 私有地址三段(RFC 1918):10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,不能直接上公网,必须经 NAT。
- CIDR 取消了 A/B/C 类的僵硬边界:掩码位数即前缀长度,/8、/16、/24 是最常用刻度。
- 每个子网损失 2 个地址:网络号代表「子网本身」,广播号代表「向全网段所有人」,都不能分配给主机;点对点链路可用 /31 省地址。
- NAT 的方向性:PAT/MASQUERADE 按「IP+端口」维护连接表,天然「外打不进内」——这是安全特性,也是 P2P 与自建服务要做端口映射的原因。
- 云上子网要预留:主流云厂商每个子网保留 5 个地址,所以 VPC 文档里 /24 显示可用 251。
- 路由汇总是 CIDR 的反方向:把 192.168.0.0/24 – 192.168.3.0/24 四个连续子网对外汇总成 192.168.0.0/22,路由表立刻瘦身;前提是地址连续且块对齐——这也是编址要「先总后分」的原因之一。
你可能会懵的地方
-
为什么可用地址要减 2?
网络号标识子网自身、广播号面向全网段,二者都不能给主机。云上再减 5 是厂商保留(网关、DNS 等)。
-
192.168.1.0/24 和它的 /25 能同时用吗?
能,前提互不重叠,这叫子网细分;重叠会让路由表精神分裂,转发结果看最长前缀匹配。
-
怎么判断一个 IP 是不是公网?
排除 RFC1918 三段、127/8、169.254/16、组播 224/4 等保留段,其余基本是公网。可编程验证:python3 -c "import ipaddress;print(ipaddress.ip_address('8.8.8.8').is_global)"。
-
网关必须是子网第一个地址吗?
惯例而已,任何可用地址都能当网关,关键是全网段配置一致、路由表指对。
-
IPv6 也要这么抠吗?
思路一致但几乎不用抠:惯例 /64 一个子网,可用空间天文数字。先吃透 IPv4,IPv6 是「同样的刀法、更大的蛋糕」。
错法对照
| 错法 | 问题 | 正解 |
|---|
| 60 台的小部门硬切 /24 | 浪费 194 个地址 | 按需 /26,VLSM 先大后小 |
| 广播址当主机用 | 全网段都能「连上」它但没服务 | 广播址永不分主机 |
| 掩码 /22 却按 /24 算范围 | 互联网段不通 | 先算块大小 256−掩码末字节 |
| 云上子网给 /28 还塞 20 台机器 | 可用仅 11 个,Pod 分不到 IP | 按「可用 = 2^n − 5」预留 |
| 内网用公网 IP 直连自家服务 | 回程绕公网或被丢 | 走私网地址,理解 NAT 回程路径 |
卡点急救
- 算错网络号:先写掩码二进制确定主机位数,块大小 = 2^主机位;网络号 = 不超过该 IP 的最大块大小整数倍。
- 同网段 ping 不通:先查两边掩码是否一致,再查 ARP(
ip neigh),最后查交换机端口 VLAN。
- 跨网段 ping 不通:查本机默认网关、
ip route 路由表、对端回程路由——路由永远要双向可达。
面试常问
-
10.0.0.0/8 怎么给 500 个部门划子网?
层次化规划:10.0.0.0/16 每部门一个 /24(可用 254),共 256 个 /24 不够则再升一层到 /12 区域划分;预留空段给扩展。考的是层次化思维而非硬算。
-
NAT 的类型与原理?
静态 NAT 一对一映射;动态 NAT 地址池;PAT/MASQUERADE 多对一按端口区分。本质是改写 IP/端口并维护连接表。
-
172.16.5.1/20 的网络号和可用范围?
/20 → 第三字节块大小 16 → 网络号 172.16.0.0,广播 172.16.15.255,可用 172.16.0.1–172.16.15.254 共 4094 个。
自测三问
- 192.168.1.77/28 的网络号、广播址、可用主机数各是多少?
- 为什么云厂商的 /24 子网只给 251 个可用 IP?
- 一条点对点链路用哪个前缀最省地址?
小结一句话
子网划分 = 把 32 位地址在「网络位 | 主机位」之间切一刀;会算块大小,VLSM 与 CIDR 全是同一道题。
延伸