Skip to content

Error when scanning IP ranges containing multiple subnets (e.g., /22) #110

@WhenitComestoCodeIamNot

Description

The function get_ip_seg_len() in net.py encountered an error when processing a subnet that spans multiple CIDR blocks. Specifically, attempting to handle IP ranges like 103.168.174.0-103.168.176.255 resulted in an invalid subnet conversion (103.168.174.0/22). which would need to be something like...

103.168.174.0/23 (covers 103.168.174.0 - 103.168.175.255)
103.168.176.0/24 (covers 103.168.176.0 - 103.168.176.255)

OG code:

def get_ip_seg_len(ip_seg: str) -> int:
    """获取一个 IP 段内的 IP 数目"""
    if '-' in ip_seg or '/' in ip_seg:
        return IPy.IP(ip_seg, make_net=True).len()
    else:
        return 1

What I changed that to:


import IPy
import random
import requests
from xml import etree
from ipaddress import summarize_address_range, ip_address

def get_ip_seg_len(ip_seg: str) -> int:
    """获取一个 IP 段内的 IP 数目 (Handles both CIDR & Range)"""
    if '-' in ip_seg: 
        start_ip, end_ip = map(ip_address, ip_seg.split('-'))
        cidr_blocks = list(summarize_address_range(start_ip, end_ip))
        return sum(IP(str(cidr)).len() for cidr in cidr_blocks)  

    if '/' in ip_seg: 
        return IP(ip_seg, make_net=True).len()

    return 1

Seemed to work ok for me now.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions