expandCIDR 展开CIDR为所有包含的IP地址
(host Host, hostChan chan<- Host)
| 140 | |
| 141 | // expandCIDR 展开CIDR为所有包含的IP地址 |
| 142 | func expandCIDR(host Host, hostChan chan<- Host) { |
| 143 | _, ipNet, err := net.ParseCIDR(host.Origin) |
| 144 | if err != nil { |
| 145 | printError(fmt.Sprintf("解析CIDR失败: %s - %v", host.Origin, err)) |
| 146 | return |
| 147 | } |
| 148 | |
| 149 | count := 0 |
| 150 | maxHosts := 65536 // 限制最大主机数,防止内存溢出 |
| 151 | |
| 152 | // 获取网络地址和掩码 |
| 153 | ip := make(net.IP, len(ipNet.IP)) |
| 154 | copy(ip, ipNet.IP) |
| 155 | |
| 156 | // 计算网络中的主机数 |
| 157 | ones, bits := ipNet.Mask.Size() |
| 158 | if bits-ones > 16 { // 如果主机位超过16位,限制扫描范围 |
| 159 | printError(fmt.Sprintf("CIDR %s 包含的主机数过多,已限制为前%d个", host.Origin, maxHosts)) |
| 160 | } |
| 161 | |
| 162 | // 遍历网络中的所有IP |
| 163 | for { |
| 164 | if !ipNet.Contains(ip) { |
| 165 | break |
| 166 | } |
| 167 | |
| 168 | if count >= maxHosts { |
| 169 | printError(fmt.Sprintf("CIDR %s 包含的主机数超过限制(%d),已截断", host.Origin, maxHosts)) |
| 170 | break |
| 171 | } |
| 172 | |
| 173 | // 创建新的Host并发送到channel |
| 174 | newHost := Host{ |
| 175 | IP: make(net.IP, len(ip)), |
| 176 | Origin: host.Origin, |
| 177 | Type: HostTypeIP, |
| 178 | } |
| 179 | copy(newHost.IP, ip) |
| 180 | hostChan <- newHost |
| 181 | |
| 182 | // 递增IP地址 |
| 183 | ip = NextIP(ip, true) |
| 184 | count++ |
| 185 | } |
| 186 | |
| 187 | if config.Verbose { |
| 188 | printInfo(fmt.Sprintf("CIDR %s 展开为 %d 个IP地址", host.Origin, count)) |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | // IterateAddr 无限扫描模式,从指定IP开始向上下扩展 |
| 193 | func IterateAddr(addr string) <-chan Host { |
no test coverage detected