云闪
本帖最后由 splt 于 2015-12-26 03:38 编辑

突然有点防压测的想法,于是发来和各位讨论讨论~
先声明,我并不打算防ddos,因为除了硬防没办法……


那么开始~
熊孩子的压测都是通过"正常"的MC协议发送大量网络包导致服务器瘫痪,这时候如果换个端口开服就会发现服务器又正常了,基于此,我开始思考在端口上做文章*^_^*




首先,禁止外网连接MC服务器真实端口,然后在服务器同时打开多个端口监听,然后将连接的客户端的数据转发到真实MC服务器端口上,这样就能实现一个服务器可以通过多个端口进入,并且数据转发的时候还能进行验证。由于最多只有很少量的验证(当然在异常的时候也可以增加对数据包的分析),所以用好那些开源网络框架的话不会产生延迟问题,其实这就类似于BC了,不过是可以多个端口进入的~




然后是客户端,用mod开一个专门的端口用来进服,然后服务器连接时ip就可以设为127.0.0.1:专用端口,在专用端口上如同服务器一样有数据转发,只不过不需要数据验证了,因为这些数据来自于正常客户端而肯定不是压测器(压测器只能新开端口),在客户端与服务器连接的时候,服务端向客户端发送2到3个服务端目前开启的端口(可以用服务端插件来发送),当客户端检测到连接断开的时候首先尝试另外的备用端口,全都不行才报与服务器连接断开,而这换端口的动作是在(本段第一句)专用端口的数据转发模块完成的,所以只要切换端口成功,玩家就不会察觉~




下面就是遇到压测时的对策了,当服务端的端口转发模块检测到某一客户端流量异常的时候就自动关闭客户端所在端口重新开启一个新的端口保证端口服务正常,不过关闭的端口的那些正常的客户端还是会受影响,要考虑怎么将影响降到最低然后在被关闭端口玩耍的玩家客户端就会尝试连接备用端口,而在一般情况下都是会成功的,这样就实现了完美切换,完美防御~




不过还有一个问题,客户端当前使用的端口技术熊抓一下包就会知道,如果总是让它打也不是个办法。我的想法是服务端检测到异常客户端后将该客户端ip封禁,搜索数据库找到该玩家的唯一ID(该ID应由客户端mod根据玩家电脑信息生成,保证独一无二,且更换客户端不会改变且电脑经历小的维修不会改变,目前看来可以根据主板这类几乎不会换的硬件去生成。由于熊孩子在抓包端口的时候肯定要登录服务器,所以这时就能获取客户端信息),并报告OP且记录在黑名单,如果以后该客户端再次连接的时候会报告OP注意。说到这,突然觉得客户端应该增加监视功能,比如截屏啥的,但是这又涉及到隐私,所以现在只能考虑:
①获取进程列表并上传服务器进行比对来确认是否有压测器,由于会自己写压测器的熊应该很少,所以大部分应该都能判断
②客户端mod会新开一个进程(防止熊关了客户端再压测,不过如果有意识检查任务管理器的话就无效了)不断监测当前客户端所用的服务器端口是否正常,如果不正常进入网卡流量分析阶段,当客户端关闭后10分钟监测进程也会关闭,如果在10分钟内有本地有新的连接请求指向服务器,判断如果不是正常客户端则进入网卡流量分析阶段。在网卡流量分析阶段会对网卡抓包并过滤出所有发包指向服务器的不是客户端的端口,如果有则基本可以认定在使用压测器了,可以考虑要不要做进一步数据包分析,这个办法的缺点是很复杂……
③如果有什么想法也欢迎交流~~~

然后对于所有被认为使用了压测的客户端都打入黑名单,无法获取服务器开放的端口~

