地址类的原罪:A/B/C 的棺材板
早年间搞 IP 的人大概没想过 42 亿个地址会不够用——毕竟那时候计算机跟冰箱一样大。 1981 年 RFC 791 定下来那套分类法子,A 类一个网络号就占走 1677 万个地址,真慷慨。 麻省理工、通用电气、苹果……全都分到过 /8。 现在回头看简直犯罪。 93 年 CIDR 出来之前,骨干路由器的路由表里塞了快两万个条目,而且还在指数级涨。 我翻过一份 1994 年的 IETF 会议记录,里面有张图显示:核心路由表条目每 10 个月翻一番。 10 个月! 要没 CIDR 把网络号和主机号的界线抹掉,路由表内存占用到现在得几百 GB。 CIDR 这玩意儿说白了就是在子网掩码上做可变长位掩码。 比方说 10.0.0.0/22,前 22 位是网络部分,剩下 10 位给主机。 你拿掩码 255.255.252.0 跟 IP 一 AND,立马分出网段。 这背后的二进制位运算——AND、移位、前缀匹配——交换芯片里用 TCAM 硬件实现,查一条最长前缀匹配只要 5 纳秒。 有人问 VLSM 和 CIDR 有啥区别? VLSM 是路由协议内部玩的花活,CIDR 是自治系统间聚合的规矩。 但说到底,都是为了榨干每寸地址空间。
NAT 这座屎山,不得不爬
地址不够了怎么办? 打补丁呗。 NAT(网络地址转换)就是最大的补丁。 1994 年 RFC 1631 把它描述成“临时方案”——哈! 临时了三十年。 一个家用路由器后面挂几十个设备,共用运营商给的一个公网 IP,全靠端口映射续命。 原理不复杂:改包头里的源 IP 和源端口,维护一个映射表。 但你真在自己写的 netfilter 模块里抓过包就会明白,这玩意儿的 corner case 能让人发疯。 比如 FTP 这种带内传 IP 的应用层协议,NAT 必须解析 PORT 命令里的私有地址并替换。 SIP、H.323、RTSP……全是雷。
三个要命的坑,照着做能少趟几次雷
我踩过的 IPv4 深坑比办公室的咖啡杯还多。 挑三个最普遍的讲讲,附上血泪换来的解法。 坑一:私有地址冲突,尤其是收购合并时。 两边都用了 10.0.0.0/8,VPN 一拉直接炸。 路由表看不出错,但 ping 同网段一堆 IP 全通——全通才危险,因为不知道通的到底是哪家的主机。 解法:要么重编址,要么在边界做二次 NAT。 重编址最干净,但业务停机窗口不是谁都给得起。 二次 NAT(也叫 NAT 叠加)就是再套一层源目的地址转换,把冲突地址段映射到临时虚拟段。 我们用过,配置复杂到运维同事骂了三天娘。 坑二:ARP 表溢出。 二层网络里广播泛滥,交换机 CAM 表被撑爆,网关的 ARP 缓存超限。 表象是间歇性丢包,traceroute 莫名跳不通。 根因常常是 /24 甚至更小的子网里塞了太多主机,或者有人接了环路。 解:划 VLAN,缩小广播域;核心交换机打开 ARP 限速和 DAI 检查。 我们在一个园区网做改造,把 /16 切成 64 个 /22,ARP 包数量直接降到原来的 1/8。 坑三:IP 地址管理失控。 起初用 Excel,后来用 phpIPAM、NetBox,但数据源还是靠人填。 时间一长,哪个 IP 配给了哪个容器、哪个虚机迁移了、哪个临时工位撤了,全乱。 有次故障排查,三个部门指着同一个 IP 说“是我们的”,结果是个被遗忘的测试虚拟机在发 ARP 欺骗。 解法狠简单:自动化扫描 + IPAM 联动 + 合规性报警。 写 Agent 定期从所有 hypervisor 和容器编排平台拉 inventory,跟 IPAM 对账,发现幽灵 IP 直接告警甚至自动回收。 这玩意儿上线之后,IP 冲突告警一个月从二百多条降到个位数。 所以你看,IPv4 就是这么一个缝缝补补又三年的东西。 设计之初的简洁被现实碾得稀碎,可那一行行堆砌起来的补丁里,倒也有种异样的工程美感。 粗糙,但管用。 只要还有一台老旧 XP 机器在工厂里跑着工控软件,IPv4 就死不了。作者|大讲堂
排版|大讲堂
审核|满满
大讲堂