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

如何将嵌套公网IP生成循环转为异步流实现异步批量检测?

解决方案:将嵌套IP生成循环转为异步流实现高效扫描

核心思路

把同步的嵌套IP生成逻辑转为惰性异步流,结合buffer_unordered实现高并发检测——既不需要预存所有IP占用内存,又能充分利用异步IO特性解决同步循环效率极低的问题,让工具完全独立运行。

完整代码实现

首先确保依赖配置正确,再实现流生成与扫描逻辑:

[dependencies]
tokio = { version = "1.0", features = ["full"] }
futures = "0.3"
mongodb = "2.0" # 根据实际使用的MongoDB驱动版本调整
use futures::stream::{self, StreamExt};
use mongodb::Client;

// 自定义公网IP判断逻辑,可按需补充更多保留段过滤规则
fn is_public(i1: u8, i2: u8, i3: u8) -> bool {
    // 排除常见私网/保留IP段
    !( (i1 == 10) 
        || (i1 == 192 && i2 == 168) 
        || (i1 == 172 && (16..=31).contains(&i2)) 
        || (i1 == 127)
        || (i1 == 169 && i2 == 254) )
}

// 生成公网IP的异步流(惰性生成,不预存所有IP)
async fn generate_public_ips() -> impl futures::Stream<Item = String> {
    stream::iter(0u8..256)
        // 组合IP第一段与第二段
        .flat_map(|i1| stream::iter(0u8..256).map(move |i2| (i1, i2)))
        // 组合前两段与第三段
        .flat_map(|(i1, i2)| stream::iter(0u8..256).map(move |i3| (i1, i2, i3)))
        // 过滤私网IP段
        .filter(|(i1, i2, i3)| futures::future::ready(is_public(*i1, *i2, *i3)))
        // 组合前三段与第四段,生成完整IP字符串
        .flat_map(|(i1, i2, i3)| stream::iter(0u8..256).map(move |i4| format!("{}.{}.{}.{}", i1, i2, i3, i4)))
}

async fn run_scan(mongodb_url: &str) {
    // 初始化MongoDB客户端
    let client = Client::with_uri_str(mongodb_url)
        .await
        .expect("Failed to connect to MongoDB");

    // 生成IP流并异步处理
    generate_public_ips()
        // 将每个IP映射为异步检测任务
        .map(|ip| {
            let client_clone = client.clone();
            async move {
                check_server(ip, &client_clone).await;
            }
        })
        // 并发执行任务,控制同时处理1000个请求(可按需调整)
        .buffer_unordered(1000)
        // 等待所有任务完成
        .collect::<Vec<_>>()
        .await;
}

// 你的IP检测逻辑(示例)
async fn check_server(ip: String, client: &Client) {
    // 这里实现具体的检测逻辑,比如端口扫描、服务探测等
    // 检测完成后可将结果写入MongoDB
}

关键细节说明

  • 惰性流生成:所有IP都是按需生成的,不会一次性占用内存存储全部40亿IP,仅在需要处理时生成下一个IP。
  • 异步过滤适配:用futures::future::ready把同步的is_public转为异步流的过滤条件,适配Stream API的要求。
  • 并发控制:buffer_unordered(1000)保持和你之前文件流处理一致的并发数,可根据系统性能和目标网络环境调整数值。
  • MongoDB客户端复用:Client是可安全克隆的轻量级对象,内部通过Arc共享连接池,克隆不会创建新连接,避免资源浪费。

优化建议

  • 可给generate_public_ips添加参数,支持指定IP段范围(比如只扫描特定网段),缩小扫描范围提升效率。
  • 在check_server中给检测请求添加超时控制,避免单个慢请求阻塞整个流程。
  • 加入错误捕获逻辑,避免单个任务失败导致整个扫描终止。

内容的提问来源于stack exchange,提问作者Skyslycer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:20:35