CIDR 与子网速成:写给开发者的网络课
这些时刻,你需要一点网络基本功
写代码写到某一天,你总会遇到:配置 K8s 的 service 网段要避开公司内网;防火墙规则里要填一段 CIDR;翻日志看到一个陌生 IP,想判断它来自内网还是公网。这些问题的答案都不在框架文档里,而在网络基础里——好在开发者需要的网络知识,核心就是 CIDR 和子网划分这一块。
这篇文章不讲不实用的历史,只讲能直接用的部分,每个计算都有可视化工具帮忙。
IP 与掩码的直觉:网络位与主机位
一个 IPv4 地址是 32 位二进制数,逻辑上分成两半:前半是网络位(你在哪个小区),后半是主机位(你是哪一户)。子网掩码的作用就是标出分界线在哪里。
以最常用的 255.255.255.0 为例:它的二进制是 24 个 1 后跟 8 个 0,意思是前 24 位是网络位,后 8 位是主机位——这正是 CIDR 写法 /24 的含义。所以 192.168.1.0/24 和"掩码 255.255.255.0"是同一个意思的两种写法。
判断两个 IP 是否同网段,就是把两者分别和掩码做按位与(AND)运算,结果相同就在同一个网段。手工做 AND 很枯燥,IP 子网计算器会附二进制视图——掩码里 1 和 0 的分界一眼可见,比背规则直观得多,这也是推荐用工具学网络的原因。
CIDR 写法与可用主机数速记
CIDR 用 /n 表示前 n 位是网络位。主机数公式:2^(32−n) − 2(减 2 是因为网络地址和广播地址不能分配给主机)。先记住这几个高频值:
| CIDR | 掩码 | 地址总数 | 可用主机 | 典型用途 |
|---|---|---|---|---|
| /8 | 255.0.0.0 | 1677 万 | 1677 万−2 | 大型私网(10.0.0.0/8) |
| /16 | 255.255.0.0 | 65536 | 65534 | 中型网络、K8s Pod 网段 |
| /24 | 255.255.255.0 | 256 | 254 | 常见局域网段 |
| /30 | 255.255.255.252 | 4 | 2 | 点对点链路 |
| /32 | 255.255.255.255 | 1 | — | 单个主机(防火墙精确放行) |
心算有个技巧:从 /24 = 254 这个锚点出发,前缀每减 1,地址数翻倍(/23 是 512,/22 是 1024);前缀每加 1,可用主机数约砍半(/25 是 126,/26 是 62,/28 是 14)。常用的子网都能从锚点推出来,不必死记整张表。
看一个真实例子:K8s 默认的 service 网段是 10.96.0.0/12,/12 表示 32 位里前 12 位固定,覆盖 10.96.0.0 到 10.111.255.255,共约 104 万个地址。配防火墙规则或排查网段冲突时,能心算出这个范围会省很多事。
实操:算网段范围与划分子网
场景:公司内网是 192.168.1.0/24,要划出 4 个子网给不同环境用。做法是把主机位再借 2 位出来,24+2=26,得到 4 个 /26 子网,每个 64 个地址、可用主机 62 个:
192.168.1.0/26:可用 192.168.1.1 – 192.168.1.62192.168.1.64/26:可用 192.168.1.65 – 192.168.1.126192.168.1.128/26:可用 192.168.1.129 – 192.168.1.190192.168.1.192/26:可用 192.168.1.193 – 192.168.1.254
这类计算不用手算,把 CIDR 贴进IP 子网计算器,网络地址、广播地址、可用主机范围和子网划分结果一次给出,还带二进制视图核对。
开发者更要关心的是网段冲突。真实的翻车案例:K8s 的 Pod 网段设成了 172.17.0.0/16,恰好撞上 Docker 默认网桥 172.17.0.0/16,容器和 Pod 互相访问时路由错乱。部署前把所有网段(VPC 子网、K8s service/Pod 网段、Docker 网段)列出来,用计算器逐个确认互不重叠,五分钟能避免一整天的诡异故障。
规划时还有一条经验:公有云 VPC 的网段在创建时确定,事后调整代价很大。先把未来要划分的数量估好,选一个足够大的段(比如 /16),再逐步往下切子网——这比一开始就抠着 /24 用、一年后全网迁移要省事得多。
日志里的 IP 是谁:私网、CGNAT 还是公网
看日志排查问题时,先判断 IP 的类型。需要记住的段不多:
- 私网三段(RFC 1918):
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 - CGNAT(运营商级 NAT):
100.64.0.0/10,覆盖 100.64.0.0 – 100.127.255.255,手机流量出口常见 - 链路本地:
169.254.0.0/16,出现它通常意味着 DHCP 没拿到地址
最容易记错的是 172 段:172.16.0.0/12 只覆盖 172.16.0.0 – 172.31.255.255,所以 172.20.5.9 是私网,而 172.32.1.1 已经是公网地址。与其背区间,不如用私有 IP 检测器直接判定:输入 IP,它会告诉你属于私网、公网、CGNAT、链路本地还是保留段,并附 NAT 场景说明。
这个判定的实战价值:日志里看到 100.106.x.x,说明用户在运营商 CGNAT 后面——它不是真正的公网 IP,你别指望从外面主动连过去;看到 192.168.x.x 就直接往内网拓扑上查,方向完全不同。反过来,把日志里的来源 IP 批量摘出来判定一遍,还能顺带发现异常——如果预期"只有内网用户访问"的服务收到了大量公网 IP 的连接,暴露面配置多半出了问题。
两个补充:hosts 映射与 IPv6
hosts 映射:联调时想让 api.test.example.com 指向本机,或者想屏蔽某些域名的广告请求,改 hosts 文件都能做到。手写 hosts 容易出格式错误和重复条目,用hosts 片段生成器生成片段——它做域名校验和去重,并附各系统的应用方法(Windows 的 hosts 在 C:\Windows\System32\drivers\etc\hosts,macOS/Linux 在 /etc/hosts)。
IPv6:日志和配置里开始越来越多地出现 IPv6,格式问题也随之而来。用IPv6 地址转换工具处理三件事:完整展开与 RFC 5952 压缩互转(2001:db8::1 展开是 2001:0db8:0000:0000:0000:0000:0000:0001);识别 IPv4 映射地址(双栈日志里的 ::ffff:192.168.1.1,认出来就能按 IPv4 的思路继续排查);生成 ip6.arpa 反向解析名,配置 PTR 记录时直接粘贴。
常见问题
/24 和 255.255.255.0 到底什么关系?
同一个意思的两种写法。/24 说"前 24 位是网络位",255.255.255.0 是这 24 个 1 写成点分十进制的结果。企业文档爱用点分掩码,云平台和防火墙规则爱用 CIDR,能互认就行。
为什么可用主机数要减 2?
每个网段里有两个地址不能分配:网络地址(主机位全 0,代表整个网段)和广播地址(主机位全 1,用于向全网段发包)。所以 /26 是 64−2=62 个可用主机。
日志里 100.64 开头的 IP 是公网 IP 吗?
不是。100.64.0.0/10 是 RFC 6598 定义的运营商级 NAT 段(CGNAT),手机移动网络用户的出口经常是它。它既不是 RFC 1918 私网地址,也不可在公网路由——遇到时按"运营商内网"理解,不要写进公网访问控制规则里。
小结
开发者需要的网络基本功,核心就三件事:看懂 CIDR、会算网段范围、能判定 IP 类型。这篇用到的工具——IP 子网计算器、私有 IP 检测器、hosts 片段生成器、IPv6 地址转换工具——都收录在网络排查工具包专题里,全部本地运行。概念记不住没关系,工具收藏好,下次配网段、查日志时对着算一遍,比背十遍文档记得牢。