我负责管理一个网站,该网站目前被来自不同 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)。