IP 地址的本质:32 位的切分游戏
IPv4 地址就是 32 个比特,写成四个十进制段只是给人看的。真正重要的是它的二重身份:前半段是网络号(哪个小区),后半段是主机号(几栋几单元)。切分线画在哪,由子网掩码说了算——这就是 /24 这类写法的全部含义:前 24 位是网络号,剩下 8 位留给主机。
192.168.1.130/24 的切分:
192.168.1 .130
├─ 网络号 24 位 ─┤├─ 主机号 8 位 ─┤
11111111.11111111.11111111.00000000 ← 子网掩码 255.255.255.0
可用主机数 = 2^8 - 2 = 254
减 2:网络地址本身(.0)不能给主机;广播地址(.255)要留给全子网喊话常见的坑就在这减 2 上:/30 只能接 2 台(点对点专线刚好),/23 能接 510 台。规划网段时先算容量,别等机器加到一半才发现网段塞满了。
CIDR:让切分线随便画
早年地址按 A/B/C 类硬切,A 类一千六百万台主机基本浪费。CIDR(无类别域间路由)放开了限制:前缀长度可以是任意数字,10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 都是合法切法。做容量规划时按需切分,比如给 Kubernetes 集群切 Service 网段和 Pod 网段,互不重叠、各留余量——网段规划是一次错误要痛苦好几年的事,改起来等于全网搬迁。
私网地址与 NAT
32 位地址满打满算 43 亿个,全球设备早就不够分。方案是私网复用 + NAT 转换:以下三段只准在内部用——10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。内网机器访问公网时,出口路由器把私网源地址替换成公网 IP 并记下映射(NAT),回包再换回来。公司里一百台机器共享一个公网出口,就是 NAT 在干活。代价是:外网无法主动连进内网,所以才有内网穿透、端口映射这些需求。
路由表:每一跳的抉择
$ ip route
default via 192.168.1.1 dev eth0 ← 兜底:不知道去哪就走网关
10.244.0.0/16 dev cni0 ← Pod 网段走容器桥
10.244.1.0/24 via 192.168.1.20 dev eth0 ← 远端节点网段指到对端机器
// 匹配规则:最长前缀优先
// 目标 10.244.1.5 同时命中三条,但 /24 比 /16 长,比 default 更长
// 所以选第三条——前缀越具体,优先级越高理解了最长前缀匹配,很多诡异路由问题迎刃而解:流量没走你预期的网卡,多半是有条更长前缀的路由在抢。排查命令 ip route get 目标IP,直接告诉你会从哪个口出去。
实战:容器网络冲突这种怪病
经典事故:办公网是 172.17.0.0/16,Docker 默认网桥也是 172.17.0.0/16——容器里访问公司内网服务,流量全被网桥截胡,ping 通容器 ping 不通内网。解法是改 Docker 的 bip 配置换一个不冲突的网段。根治靠规划:私网三大段内部再细分,给容器、虚拟机、办公网各划一块,登记在册。下一篇继续往下走一层:同一个小区里,机器怎么靠 MAC 和 ARP 找到彼此。
评论 (0)