对于上面的方法,还有最后一个问题,怎么防止黑名单的用户获取MC服务器开放的端口,因为客户端连接MC服务器肯定要知道MC服务器开放的端口,总不能固定一个开放的端口给客户端访问,这样和黑名单也就没啥区别了,对于这个问题我的想法是:①服务器开放一个端口仅用来让客户端获取真实MC服务器开放的端口,在这里可以判断黑名单,而且由于这个端口不是基于MC网络协议而是属于自己的协议,所以也无法进行压测
②利用新浪云等一些云主机让客户端获取真实MC服务器开放的端口,开放的端口在服务器开启时告知云主机上的应用,由于仅仅一个端口数据量很小,并且新浪云可以开自动CC防御,所以多数服务器应该免费配额都够用的,就算不够那些流量也是非常便宜的
这两个方案都有一个共同特点,可以对普通玩家隐藏真实服务器端口,方案2还可以隐藏真实服务器ip,也就是说,当熊孩子兴冲冲地对你的ip压测的时候实际上压测的是一个与MC完全没关系的端口,熊孩子的压测器不会得到任何回应(然后压测器就会说:我压测成功了,你看都不回应了233),当然,熊孩子抓一下包就会知道真实ip和当前所用的端口。但是!!!当已经知道一个ip和端口的时候,这些没有任何专业知识的熊孩子,能想到抓包的概率几乎为0!!!其实这一步就已经是一个很好的防御了,可以过滤大多数普通熊

通过以上的实践,应该能对压测有近乎完美的防御,只要服务器网络不瘫痪,就可以持续提供服务,而不会像一般的MC服务器只要端口瘫了服务器就废了。至于ddos攻击,安全狗这类软件加上良好的服务器防火墙配置已经可以防小流量的ddos了(大流量应该只能靠硬防吧……),让大多数腐竹头疼的应该还是安全狗无法检测的应用层攻击(即利用了MC的网络协议),而通过以上的方式,应该能对这类攻击有很好的防御效果



tallmoon
膜拜大触,不过看着很复杂

云闪
tallmoon 发表于 2015-12-27 14:17
膜拜大触,不过看着很复杂

其实都还好了,最复杂的应该是数据包校验模块,不知道怎么在精准判断是否有压测的同时将耗时减到最小,如果有做过防压测插件的大大过来转转就好了23333

RecursiveG
感觉这和服务器防止作弊mod是一样的。利用客户端mod进行协商防止攻击不是一个好注意。有心的攻击者总是可以研究出你的防御方法。
我有见过一种攻击方式,直接修改客户端,先正常建立连接,然后再疯狂发包。于是这种想尽方法隐藏端口的防御方式就完全失去了效果。
所以关键应该在proxy对流量的清洗上,而不是怎么隐藏端口号。

云闪
RecursiveG 发表于 2015-12-27 15:36
感觉这和服务器防止作弊mod是一样的。利用客户端mod进行协商防止攻击不是一个好注意。有心的攻击者总是可以 ...

所以关键应该是及时检测到压测并断开客户端+屏蔽ip吧0.0我觉得可以修正一下通讯协议,时不时发个校验包,这样可以很快速地判断客户端是否合法(或许可以玩一下JNI?在客户端用JNI收发部分数据包,毕竟机器码不容易被破解,不过兼容性是个问题)
然后在服务端检测是否有大量数据包应该不难,难的是NBTBoom这类利用MC本身漏洞的数据包的检测,合法性比较难判断,
或许可以试试多个服务端+多个端口的组合模式,在特定地点自动将玩家跳转到另一个服务端,这样就类似于有些大型网游的无缝世界,不过总觉得不是大型服用这个有点过了……
对于直接修改客户端的家伙QAQ,或许可以修改客户端,增加客户端完整性校验机智,暂时的想法是通过客户端ip和客户端所有文件的HASH和服务器预定义的秘钥进行对称加密发往服务端判断,这个过程同样在JNI完成,或许可以确保客户端不被篡改,不过我不知道用C写的东西破解难度有多高

4one_R
直接监测单玩家流量即可

云闪
4one_R 发表于 2015-12-30 07:20
直接监测单玩家流量即可

关键是监测到以后要有一系列的处理措施,不然监测了也没用
更何况许多压测器都根本不需要进服



xiao201261
域名使用SRV解析(也就是某宝卖十块钱坑小学生的所谓无端口域名)
authme开启防bot模式 同时做个网页注册系统 这样新人也就不会进不去而着急了
iptables屏蔽所有proxy的ip @89ip @66ip
以上

1393123519
看到眼瞎!

