SANSUI'S BLOG

系统外观
分类标签
RSS
Sansui 2023
All rights reserved
人活着就是为了卡卡西
2020 年 12 月 12 日

看看是谁在D我

自从部署了服务器,一直都觉得访问量不太正常。但我也仅仅是对IP做了防护,CDN防火墙也没怎么设置。

直到最近觉得,天天访问上万,唯一IP数却一千不到,cache率更是一直都在1%以下。决定看看是哪些人(IP)干的事,服务器实在不值得。

查看ip访问行为

web服务器使用的nginx,由于CDN的关系,nginx需要有http-realip的模块才能查看CDN前的ip。找了不少资料就只觉得这个文章不错,废话少过程清晰,还很贴心给了生成脚本。

CloudFlare CDN下Nginx正确获取真实IP教程

配置完成后运行了一段时间。先统计下当前的log文件前10名的访问量和相应ip:

$ cat access.log | awk '{print $1}'| sort -n | uniq -c | sort -n -r | head -10

    979 103.242.119.217
    285 1.163.108.18
    204 18.166.211.38
    176 184.170.243.198
    154 66.98.113.44
    149 40.65.134.91
    116 2400:8902::f03c:92ff:fe7b:5f02
    113 113.71.61.213
     92 185.245.1.151
     80 107.148.250.111

第一名, 103.242.119.217 ,979次?这多得也太夸张了?!

好吧,来看看这个ip在干什么。

$ cat access.log | grep 103.242.119.217 | tail -n 20
103.242.119.217 - - [10/Dec/2020:08:54:41 +0000] "GET /WWW/phpMyAdmin/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:41 +0000] "GET /phpMyAdmln/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:41 +0000] "GET /phpMyAdmin_ai/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:41 +0000] "GET /__phpMyAdmin/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:42 +0000] "GET /program/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:42 +0000] "GET /shopdb/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:42 +0000] "GET /phppma/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:42 +0000] "GET /phpmy/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:43 +0000] "GET /mysql/admin/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:43 +0000] "GET /mysql/dbadmin/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:43 +0000] "GET /mysql/sqlmanager/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:43 +0000] "GET /mysql/mysqlmanager/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:44 +0000] "GET /wp-content/plugins/portable-phpmyadmin/wp-pma-mod/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:44 +0000] "GET /sqladmin/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
103.242.119.217 - - [10/Dec/2020:08:54:44 +0000] "GET /sql/index.php HTTP/1.1" 404 178 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
...

…………尼玛,恶意扫描啊!扫描常用路由啊碰运气啊!人干事?

但估计这种恶意扫描的也是日抛ip,ban也没什么意义。只能设置limit rate了。

看看第二名在干什么。

$ cat access.log | grep 1.163.108.18 | tail -n 10
1.163.108.18 - - [10/Dec/2020:10:15:38 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:16:36 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:17:36 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:18:31 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:19:32 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:20:35 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:21:30 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:22:34 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:23:36 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"
1.163.108.18 - - [10/Dec/2020:10:24:32 +0000] "GET /clash/config HTTP/1.1" 200 4978 "-" "ClashforWindows/0.13.1"

这应该是个用户吧,但你这更新就更新吧,每分钟更新一次?能不能积点德?(哽塞.jpg)

消耗流量都是其次,也并没有多出很多。但我不喜欢泡沫和虚高的数值,也讨厌因为不用付出成本所以极其浪费资源的做法,于我而言就像房间堆满了垃圾。看起来好像有很多东西,实际上什么也没有。

要是我这种心态,创业肯定找不到风投,很快就倒闭。

这些IP ban了也不太好……开个Challenge吧。

顺带一提,默认配置文件的更新间隔早就给取消了。取消的原因倒不是怕被D,当时还完全没想过会租服务器,只是单纯的因为程序会有各种意想不到的BUG,时不时出现全NULL,连之前能用的都没有了……自动更新太容易挂掉,于是取消了自动更新。

然后继续看,从第2名到第8名都是这种行为。我说呢,今天从浏览器进入的配置文件的页面一直无法加载,但服务端不管怎么请求都没有问题,最后不得已换成了一个静态文件。敢情就是你们搞没的?

再加上gin的静态cache本身就不太稳。之前使用css的时候基本运行3天就外链请求不出来了,最后也是用nginx挂的静态文件。

第7名到第10名,很明显,同类程序的爬虫。Duang地一下请求几个一般人不用的链接。对于这些爬虫我觉得倒还行,请求频率并不会太高。但非常不喜欢直接伸手全爬别人爬好的,这是极其恶劣的生态与shame的想法。爬虫的理想的状态是网状分布式的部署,而不是树。

防护措施

由于挂了 CloudFlare,iptables 自然没什么用,还容易不小心把 CF 的 IP ban 掉(虽然在发现这一点之前我折腾了快一下午的 iptables )。直接去配置CF的防火墙。

我需要应对的情况主要就这一个:

  • 一分钟更新一次配置文件的ip,给他们一个小小的JS Chanllenge

(突然有点后悔写了JS Chanllenge的破解是什么回事……)

但是啊,这些ip还是不少活人的,长期都Chanllenge没有必要。而且我也不能天天都像今天这么看log,实在是消耗时间,消耗时间就是生命。

而 Nginx 和 CloudFlare 的rate limit 都是防止CC,限制的每秒或者每分钟的请求数。但这恰恰是我不能做的,默认的配置文件的写法1s内会请求十几次,多请求几次就一分钟就几十次了(配置文件该改改了)。我需要处理的是过于规律且相对频繁的请求,而非CC。

于是连夜写了个分析log的程序,主要是以下功能:

  • 根据请求间隔的规律判断是否为需要处理的ip 特征:
    • 请求间隔过于规律,比如每分钟一次、每分钟两次等等。有容错率。
    • 不计算大于 threshold 分钟的间隔与等于0分钟的间隔。
  • 排除 CloudFlare 子网下的IP。CloudFlare 的 ip 网段在线获取。
  • 使用 CloudFlare Api 更新 JS Chanllenge 的 filter,给需要过滤的 ip 加上 Challenge

然后用 cron 定时执行。常驻后台没必要,也没想做实时监控。

把恶意 IP 和常见的 IP 过滤掉后,最新的就只剩下 CloudFlare 的请求了,终于干净了……但好寂寞啊…………看来是真的没什么活人用呢。

一天后

今天的Requests数是17435。

Unique Request是1188。

Challenge挑战的Request数是,8200(微笑脸)。

你妹啊,Bot一样的自动更新占了快一半啊!摔!

而且每次防火墙每次更新过滤的ip都是那么40个左右,Challenge通过率是0.5%。

40ip个会不会有点多?是不是程序有问题?我开始也这么想过,但我自己也设置有定时更新,还设置了三份,都没见把我自己ban掉。

累了,感觉不再爱了。

更新于 2020-12-12 08:00
Waline