将 IP 地址列表分组为 IP 范围的工具

将 IP 地址列表分组为 IP 范围的工具

我负责管理一个网站,该网站目前被来自不同 IP 地址的 HTTP 请求淹没,但所有请求都使用相同的用户代理字符串

我已经对日志文件进行了 grep,现在有一个文件,每行包含所有 2696 个唯一 IP 地址。看起来每 20 个左右的 IP 都属于同一 IP 范围,即第一个、第二个,有时第三个八位字节是相同的

有没有办法将这些 IP 分组在一起,以便查看每个 IP 范围的列表?是某种命令行向导还是一种工具,我只需将 IP 放入其中,即可获得 IP 范围作为输出?

编辑:

例如,24 个 IP 地址以 开头,104.140并且有三个不同的第三个八位字节。8 个 IP 以 开头104.140.183,另外 8 个以 开头104.140.211,最后 8 个以104.140.4

我的防火墙管理器允许我根据网络前缀长度阻止 IP 范围,并允许我/24选择/32

我对子网划分了解不够,不知道输出应该是什么,但我想 A)查看有多少个不同的范围,以及 B)理想情况下输出的格式我可以用来在防火墙上阻止范围

答案1

好吧,我认为这可能对你有用 - 假设你已经安装了 awk 并且 ip 地址在 ip.txt 中:

cat ip.txt | awk 'BEGIN { FS = "." } ; { printf("%s.%s.%s\n%s.%s.%s.%s\n", $1, $2, $3, $1, $2, $3, $4) }' | sort | uniq -c | sort -rn

稍微解释一下:

  • cat 打印文件
  • awk 将 IP 地址拆分为 4 个变量,并打印 /24 和 /32 IP 范围
  • sort 对 IP 地址进行排序,以便我们可以对它们进行计数
  • uniq 计算它们(感谢 -c 选项)并将频率放在 ip 地址前面
  • sort 按频率计数的降序排列(-r)(-n 解释值而不是字符串)

请注意,/32 和 /24 范围均已显示。如果您只想要 /24 范围中的 /32,请调整 printf 语句(这样printf("%s.%s.%sn", $1, $2, $3)仅打印 /24 和printf("%s.%s.%s.%s\n", $1, $2, $3, $4)/32)。

相关内容