Minecraft(我的世界)中文论坛

标题: 初入实战?一名码农教你从反压测中锻炼开发思路(涵盖 [Web|TCP|插件] 等多方面内容)

作者: Moziyu    时间: 2019-4-12 17:06
标题: 初入实战?一名码农教你从反压测中锻炼开发思路(涵盖 [Web|TCP|插件] 等多方面内容)
本帖最后由 Moziyu 于 2019-4-29 18:01 编辑


前言


发这个贴本来只是为了介绍一次自己动手反压测的实战经验,后来发现这个版块有很多在热心学习Java的同学。作为一名工作多年的老Java,深知学习开发之初实战的重要性。如果能得到一些较为简单的例子进行反向研究,对能力提升是非常有帮助的,能快速掌握Java多种应用方法也对更深层的理解有所帮助。
本次的实战中,整套反压测组件的四个组件皆源于不同的应用场景中。如果你对特别的思路和解决方案感兴趣,就请仅带着好奇的心态继续浏览这个帖子吧。关于本人的代码风格、其他更优秀的解决方案,仅需简单提一下就好,请勿争论。





事件介绍


服务器从4月7日中午12点半左右开始受到压测攻击(攻击者使用攻击脚本,使大量账号通过代理进服并注册,同时跑图或放置拆除方块卡服)。据群内玩家推测,是由于我的服务器权限价格和游戏体验等等优于某个想赚钱想疯了的商业服,导致对方玩家大量流入我服,致使对方服主进行的报复行为。
由于我刚好在外地旅游,没有带电脑,时间安排较紧没法现去网吧搭建开发环境写应对工具,攻击者可能也是抓住了这一时机来的,一直到4月9号晚我回家才开始解决,两天内玩家忍受了许久巨卡的煎熬。
(期间我们可爱的管理员还用屏障和岩浆堵住出生点烫机器人,哈哈哈超级可爱)





解决方案


4月9号晚是我给出的第一轮解决方案,从设计到开发使用了不到两小时的时间,执行效果良好,简单说一下这第一部分:
大致的思路是通过让玩家在线注册用户名,然后用插件来过滤用户。这和白名单的功能基本一致,只是无需在服务器内输入指令即可添加,要灵活、方便许多。首先为了方便玩家注册,我选择用酷Q搭建了一个群机器人,玩家只需在群内发送【注册玩家:名字】这段文字后,机器人就自动将名字记录下来。记录的文件路径配置到服务器的插件目录中,然后就只需写一个简单的插件,读取记录文件中的列表,过滤进服的玩家即可。
然而第二天这个方案就出现了问题。因为攻击者发现了我的更新,他去除了脚本中跑图或放置拆除方块的部分,加倍增加了账号进服的频率,峰值达到了每秒30个账号进服,这样使服务端大量执行PlayerLoginEvent,而我的插件、Authme和LuckPerm插件都会处理这个事件,我的插件会重新访问记录文件,另两款插件也会高频访问数据库,导致CPU负载巨大。
针对这样的攻击,使用服务端插件反攻击的方案显然是无法解决的。我便开始考虑在服务端更前一层的位置解决,第一个想法就想到了TCP端口转发。因为在这一层,我可以主动过滤连接来源的IP。首先获取玩家IP是一个问题,我使用SpringBoot搭建了一个只有一个Mapping的简单Web应用,并在这之中获取客户端IP,并将客户端IP记录到文件中。然后使用JavaSocket搭建一个TCP代理,将原本服务端的端口切换为其他端口,将代理接入原端口,在收到请求时,取出记录下的IP列表进行匹配后放行。玩家只需要在进服前访问一次Web接口,即可在更换电脑前持续正常进服。





事件总结


全套解决方案共4个模块,完美解决了压测攻击、恶意注册的问题,同时群机器人还附带记录了玩家QQ,推进玩家加群的同时也方便在群中找到玩家。
TCP代理模块经过升级后,实现了定期统计连接次数,根据所设置的阈值自动开启或关闭防御的功能。并可以在拒绝连接时模拟服务端发送MOTD,由此该组件即可作为长期使用的反黑加固组件。
这次的攻击是个非常不错的挑战,能够完美解决也彰显了我们服务器的实力,感谢Hacker的出现,你让我玩的很开心。这番经历过后,我们服务器的各个方面一定会更上一层楼。





组件截图



反黑组件被攻击到飞起,服内玩家安然若素





组件源码






