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 再按列分開。