tdiant
我很好奇,如果专用接口被搞♂了,你会怎么办
只要是一个连接请求,不在硬件上进行防御,光软件,绝对会占用你的网络资源
说到底
=A= 我不管你怎么做,我只要保证你硬防低,我打你就行了,打一个就一个准

云闪
tdiant 发表于 2015-12-30 12:55
我很好奇,如果专用接口被搞♂了,你会怎么办
只要是一个连接请求,不在硬件上进行防御,光软件,绝对会占 ...

所以我一开头就说ddos只能上硬防QAQ

云闪
xiao201261 发表于 2015-12-30 12:47
域名使用SRV解析(也就是某宝卖十块钱坑小学生的所谓无端口域名)
authme开启防bot模式 同时做个网页注册系 ...

端口被隐藏只能引诱熊去抓包,我觉得给一个假端口号会更好(如我在1楼说的)
authme的防bot我倒是没用过,也不知道是怎样的,不过如果只是防机器人注册的话....我倒是没见过会注册的压测器
屏蔽代理0.0这个倒是可以,但如果我不用代理呢,反正我大天朝动态ip重启路由器就能解决banip

xiao201261
splt 发表于 2015-12-30 13:03
端口被隐藏只能引诱熊去抓包,我觉得给一个假端口号会更好(如我在1楼说的)
authme的防bot我倒是没用过, ...

隐藏对于有技术的熊其实一点用都没有
  1. nslookup -type =SRV _mine***.s1.***.com
复制代码


假人压测就是多并发注册 然后一群人在server上占资源

至于压测鸡
  1. @油管 watch?v=rRhCZvHljJ8
复制代码
支持proxy 算是最全能的压测鸡了(without forge)

authme防假人的就是一段时间太多人注册自动停止新玩家的注册  老玩家任然可以自由进出

不用代理的话 假人也是费了  那对服务器一点影响都没有


现在mcbbs防止假人的插件都是干扰了正常玩家进去的 所以还是authme直接开antiattackbot就好了

MOTD压测可以用GFV()V插件来自动拉黑

RuiFen
搞到真实ip 放到hosts里

CodeHz
ip隐藏可以通过(伪)cdn实现。。。成本比使用多服务器/跨机房服务器低很多,比如我就直接在微林那里弄几个vxGG加速,然后不定时切换。。。。。这样不仅能提高不同网络下的访问速度,还可能可以在一定程度上缓解压测。。。。
以上观点未经测试。。。vxGG仅为海外服加速服务

VeroFess
可以二次封包啊,恩。。。类似代理,无法解包的数据直接drop,至于握手可以使用预设key,也可以在启动器上做文章,因为java的反反编译太弱了,最好用c+内联汇编,最后加个vm,本地的防御就简单了,写个DLL注入到javaw.exe,直接inline hook send,无痛苦无负担

羽羽___
安全狗可以简单地检测 调整规则 但是很容易误封
而且楼主说的 我不确定压测会不会加个伪造你的CPU这些的信息 开虚拟机即可继续压(或者技术熊改压测)

VeroFess
用你的思路写了个demo,但是遇到个问题
对于服务端所有访问127.0.0.1,authme就会爆【该ip拥有多个id】

Dante_7
楼主说的“唯一ID”是不是就是指“机器码”?

云闪
凋灵兔子 发表于 2016-2-28 18:16
楼主说的“唯一ID”是不是就是指“机器码”?

是的,机器码,上传到服务器的时候应该要加一堆效验保证是正常上传的,必要的话可以使用jni

Dante_7
羽羽___ 发表于 2016-2-23 21:33
安全狗可以简单地检测 调整规则 但是很容易误封
而且楼主说的 我不确定压测会不会加个伪造你的CPU这些的信 ...

安全狗误封很6,有一次我自己都上不去后台..= =

zbw001
当你的修改和数据存放在客户端上,实际上就已经是不安全的

云闪
凋灵兔子 发表于 2016-2-29 21:55
安全狗误封很6,有一次我自己都上不去后台..= =

是的= =有一次我对我服务器压测测试,瞬间被封ip,远程桌面都上不了了_(:зゝ∠)_

云闪
zbw001 发表于 2016-2-29 21:59
当你的修改和数据存放在客户端上,实际上就已经是不安全的