关于更多反黑加固的知识和支持,欢迎与我联系




作者: caizhong3    时间: 2019-4-12 17:23
本帖最后由 caizhong3 于 2019-4-12 17:27 编辑

这不是假人压测嘛
真正的DDOS是要靠服务器硬防来扛的不是嘛


作者: 神秘正版猫    时间: 2019-4-12 17:28
机器人能重置名字就好了,万一注册错名字还能反悔
作者: Moziyu    时间: 2019-4-12 17:28
本帖最后由 Moziyu 于 2020-3-23 02:16 编辑
caizhong3 发表于 2019-4-12 17:23
这不是假人压测嘛
真正的DDOS是要靠服务器硬防来扛的不是嘛

服务器硬防来抗是在无法过滤掉哪部分连接是真实客户的情况下,因为对于对公开放的服务器来说,很难进行判断。
首先攻击是发生在连接层的,一般也就是TCP协议层,通过发送大量的TCP包来达成目的。
我们是可以在这层上下功夫,直接积极的拒绝连接,自然也就不会受到攻击影响,流量自然也打不进来。
这时候与玩家是否存在另一种联系方式就很重要了,你要告诉玩家通过这层屏障的方法,让玩家来主动认证,
否则玩家会直接以为服务器倒闭了。。因为他完全连接不上,啥都获取不到
受到攻击嘛。。多少会有损失的,但一般的铁粉老玩家都会加群的,实在不行就挂在宣传贴咯
我自己的宣传贴到现在还存留着被攻击时候的提示







作者: Moziyu    时间: 2019-4-12 17:29
caizhong3 发表于 2019-4-12 17:23
这不是假人压测嘛
真正的DDOS是要靠服务器硬防来扛的不是嘛

实际造成的效果也基本相同,就是占用资源让真实玩家无法进服。
作者: Moziyu    时间: 2019-4-12 17:30
caizhong3 发表于 2019-4-12 17:23
这不是假人压测嘛
真正的DDOS是要靠服务器硬防来扛的不是嘛

包括通过代理使请求合法化的方式,与DDOS无异,很客观了吧。
作者: Moziyu    时间: 2019-4-12 17:32
caizhong3 发表于 2019-4-12 17:23
这不是假人压测嘛
真正的DDOS是要靠服务器硬防来扛的不是嘛

再者,真正的大流量DDOS攻击成本也不是小数,攻击者有这钱应该也不会干这么无聊的事。
作者: Moziyu    时间: 2019-4-12 17:33
神秘正版猫 发表于 2019-4-12 17:28
机器人能重置名字就好了,万一注册错名字还能反悔

会变成BUG的
作者: 屑弟弟楚儿    时间: 2019-4-12 17:50
是个大佬
对游戏事件的跟踪能追到准确的几个插件上面。
其实可以做bc跳转 然后压低bc跳转服的资源
然后自动限制几个频繁进入跳转服的ip
将跳转服短时间内进入玩家数进行限制
也可以基本达到该项要求
作者: Moziyu    时间: 2019-4-12 18:28
Top氵楚儿 发表于 2019-4-12 17:50
是个大佬
对游戏事件的跟踪能追到准确的几个插件上面。
其实可以做bc跳转 然后压低bc跳转服的资源

可以考虑这个方案,不知实测如何,毕竟一秒35次的进服,BC的处理如果比较复杂的话也会占用更多资源。IP黑名单的话不太现实,这种走大规模肉鸡代理的不太适合使用IP黑名单的方案。
作者: 屑弟弟楚儿    时间: 2019-4-12 18:30
Moziyu 发表于 2019-4-12 18:28
可以考虑这个方案,不知实测如何,毕竟一秒35次的进服,BC的处理如果比较复杂的话也会占用更多资源。IP黑 ...

这个也的确  
Minecraft的黑色产业指的就是这样的人吧。。
有能力用错地方可惜了.
作者: Moziyu    时间: 2019-4-12 18:31
后续我会把代码优化,添加配置文件后公开到Gitee上,也欢迎其他热爱开发的朋友研讨、升级,防压测从我们做起~
作者: Moziyu    时间: 2019-4-12 18:37
Tcp代理模块源码:https://gitee.com/AntiStressTesting/TcpProxy
作者: yyeerai    时间: 2019-4-12 18:39
为什么不使用外置登录系统
作者: Moziyu    时间: 2019-4-12 18:43
yyeerai 发表于 2019-4-12 18:39
为什么不使用外置登录系统

