CIDR 表示法
CIDR(Classless Inter-Domain Routing,无类域间路由)是一种简化的 IP 地址分配和路由选择协议,它使用了一种叫做 CIDR 表示法的方法来表示 IP 地址范围。
CIDR 表示法使用 IP 地址和前缀长度的组合来表示一个 IP 地址段,其中前缀长度指的是 IP 地址中网络部分的长度。
如,192.168.0.0/30 表示了一个包含 4 个 IP 地址的地址段,其中前 30 位是网络地址,后 2 位是主机地址。
| 配置 | ip 地址段 |
|---|---|
| 192.168.0.0/30 | 192.168.0.0-192.168.0.3 |
| 192.168.0.0/24 | 192.168.0.0-192.168.0.255 |
| 192.168.0.0/16 | 192.168.0.0-192.168.255.255 |
| 192.168.0.0/8 | 192.168.0.0-253.255.255.255 |
| 172.16.0.0/12 | 172.16.0.0-172.31.255.255 |
| 10.0.0.0/8 | 10.0.0.0-10.255.255.255 |
| 188.180.0.0/22 | 188.180.0.0-188.180.3.255 |
应用场景
1. 网络配置与路由
这是CIDR最根本的用途,用来定义网络边界和路由规则。
* 设备配置:在路由器、交换机、服务器网卡上配置IP时,必须用CIDR表示子网。例如 192.168.1.10/24,/24 就定义了该IP所在的子网范围。
* 路由表:路由器通过CIDR来聚合路由条目。例如,把多个连续的子网合并成一条 10.0.0.0/8 的路由,大幅减少路由表规模。
2. 云服务与网络安全
在云平台和安全策略中,CIDR是定义“允许/拒绝哪些IP”的标准方式。
* 安全组/防火墙:配置规则时,源/目标地址几乎都用CIDR。例如,允许 203.0.113.0/24 访问,就代表允许这个网段内的所有IP。
* VPC/子网划分:在AWS、阿里云等平台创建私有网络时,必须用CIDR来指定VPC和子网的地址范围,例如 10.0.0.0/16。
* 访问控制列表(ACL):在Nginx、Redis等服务的配置中,用CIDR来限制可访问的客户端IP段。
3. 容器与Kubernetes网络
在容器编排系统中,CIDR是网络模型的核心。
* Pod/Service网段:Kubernetes集群在初始化时,需要指定Pod和Service的CIDR范围,例如 10.244.0.0/16。
* 网络策略:K8s的NetworkPolicy用CIDR来定义允许进出Pod的IP范围。
4. 网络规划与地址管理
在规划一个网络时,CIDR是计算和分配地址的工具。
* 子网划分:将一个大的CIDR块(如 192.168.0.0/16)切分成多个小的子网(如 192.168.1.0/24、192.168.2.0/24),分配给不同部门或区域。
* IP地址管理(IPAM):在大型网络中,用CIDR来跟踪和管理已分配和未分配的地址段。
5. 日志分析与监控
在排查问题时,CIDR用于快速过滤和聚合日志。
* 日志查询:在ELK、Splunk等系统中,用CIDR快速筛选出来自某个网段的访问记录。
* 流量分析:在监控工具中,按CIDR聚合流量,观察某个网段的整体趋势。
转换脚本
# python 3.12.7import ipaddressdef cidr_to_ip_range(cidr): try: network = ipaddress.ip_network(cidr, strict=False) return { "network": str(network.network_address), "broadcast": str(network.broadcast_address), "netmask": str(network.netmask), "cidr": network.prefixlen, "total_ips": network.num_addresses, "start_ip": str(network.network_address), "end_ip": str(network.broadcast_address) } except ValueError as e: return f"错误:{str(e)}"if __name__ == "__main__": cidr_input = input("请输入CIDR格式(例如 192.168.1.0/24 或 2001:db8::/32): ") result = cidr_to_ip_range(cidr_input) if isinstance(result, dict): print("\nCIDR解析结果:") print(f"网络地址: {result['network']}") print(f"广播地址: {result['broadcast']}") print(f"子网掩码: {result['netmask']}") print(f"IP总数: {result['total_ips']:,}") print(f"IP范围: {result['start_ip']}-{result['end_ip']}") else: print(result)λ python a.py 请输入CIDR格式(例如 192.168.1.0/24 或 2001:db8::/32): 192.168.1.0/24 CIDR解析结果: 网络地址: 192.168.1.0 广播地址: 192.168.1.255 子网掩码: 255.255.255.0 IP总数: 256 IP范围: 192.168.1.0-192.168.1.255