不是的,客户端只有验证和上传的方法,上传都是加密的,并且必要的话是用jni调用的,一切数据肯定都是在服务器的

lxxy
其实SRV有一点用处,可以防低端熊。不会找SRV的。

云闪
lxxy 发表于 2016-3-1 13:23
其实SRV有一点用处,可以防低端熊。不会找SRV的。

现在搞服务器真实地址我都是直接抓包了,只需要1分钟不到就能搞定= =至于低端熊,要是只是为了防低端熊还需要这么麻烦吗_(:зゝ∠)_

zbw001
splt 发表于 2016-3-1 12:22
不是的,客户端只有验证和上传的方法,上传都是加密的,并且必要的话是用jni调用的,一切数据肯定都是在 ...

我以前一直是做破解这种反作弊的,我采取的手段是直接反编译,即mod在客户端,数据就会被修改,即使加密,我修改的实际是加密前的数据,也就是说这个mod会自动帮我把伪造的数据加密发送。

羽羽___
凋灵兔子 发表于 2016-2-29 21:55
安全狗误封很6,有一次我自己都上不去后台..= =

这倒是,不过总比没有好吧

云闪
本帖最后由 splt 于 2016-3-13 15:21 编辑
zbw001 发表于 2016-3-1 18:41
我以前一直是做破解这种反作弊的,我采取的手段是直接反编译,即mod在客户端,数据就会被修改,即使加密 ...

如果我把java的类加密了呢……然后用jni去解密在让jvm读取,你还能破解吗_(:_」∠)_除非你会玩反汇编

我在一楼已经说过必要时可以用jni了吗哦~
而且就算不用jni,我的协议只有两个,一个把自己的信息发给服务端,一个监控客户端。至于加密,除了服务器的那个获取开放端口的网址以外,不会硬编码任何字符串,都是直接调用javaapi获取计算机信息然后再调用javaapi加密,所以你能改哪里呢_(:_」∠)_就算把调用javaapi获取计算机信息的部分改掉(而且你还要了解javaapi获取的那些信息的格式,这玩意可不是谁都知道的)你的客户端还是只能发送一个唯一的信息到服务端,这样服务端就已经能确定唯一的你了,对服务器而言没有任何损失,你仍然什么都做不了……

好就算不说上面那个要改有多难,我不写任何字符串你需要多大的毅力才能在混淆后的几百个类(这种mod当然要直接hack核心啦,所以几百个类包括mc原本的类)中找到获取计算机信息和发送信息的类呢_(:_」∠)_

zbw001
splt 发表于 2016-3-13 15:08
如果我把java的类加密了呢……然后用jni去解密在让jvm读取,你还能破解吗_(:_」∠)_除非你会玩反汇编

我 ...

这样应该没问题吧。。。。。。
你做出来试试看才知道。
顺便说下之前做anticheat的作者写了一个独立的类用来计算md5,所以才那么容易吧,要是都被混淆了,难度肯定会提升很多。

PumpkinXD
有盾必有矛(滑稽)(我承认我曾经D过几个小服)

a27573
很多杀毒软件都可以阻止服务端对客户端软件和硬件的检测,而且只要宽带一拔一插,ip就变了,怎么封禁?

liyandeyan
很棒的作品

云闪
a27573 发表于 2016-8-4 15:24
很多杀毒软件都可以阻止服务端对客户端软件和硬件的检测,而且只要宽带一拔一插,ip就变了,怎么封禁? ...

很简单啊= =你要是阻止了我的检测,那么客户端就无法发送检测结果到服务端,那么你就进不了服= =所以不想进服就阻止咯23333

a27573
splt 发表于 2016-8-6 21:02
很简单啊= =你要是阻止了我的检测,那么客户端就无法发送检测结果到服务端,那么你就进不了服= =所以不想 ...

我可以返回虚假信息(先绑架你的检测请求)。

云闪
a27573 发表于 2016-8-22 11:51
我可以返回虚假信息(先绑架你的检测请求)。

前提是你能破译我用c写的数据加密算法自己通信协议……你放心这种东西是可以保证每次都包都不可能相同,几乎不会有相似

第一页 上一页 下一页 最后一页