没了解过这东西,什么原理?
作者: Moziyu    时间: 2019-4-12 19:46
yyeerai 发表于 2019-4-12 18:39
为什么不使用外置登录系统

我好像以前去其他服玩的时候用过,感觉太重量级了。现在做企业项目习惯敏捷开发和轻量应用的模式。
作者: Moziyu    时间: 2019-4-13 15:53
Spigot插件模块源码:https://gitee.com/AntiStressTesting/PlayerChecker
作者: Moziyu    时间: 2019-4-13 16:22
群机器人模块:https://gitee.com/AntiStressTesting/QunRobot
作者: Moziyu    时间: 2019-4-13 16:39
IP注册模块:https://gitee.com/AntiStressTesting/RegIp
作者: nsisogf    时间: 2019-4-13 17:45
我肯定你这种做法的可行性,但:
Yggdrasil scheme外置登陆系统是效率最高效的防假人解决方案。不存在重量级这种说法。你这个方案的确能实现,但相比Yggdrasil模式你只是用更高的性能消耗换取解决方案低实现复杂度。轻量应用模式标准并未达到,更不用说延展性,容错性等关键指标。
不过你这种模式依然值得学习,事物存在必有它存在的价值
作者: Moziyu    时间: 2019-4-13 18:31
nsisogf 发表于 2019-4-13 17:45
我肯定你这种做法的可行性,但:
Yggdrasil scheme外置登陆系统是效率最高效的防假人解决方案。不存在重量 ...

那个方案我并没有了解过,想问下,那个方案是否需要全部玩家安装特定客户端后才可实现?
作者: Moziyu    时间: 2019-4-13 18:38
nsisogf 发表于 2019-4-13 17:45
我肯定你这种做法的可行性,但:
Yggdrasil scheme外置登陆系统是效率最高效的防假人解决方案。不存在重量 ...

还有,我的轻重量级主要指的是客户体验方面,我目前的主要岗位是产品**(Java全栈转的),我比较看重客户体验方面的因素。我曾经玩过外置客户端的服务器,如果是MOD服必须下专用客户端则无可厚非,而一般纯净服走的就是简单路线,随便下一个很小的纯净的客户端即可进服玩耍,我觉得这是纯净服玩家很看重的一点,就是不喜欢复杂,而必须下专用客户端可能会增加诸多操作步骤和时间消耗,如果登录器设计的非常复杂则更甚。
作者: nsisogf    时间: 2019-4-13 21:08
Moziyu 发表于 2019-4-13 18:31
那个方案我并没有了解过,想问下,那个方案是否需要全部玩家安装特定客户端后才可实现? ...

不需要,主要体现在启动器。主流启动器现在基本都自带第三方ygg外置登陆模块,比如我的nsiso启动器
作者: 尘曲    时间: 2019-4-13 23:24
思路不错,赞一个
作者: xjboss    时间: 2019-4-13 23:31
楼主思路牛批,捕捉楼上。
作者: William_Shi    时间: 2019-4-14 20:39
厉害!
支持这种qq联动的方式!
作者: William_Shi    时间: 2019-4-15 09:29
支持大佬的方案!
作者: Moziyu    时间: 2019-4-15 18:16
尘曲 发表于 2019-4-13 23:24
思路不错,赞一个

惊现大佬
作者: Savior_Hn    时间: 2019-4-19 10:37
之前见过有服应对压测攻击,好像大概也是这个方法,不过服外玩家在戒备模式下无法登入了
作者: Moziyu    时间: 2019-4-24 22:17
呵呵呵呵呵
作者: bs_xiaohan    时间: 2019-4-25 18:37
那么,能告诉我服务器ip吗awa
作者: Moziyu    时间: 2019-4-28 15:14
bs_xiaohan 发表于 2019-4-25 18:37
那么,能告诉我服务器ip吗awa

http://www.mcbbs.net/thread-860164-1-1.html
作者: Moziyu    时间: 2019-4-28 15:15
插件、TCP代理模块已更新,新增手动开启拦截指令,拦截开启阈值设置改为Double值。
作者: qq1458132898    时间: 2019-4-29 19:02
Moziyu 发表于 2019-4-12 17:29
实际造成的效果也基本相同,就是占用资源让真实玩家无法进服。

