You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁检查IP是否在指定多格式IP范围集合内?

简洁检查IP是否属于混合范围的方法(Python实现)

嘿,这个需求我之前刚好处理过!用Python的标准库ipaddress就能完美解决,不用额外装第三方依赖,代码简洁还靠谱。你的IP范围里同时包含CIDR格式(比如10.12.0.0/16)和起止IP格式(比如10.101.0.0-10.103.255.255),我们可以统一处理这两种格式:

核心思路

  1. 把你的IP范围字符串拆分成单个范围项
  2. 对每个范围项,判断是CIDR还是起止范围,分别转换成可检查的IP对象
  3. 将目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:58