IP 段划分规则:按用途分区、按规模取 2 的幂、按位置连续
IP 段划分规则可以落成四条:一个网段只放一种用途的设备;掩码按“设备数 + 网关 + 网络地址和广播地址”向上取 2 的幂;地址顺序跟着机房、列、机柜的物理顺序走;在功能区、网段、机柜三级各留余量。照这四条划出来的段,看地址就知道设备在哪,扩容时已分配的地址不用动。
IP 段划分规则说到底要回答四个问题:这个段放什么设备、开多大、从哪里开始、留多少余量。对应的四条规则是:按用途分区,管理、IPMI、业务、存储、装机各用各的段;按规模取 2 的幂,把设备数、网关、网络地址和广播地址加起来,取不小于它的最小 2 的幂作为块大小;按物理位置连续,同一列、同一机柜的设备地址排在一起;分层预留,功能区留伙伴块,网段内留周转地址,机柜里留替换位。下面逐条给出做法和判断标准,最后用一个 4 列 40 柜的机房把四条规则串成一张划分表。
规则一:按用途分区,一个网段只放一类设备
判断两类设备能不能放进同一个网段,看三件事:访问策略是否相同、MTU 是否相同、是否需要 DHCP。三件事有一件不同,就必须分段。按这个标准,机房里通常要分出下面八个功能区:
| 功能区 | 放什么 | 网关 | 特殊要求 |
|---|---|---|---|
| 设备管理网 | 交换机、防火墙管理口,PDU、动环采集器 | 有,只对基础服务区开放 | 不接任何客户设备 |
| IPMI 网 | 服务器 BMC 管理口 | 有,只对跳板机和管理系统开放 | 与设备管理网分开,BMC 数量多、风险高 |
| 业务公网 | 出租服务器、托管客户的公网地址 | 有,在核心或出口设备上 | 以 /24 为单位登记和调度 |
| 业务内网 | 客户服务器之间的私网互联 | 一般不需要 | 按客户分 VLAN、分段 |
| 存储网 | iSCSI、NFS、Ceph 等存储流量 | 一般不配,不参与路由 | 常开巨型帧,MTU 端到端一致 |
| 装机网 | PXE 装机时的临时地址 | 有,装机服务器在这里 | 全机房只有这里允许 DHCP |
| 基础服务 | 跳板机、监控、DNS、NTP | 有 | 运维人员进入管理网、IPMI 网的入口 |
| 互联与环回 | 设备之间的点对点链路、环回地址 | 不适用 | 互联用 /31 或 /30,环回用 /32 |
其中有两对最容易被合并、也最不该合并:
- 存储网和业务内网。存储流量突发大,一次数据重平衡就能把链路跑满;存储网通常开 MTU 9000 的巨型帧,业务网是 1500,混在一个 VLAN 里会出现小包能通、大包被丢的隐蔽故障。Ceph 还可以再拆一层:
public_network给客户端访问,cluster_network给副本复制和数据恢复,两个各占一个段。iSCSI 做多路径时,常见做法是 A、B 两条路径各用一个网段,以存储厂商的建议为准。 - 装机网和 IPMI 网。不少 BMC 出厂默认用 DHCP 获取地址。如果装机用的 DHCP 服务和 BMC 在同一个广播域,新上架服务器的 BMC 会从装机地址池里领到一个地址,之后它的地址就不再可预测,管理系统里登记的地址也对不上。装机网单独一个 VLAN,全机房只有它开 DHCP。
规则二:按规模取 2 的幂,先算清一个段要占哪些地址
子网的地址数只能是 2 的幂,所以掩码不是“看着够用就行”,而是先把所有占用加起来,再向上取整:
需要的地址数 = 规划期末的设备数 + 网关占用 + 2(网络地址和广播地址)
网关占用这样算:单台网关,或堆叠成一台逻辑设备的网关,算 1 个;用 VRRP 时虚拟地址加两台设备的实地址,算 3 个;不需要网关的存储网、业务内网算 0 个。块大小取不小于需要地址数的最小 2 的幂,前缀长度 = 32 − log₂(块大小)。
| 设备数 | 单网关时需要 | 掩码 | VRRP 时需要 | 掩码 |
|---|---|---|---|---|
| 5 | 8 | /29 | 10 | /28 |
| 13 | 16 | /28 | 18 | /27 |
| 29 | 32 | /27 | 34 | /26 |
| 61 | 64 | /26 | 66 | /25 |
| 125 | 128 | /25 | 130 | /24 |
| 200 | 203 | /24 | 205 | /24 |
| 300 | 303 | /23 | 305 | /23 |
前五行的设备数是故意卡在边界上的:单网关时,块大小减 3 就是能放的设备上限,/27 最多放 29 台,第 30 台就要换 /26;改用 VRRP 后上限再少 2 台。不少网段开通一两年后“突然不够用”,原因就是当初只算了一个网关地址,后来改成双机 VRRP,两个实地址挤掉了两台设备的位置。
边界附近用脚本算更不容易错:
def prefix_for(devices, gw=1):
need = devices + gw + 2 # 设备 + 网关占用 + 网络地址与广播地址
return 32 - (need - 1).bit_length() # 取不小于 need 的最小 2 的幂
for n in (5, 13, 29, 61, 125, 200, 300):
print(n, f"/{prefix_for(n)}", f"/{prefix_for(n, gw=3)}", f"/{prefix_for(n, gw=0)}")
每行输出设备数,以及单网关、VRRP、无网关三种情况下的掩码。算出掩码之后,起始地址还要对齐到块大小的整数倍:/26 的块大小是 64,第四节只能从 0、64、128、192 开始;写成“x.x.x.32/26”的网段并不存在,设备和计算工具会把它当成 x.x.x.0/26,或者直接报错。
两个例外不按公式算:设备互联的点对点链路只有两台设备,用 /31 或 /30;环回地址每台设备一个 /32。它们也要集中放在一个功能区里,不要散落在业务段之间,否则网段表里会多出几十条零碎记录。
规则三:按物理位置连续,地址顺序跟着机柜走
物理连续的意思是:地址的层次和机房的物理层次一一对应。机房、列、机柜、U 位,每往下一层,都是上一层地址块里的一段连续地址。这样做有三个直接的好处:
- 看地址就知道位置。告警里出现一个 BMC 地址,不用查表就能算出在哪一列、哪个柜、第几台。
- 按列写规则。每列交换机下面是一个连续块,ACL、监控采集范围、汇总路由都能按列写一条。
- 整块回收。一列机柜整体改造或退租时,它的地址是完整的一块,收回来可以原样再分配,不会留下碎片。
具体可以这样定,后面的划分表就按这套规则:
- 每列一个 IPMI 段、一个公网段,第三节或网段本身对应列号:A 列 IPMI 用 10.40.16.0/24,B 列用 10.40.17.0/24,依此类推。
- 每个机柜在段内占 20 个地址,机柜编号 k 从 1 起算,第 k 个机柜从 k × 20 + 1 开始,到 k × 20 + 20 结束;柜内按 U 位从下往上编号,第 n 台服务器的末位是 k × 20 + n。这样 1 号柜从 .21 开始,段首的 .1~.20 正好空出来给网关和其他用途。
- IPMI 地址和公网地址末位相同。B 列 7 号柜第 5 台服务器,IPMI 是 10.40.17.145,公网是 198.51.100.145,知道其中一个就能推出另一个。
不是所有功能区都适合按位置排。业务内网和存储网跟着客户和集群走:一个客户的服务器可能分散在几个机柜,一个 Ceph 集群可能跨两列,它们的段按客户或集群分配,段内再按节点顺序编号。托管客户的公网地址也一样,设备是客户的,可能换柜,按客户分段比按机柜分段省事。判断标准只有一句:地址跟着服务商自己的设备走,就按位置排;地址跟着客户或集群走,就按归属排。
规则四:分层预留,每一层留什么
预留不是最后统一留一块,而是每一层各留一部分,用途各不相同:
| 层级 | 私网怎么留 | 公网怎么留 | 留给什么 |
|---|---|---|---|
| 功能区 | 按规划期末需求取 2 的幂后至少再放大一倍,先启用够用的部分,其余锁定 | 不提前划给功能区,持有的段里至少保留一个完整 /24 不切分 | 扩容时缩短前缀原地翻倍;公网整块留给新业务 |
| 网段 | 段首留给网关和网络设备,段尾留给临时设备 | 每个启用的 /24 留出约 10% 不分配 | 客户加购 IP、换 IP、故障替换时的周转 |
| 机柜 | 每柜的地址区间比满柜台数多 2 个 | 与 IPMI 同步 | 返修机、临时测试机上架时不打乱编号 |
表里的比例是经验做法,增长快的机房可以留得更多。私网放大一倍几乎没有成本;公网稀缺,不能照搬“每个在用块旁边空一个伙伴块”的做法,只在段内保留周转空间,并在台账上把未切分的整段锁定。
预留块最怕被临时借用:借出去的地址往往不会按时归还,伙伴块一旦被占,扩容时只能在同一个 VLAN 接口上再挂一个不连续的段,规则一到规则三会被同时破坏。所以预留块在台账和系统里都要标成锁定,借用必须走变更。
一张划分表:4 列 40 个机柜的机房
假设一个机房有 A~D 四列,每列 10 个 42U 机柜,每柜最多 18 台服务器;A、B 列放服务商自有的出租服务器,C、D 列给托管客户。私网用 10.40.0.0/16,公网用 RFC 5737 的文档专用地址代替实际持有的段,套用时换成你自己的地址。
私网地址充裕,每个功能区统一给 /20(业务内网 /19),远大于首期需求,也便于记忆。七个功能区加一块整体预留,共八块,每块的起点都是自身大小的整数倍:
| 地址块 | 功能区 | 当前启用 | VLAN | 网关 | 分配规则 |
|---|---|---|---|---|---|
| 10.40.0.0/20 | 设备管理网 | 10.40.0.0/24 | 10 | 10.40.0.1 | 核心与防火墙 .2~.10;每列 40 个地址(A 列 .20~.59),柜内按业务接入、管理接入、A 路 PDU、B 路 PDU 的顺序连续;动环 .200~.239 |
| 10.40.16.0/20 | IPMI 网 | 10.40.16.0/22,每列一个 /24 | 21~24 | 各段 .1 | 柜内按 k × 20 + n 编号,.221~.254 留给临时设备 |
| 10.40.32.0/19 | 业务内网 | 10.40.32.0/20 | 2001~2999 | 不配 | 按客户切 /28、/27,不按位置 |
| 10.40.64.0/20 | 存储网 | 10.40.64.0/24、10.40.66.0/24 | 3001、3002 | 不配 | 集群一的 public 网和 cluster 网,各自后面一个 /24 留作扩容;MTU 9000 |
| 10.40.80.0/20 | 装机网 | 10.40.80.0/24 | 30 | 10.40.80.1 | 装机服务器用 .2~.19,DHCP 池 .20~.250,装机时才把服务器端口切进来 |
| 10.40.96.0/20 | 基础服务 | 10.40.96.0/24 | 40 | 10.40.96.1 | 跳板机、监控、DNS、NTP |
| 10.40.112.0/20 | 互联与环回 | 10.40.112.0/24、10.40.113.0/24 | — | — | 前者切 /31 做互联,后者给环回 /32 |
| 10.40.128.0/17 | 整块预留 | — | — | — | 锁定,留给二期或新功能区 |
公网按列和按客户两种方式并存:
| 网段 | 用途 | VLAN | 网关 | 分配规则 |
|---|---|---|---|---|
| 203.0.113.0/24 | A 列出租服务器 | 101 | .1 | 末位与 IPMI 相同(k × 20 + n);.2~.20 和 .221~.254 共 53 个用于客户加购 IP,其中至少 25 个(约 10%)不分配,留作换 IP 和故障替换的周转 |
| 198.51.100.0/24 | B 列出租服务器 | 102 | .1 | 同上 |
| 192.0.2.0/24 | C、D 列托管客户 | 每客户一个,从 1101 起 | 各子网第一个可用地址 | 按客户切 /29、/28、/27,大块和小块分区存放 |
逐条对照四条规则:规则一,八个功能区各有独立的地址块,需要二层的都有自己的 VLAN;规则二,IPMI 网每列 10 柜 × 20 个地址,加网关 1 个、网络和广播地址 2 个,共 203 个,取 /24,存储网不配网关,按设备数加 2 计算;规则三,IPMI 和出租服务器公网都按列、柜、U 位连续,业务内网和存储网按客户与集群;规则四,私网每个功能区只启用一部分、其余锁定,每柜多留 2 个位置,公网每段至少留约 10% 作周转。
划分完成后核对四件事
- 功能区不重叠、没缝隙、起点对齐。用 Python 自带的 ipaddress 模块一次检查:
import ipaddress
zones = ["10.40.0.0/20", "10.40.16.0/20", "10.40.32.0/19", "10.40.64.0/20",
"10.40.80.0/20", "10.40.96.0/20", "10.40.112.0/20", "10.40.128.0/17"]
nets = [ipaddress.ip_network(z) for z in zones] # 起点没对齐会直接抛出 ValueError
print(list(ipaddress.collapse_addresses(nets))) # 只剩 10.40.0.0/16,说明中间没有缝隙
print(sum(n.num_addresses for n in nets) == 2 ** 16) # 再输出 True,说明没有重叠
- 每个网段只对应一个 VLAN、一种用途。逐个核对核心交换机上的三层接口地址与划分表一致,没有某个 VLAN 接口上挂着两个不同用途的段。
- 存储网巨型帧端到端可用。在一台存储节点上用不允许分片的大包测试,9000 减去 20 字节 IP 头和 8 字节 ICMP 头,载荷是 8972 字节:
ping -M do -s 8972 -c 3 10.40.66.12 # Linux;Windows 用 ping -f -l 8972 10.40.66.12
能通才说明沿途交换机端口和两端网卡的 MTU 都已调大;报“Message too long”或超时,说明某一段还是 1500。
4. 装机网以外没有 DHCP。在 IPMI 网和设备管理网里各找一台 Linux 主机,执行 sudo nmap --script broadcast-dhcp-discover,不应收到任何 DHCP 应答。
在 IPAM 里落地这张表
划分表写在文档里,几个月后多半会和现场对不上。把它录进 Toplink DCIM 的 IP 地址管理,四条规则大多可以交给系统守着:段按 CIDR 录入后自动算出起止地址和掩码,网关统一选第一个地址;类型标成公网 IP、IPMI、客户内网、内网 IP 等,存储网和装机网可以用“其他”类型再加标签区分;每个段记录所在 VLAN 和网关所在的交换机,与划分表的 VLAN 列一一对应;伙伴块录成单独的段并锁定,周转地址也设为锁定;开通服务器时只从开启了自动分配的段里取址,并排除已占用和已锁定的地址,预留不会被悄悄用掉。
按列划分的公网段是一个较大的广播域,同一 VLAN 里有几十个客户,需要防止有人改用别人的地址。在交换机管理里对服务器端口启用 ARP 绑定和源地址校验,IP 与 MAC、端口锁定之后,冒用地址的流量会在交换机端口上被丢弃。
常见问题
IP 段划分时网关用第一个地址还是最后一个?
两种都可以,关键是全机房统一。统一用第一个可用地址(.1)更常见,配 VRRP 时虚拟地址用 .1、两台设备用 .2 和 .3;混用会让每个段都要单独查网关,装机模板和脚本也容易写错。
设备互联用 /30 还是 /31?
两台设备之间的点对点链路可以用 /31(RFC 3021),两个地址都可用,比 /30 省一半;前提是两端设备都支持,部分老设备和防火墙不支持时用 /30。放服务器的网段一般不用 /31:它只有两个地址,去掉网关只剩一台设备的位置。
机房只有一个公网 /24,还要按列划分吗?
不用硬分。一个 /24 只够一两列服务器时,按列切反而让每列都不够用;可以整段作为一个网段,段内仍按“列、机柜、U 位”的顺序给地址,保留物理连续的好处,等拿到第二个 /24 再按列分开。