厉害啊大哥
作者: 言灵乀Poison    时间: 2019-4-30 12:23
有一点疑问,这个ip注册的网址是公开的,我去看了一下好像访问就能注册了没做反机器人验证。那么如果攻击者的脚本先跑一遍这个页面注册白名单,然后再压测是否就会被当成正常玩家导致过滤失败了(虽然看起来攻击者并没有这么做?

话说用文件的方式一行一个白名单这个有点感觉emmmmm挺不安全。
直接压测一下这个白名单的页面,可能就会因为文件过大导致每次添加白名单要很久,tcp代理模块也是逐行读所以每次识别白名单也要很久,而且每次都重新读文件emmmm写假人是有难度,但是如果只是弄个几百个线程不断访问一个页面,甚至不需要提供任何参数的话emmmm你看 是吧挺危险的感觉
然后看起来没做文件并发写的处理,真的压测网页的话,如果有正常玩家同时在注册可能会因为并发导致ip添加错误吧
作者: Moziyu    时间: 2019-4-30 13:55
言灵乀Poison 发表于 2019-4-30 12:23
有一点疑问,这个ip注册的网址是公开的,我去看了一下好像访问就能注册了没做反机器人验证。那么如果攻击者 ...

噗哈哈哈,因为我懒啊,我只是目前需求是怎样就做到怎样的,本来是打算用sql的,太麻烦了。。注册页面也是一样,完全可以加验证码之类的
作者: Moziyu    时间: 2019-4-30 13:56
言灵乀Poison 发表于 2019-4-30 12:23
有一点疑问,这个ip注册的网址是公开的,我去看了一下好像访问就能注册了没做反机器人验证。那么如果攻击者 ...

主要还是体现思路吧,要是说升级的话肯定有很多事情可以做的,我只是面对这一次攻击做了这些,已经足够了
作者: Moziyu    时间: 2019-4-30 13:59
言灵乀Poison 发表于 2019-4-30 12:23
有一点疑问,这个ip注册的网址是公开的,我去看了一下好像访问就能注册了没做反机器人验证。那么如果攻击者 ...

哦对写文件那里是没有加锁。。。现在懒得弄,晚点更新吧
作者: 2404540291    时间: 2019-5-2 12:44
正好需要
真是雪中送炭,
作者: Moziyu    时间: 2019-5-9 10:44
沉了?
作者: 543355801    时间: 2019-5-9 14:12
Moziyu 发表于 2019-5-9 10:44
沉了?

没有,我在仰望。
我在考虑改写这个系统,把他推广出去。
作者: 550889884    时间: 2019-5-9 21:44
66666666666666谢谢分享


作者: Moziyu    时间: 2019-5-10 12:40
543355801 发表于 2019-5-9 14:12
没有,我在仰望。
我在考虑改写这个系统,把他推广出去。

这么强的吗
思路在这里讨论一下啊
作者: 543355801    时间: 2019-5-10 16:19
Moziyu 发表于 2019-5-10 12:40
这么强的吗
思路在这里讨论一下啊

我感觉这东西已经是互相矛盾了。
首先有一个樱花皮肤站的外置登录已经可以防御这种类型的攻击了。
到不茹把这东西写成一个插件(指ip名单)
作者: Shenhi    时间: 2019-5-11 12:51
感谢思路 以后也可以自己试试这些
作者: Moziyu    时间: 2019-5-11 22:05
543355801 发表于 2019-5-10 16:19
我感觉这东西已经是互相矛盾了。
首先有一个樱花皮肤站的外置登录已经可以防御这种类型的攻击了。
到不茹 ...

外置登录需要玩家下载专用客户端,不在这个应对思路的考虑范围内。
外置登录是会对玩家有一个长期的持续性的影响,而这几个组件是可以持续保护但在无攻击时无影响化的。
作者: Moziyu    时间: 2019-5-11 22:09
Shenhi 发表于 2019-5-11 12:51
感谢思路 以后也可以自己试试这些

类似思路可以应用在各种方面的,也可以进行一些升级改造,灵活学习和运用是技术进步的必要条件哦
作者: 543355801    时间: 2019-5-12 07:50
本帖最后由 543355801 于 2019-5-12 07:53 编辑
Moziyu 发表于 2019-5-11 22:05
外置登录需要玩家下载专用客户端,不在这个应对思路的考虑范围内。
外置登录是会对玩家有一个长期的持续 ...

所以说嘛,如果把这个东西开发成一个登陆系统的形式,那就好了。
不要下载专用客户端就可以实现反攻击啦。
直接在注册的基础上丢一个验证码(游戏里)。
不在ip名单的tcp代理拦截就完事了。

作者: ishland    时间: 2019-5-12 12:53
本帖最后由 ishland 于 2019-5-12 12:54 编辑

所以说到了最后还是正版验证有用(所有压测问题几乎全部解决)
作者: henda233    时间: 2019-5-12 23:35
厉害厉害
作者: Flowers_花花    时间: 2019-5-13 01:06
现在的攻击者越来也无聊了
作者: 1723624171    时间: 2019-5-13 09:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: qq1176321897    时间: 2019-5-13 13:12
如果攻击者先访问web接口怎么办呢
作者: Moziyu    时间: 2019-5-13 14:00
qq1176321897 发表于 2019-5-13 13:12
如果攻击者先访问web接口怎么办呢

Web接口那玩法就多啦,就接个mcbbs这种点文字的验证码都能玩死一大片攻击者。他们大多都是用的别人的攻击工具,自身是没有开发能力的呀。如果他们愿意花钱找工具开发者升级,那只能说是真的任性
作者: Moziyu    时间: 2019-5-13 14:01
a1477059273 发表于 2019-5-13 01:06
现在的攻击者越来也无聊了

在恶性竞争层面看也不算无聊啦,只是有够可恶
作者: Moziyu    时间: 2019-5-13 14:02
ishland 发表于 2019-5-12 12:53
所以说到了最后还是正版验证有用(所有压测问题几乎全部解决)

并不是所有小玩家都能拿出一整箱零食的钱来买正版的呀
作者: Moziyu    时间: 2019-5-13 14:10
543355801 发表于 2019-5-12 07:50
所以说嘛,如果把这个东西开发成一个登陆系统的形式,那就好了。
不要下载专用客户端就可以实现反攻击啦。 ...

只要是假人进到了游戏,就会造成影响了。
Authme、LuckPerms、Essentials等插件都会在玩家进入服务器时即创建玩家记录条目,如果不在这之前进行拦截,会产生大量垃圾数据,并且如果进服频率过高,那些插件也会占用过多的资源,造成卡服。
这都是在面对攻击时总结出的问题。由此也可以判断,市面上其他的插件型反压测工具,都是无法防止出现以上问题的,当攻击频率过高时,依旧会卡服,且不能防止垃圾数据产生。
我也是由此进行的在假人进到游戏前进行拦截的考虑,从而产生了这套方案。
作者: Flowers_花花    时间: 2019-5-13 14:50
Moziyu 发表于 2019-5-13 14:01
在恶性竞争层面看也不算无聊啦,只是有够可恶

加油!共同努力
净化mc环境
作者: 人走茶凉。    时间: 2019-5-13 15:28
Moziyu 发表于 2019-5-13 14:10
只要是假人进到了游戏,就会造成影响了。
Authme、LuckPerms、Essentials等插件都会在玩家进入服务器时即 ...

我在想,这些插件都是监听的玩家加入事件吧?如果你的插件也监听这个事件并且是最高优先级,把假人登录的事件给取消掉,那么那些插件还会生成玩家配置吗?
作者: mc_baoyu    时间: 2019-5-13 22:14
mcbbs有你更精彩!
作者: mc_baoyu    时间: 2019-5-13 22:33
mc有你更好
作者: mc_baoyu    时间: 2019-5-13 22:34
666!可以啊大兄弟!
作者: Moziyu    时间: 2019-5-14 09:49
myunco 发表于 2019-5-13 15:28
我在想,这些插件都是监听的玩家加入事件吧?如果你的插件也监听这个事件并且是最高优先级,把假人登录的 ...

非常不错,你指的这样对吧
  1. @EventHandler(priority= EventPriority.MONITOR)
  2. public void onPlayerLogin(PlayerLoginEvent e)
复制代码

这样确实有效,但是。。后台会刷屏,频率过高的时候卡不卡服也不得而知。。
而且不能避免MOTD压测。。虽然插件好像也能避免这个
作者: Moziyu    时间: 2019-9-19 00:39
日常给自己暖一下帖,感谢大家的使用和支持。
作者: X_jianchuan    时间: 2020-3-22 23:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: CloudSpace    时间: 2020-3-22 23:24
学习到了
作者: 信标工坊    时间: 2020-3-23 02:30
66666666,大佬
作者: 信标工坊    时间: 2020-3-23 02:30
顶顶顶顶顶