Ingram icon indicating copy to clipboard operation
Ingram copied to clipboard

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

Open WhenitComestoCodeIamNot opened this issue 10 months ago • 0 comments

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.

WhenitComestoCodeIamNot avatar Jan 30 '25 22:01 WhenitComestoCodeIamNot