恶意IP识别教程

更新于 2025年6月17日 WordPress 教程

恶意IP识别教程

之前写过一篇文章说我屏蔽了一堆疑似采集的 ip 后,网站不卡了,今天和大家分享一下我是如何发现这些恶意访问的ip。

我假设你会

  1. 通过 ssh 登陆你的服务器
  2. 知道如何找到你的网站的 access log(如果你安装了宝塔,那么网站的访问日志在 /www/wwwlogs 这个目录中)

当然,如果不会也没什么关系,不妨碍了解这些知识。

接下来我教大家通过分析访问日志找到恶意 ip 的几个方法,大家可以先收藏,需要的时候拿出来看。

一、大量访问的 ip 一般不正常

一个正常的人,访问一个网站是不可能在短时间产生大量请求的,这是个再正常不过的想法。

因此我们聚合近期访问的ip,按照访问次数排序,那些访问次数巨大的ip就很可疑了。

使用 tail + awk 命令组合,找到访问量最大的一些 ip。命令如下:

tail -n100000 access_log_file.log | awk '{print $1}' | sort | uniq -c  | sort -rn | more

得到的结果可能是类似下面的列表:

21406 120.244.200.140
14537 52.70.240.171
14375 23.22.35.162
14238 3.224.220.101
4675 8.138.101.223
2810 120.244.200.75

第一列是访问次数,第二列就是 ip。

看这个结果很明显就不正常,最近10万次访问有2万次是同一个ip访问的,有问题的概率很大。

接下来我们就需要一一验证这些 ip 的归属地,因为有一些可能是蜘蛛 ip,如果不是蜘蛛 ip,一般我就直接屏蔽了。

二、经常访问 wp-json 一般不正常(WordPress 网站)

如果你的网站没有 app,那么理论上不会有人访问 wp-json 链接,然而如果日志中有大量的 wp-json 访问,那么说明有人在偷偷探测或采集

例如,一个典型的访问日志如下:

183.157.39.120 - - [12/Jun/2025:22:41:59 +0800] "GET /wp-json/oembed/1.0/embed?url=http%3A%2F%2Fpinyin8.com%2F56469.html HTTP/1.1" 500 59 "https://google.com" "Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844 Safari/537.36" "-" 0.070

很明显就是恶意请求,正常用户不会产生这种请求,可以直接屏蔽这个ip。

三、经常访问不存在的路径的请求一般不正常

这种和经常访问 wp-json 同理,如果在日志中经常有用户访问不存在的地址,说明有用户在攻击。

tail -n10000 your_access_log.log | awk '$9 == 404 {print $1,$7}'  | sort | uniq -c | sort -rn

典型的输出如下:

2 196.251.87.59 /.env
2 104.250.135.50 /nobom.php
2 101.33.234.97 /setpwd.php
1 8.211.58.150 /nodeinfo/2.0
1 8.211.38.78 /nodeinfo/2.0
1 8.211.195.105 /nodeinfo/2.0
1 78.153.140.224 /.env.new
1 78.153.140.224 /.env-2fa
1 78.153.140.224 /.env
1 78.153.140.151 /.env

接下来就可以分析这些 ip 有什么特征,然后判断是否需要屏蔽这些 ip 段。

四、不常见的 UA 一般不正常

UA,即 User-Agent,客户端请求网站时基本会带上的信息,比如 Chrome 浏览器的 UA 如下:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36

但爬虫,自动化工具的 UA 一般会有所区别,因此我们可以统计访问靠前的 UA 来分析是否有恶意请求。

命令如下:

tail -n10000 access_log_file.log | awk -F\" '{print $6}'  | sort | uniq -c | sort -rn | mores

输出类似如下:

2894 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
631 Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)
578 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36
475 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.2; +https://openai.com/gptbot)
428 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43
43 meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)
35 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
33 Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/606.2.35 (KHTML, like Gecko) Mobile/15E148 QQ/8.0.8.458 V1_IPH_SQ_8.0.8_1_APP_A Pixel/1242 Core/WKWebView Device/Apple(iPhone XS) NetType/WIFI QBWebViewType/1 WKType/1
32 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/535.2 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
31 Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/606.2.87 (KHTML, like Gecko) Version/13.0.4 Mobile/15E148 Safari/604.1

可以看到大部分是来自爬虫的请求,

Claude 的爬虫非常疯狂。但现在 AI 时代,这些大模型的爬虫通常是抓取内容去训练,我们还不太好阻止。当然,如果你不希望你的网站数据拿去训练,可以直接屏蔽这种 UA。

找到恶意 ip 的方法很多,然而手动操作还是有些麻烦的,目前我正在开发一款自动发现并拦截恶意请求的插件,敬请期待。