如何简洁检查IP是否在指定多格式IP范围集合内?
简洁检查IP是否属于混合范围的方法(Python实现)
嘿,这个需求我之前刚好处理过!用Python的标准库ipaddress就能完美解决,不用额外装第三方依赖,代码简洁还靠谱。你的IP范围里同时包含CIDR格式(比如10.12.0.0/16)和起止IP格式(比如10.101.0.0-10.103.255.255),我们可以统一处理这两种格式:
核心思路
- 把你的IP范围字符串拆分成单个范围项
- 对每个范围项,判断是CIDR还是起止范围,分别转换成可检查的IP对象
- 将目标IP转换成
IPv4Address对象,遍历所有范围检查是否被包含
完整代码示例
import ipaddress def is_ip_in_ranges(target_ip, ip_ranges_str): # 拆分IP范围字符串为单个项 range_items = ip_ranges_str.split(',') target = ipaddress.ip_address(target_ip) for item in range_items: if '/' in item: # 处理CIDR格式 try: network = ipaddress.ip_network(item, strict=False) if target in network: return True except ValueError: # 跳过无效的CIDR(如果有的话) continue elif '-' in item: # 处理起止IP范围格式 start_ip_str, end_ip_str = item.split('-') try: start_ip = ipaddress.ip_address(start_ip_str) end_ip = ipaddress.ip_address(end_ip_str) if start_ip <= target <= end_ip: return True except ValueError: # 跳过无效的IP范围 continue return False # 测试用的IP范围(就是你提供的那串) ip_range_str = "10.12.0.0/16,10.80.0.0/15,10.83.0.0/16,10.101.0.0-10.103.255.255,10.108.0.0/16,10.121.0.0/16,10.123.0.0/16,10.127.0.0/16,10.129.0.0/16,10.131.0.0/16,10.133.0.0/16,10.135.0.0-10.139.255.255,10.208.0.0/14,10.215.0.0/16,10.218.0.0/15,10.233.0.0/16,172.17.128.0-172.19.255.255,172.24.0.0/15,192.168.0.0/16" # 测试示例 test_ip1 = "10.12.1.1" print(is_ip_in_ranges(test_ip1, ip_range_str)) # 输出: True test_ip2 = "192.168.255.255" print(is_ip_in_ranges(test_ip2, ip_range_str)) # 输出: True test_ip3 = "8.8.8.8" print(is_ip_in_ranges(test_ip3, ip_range_str)) # 输出: False
关键细节说明
strict=False:处理CIDR时,允许网络地址不是严格的网络起始地址(加这个让代码更健壮,避免非标准CIDR格式报错)- 异常处理:跳过无效的IP范围项,避免程序崩溃
- 提前返回:只要找到匹配的范围就立刻返回
True,不用遍历所有项,效率更高
如果是其他语言的话,比如Go可以用net/netip包,Java可以用InetAddress结合子网计算,但Python的方案是最简洁的,因为标准库直接支持两种格式的处理。
内容的提问来源于stack exchange,提问作者Petey B
相关产品推荐
相关产品推荐

