从脚本并行映射数千个子网的最佳方法是什么?



为了清点a类网络中的一个端口,我使用nmap将其扫描为几千个c类网络。我使用parallel来一次运行32个子网扫描作业。

脚本的最小化版本:

while read subnet; do
    echo nmap -Pn -p"$tcpport" "$subnet" >> /tmp/nmap_parallel.list;
done < $subnets
parallel -j32 < /tmp/nmap_parallel.list
wait
echo "Subnet scan for port $tcpport complete."

这种方法的问题是脚本在并行处停止。

是否有更好的方法从脚本中使用并行?

你不能用&为了同时处理其他的?如下所示;

#!/bin/bash
ports="20 21 22 25 80 443"
for p in $ports
do
nmap -Pn -p$p 10.0.1.0/24 &
done

Nmap具有内置的并行性,应该能够在单个命令中处理扫描a类网络。实际上,由于Nmap的网络状态监视和反馈机制,每次只运行Nmap的一个实例通常更好。Nmap的瓶颈不是处理器,因此使用parallel运行多个实例并没有什么帮助。相反,Nmap将一次发送多个探测并等待响应。当有新的响应进来时,就可以发出新的探测。如果Nmap对每个探测都得到响应,它会增加它发送的未完成探测的数量(并行度)。当它检测到丢包时,它减少这个数字(以及其他一些与时间相关的变量)。

这种自适应定时行为在官方的Nmap网络扫描书中有详细的讨论,它基于TCP中使用的公共算法。

你可能能够通过调整一些时间选项和消除扫描阶段,不重要的你加快你的扫描。在简单的一端,您可以尝试-T4一次增加几个与时间相关的设置,而不会超出高速链路的能力。您还可以尝试添加-n以跳过反向dns名称查找阶段,因为您可能对这些结果不感兴趣。

您已经使用-Pn标志跳过主机发现阶段;如果您只扫描一个端口,这可能是一个好主意,但它也可能导致混乱的输出和较慢的扫描时间,因为Nmap必须假设每个主机都已启动并执行真正的端口扫描。还记得自适应时序算法吗?它们在进行主机发现时的行为略有不同,这可能会导致更快的扫描时间。如果不喜欢默认的主机发现探测,可以自己调优它们。如果我正在扫描端口22,我可以使用-PS22将其用作主机发现探针,这意味着我的输出将只显示该端口打开或关闭的主机(没有防火墙,也没有关闭)。如果您坚持使用-Pn,那么您可能还应该使用--open选项来只显示打开了所选端口的主机,否则您将有大量的输出需要处理。

最新更新