看点1:DDoS(注意,o要小写)
DDoS只是流量攻击的一个总体称呼,直接百度 DDoS 就可以获得答案。 一般个人攻击者可以发起 50G ~ 100G 的流量攻击。 一些团队可以发起 200G+ 的流量攻击,当然还有一些可以做到 400G+、600G+、800G+、1T+等。
在这里首先要说明的是,从理论上而言,DDoS是防不住的。 你今天能防住1T,明天别人就可能打你2T。
但好在,现实并没有那么走运,攻击也是有代价的。因此,如果遇上600G、800G,甚至是1T的瞬间流量攻击,我觉得你可以发一个朋友圈,说明你已经走上了人生巅峰。
唯一的解决方案:硬防。所谓硬防,就是指硬件防御。
基本原理就是在自己的机房入口设备,比如路由器上,通过分析包的类别、源地址特征来进行DDoS 识别。 一但识别源地址为 DDoS 行为,就更改数据包地址,将其引导到流量清洗设备上。
从上面的原理中可以看出,机房的流量清洗设备能够吞下来的流量,就是你的最高防御上限。
早期是这么干的。如今,我们有阿里云、腾讯云。如果觉得贵,那佛山、宿迁的一些高防机房也可以用。
机房有两种:
一种是BGP 机房 ,这种机房是多线合一,对外只提供一个 IP。 防御一般是 200G 的单台上限。 如果想要更多的防御,就要和业务商谈,业务好为你的主机重新布线。
另一种就是普通的机房。这种机房,也是多网通,不过,电信、网通、教育网之类会有单独的IP,这种的防御可以做到 300G 左右。 同样的,想要更高,就只有业务商谈后,专门为你处理。
多个IP,如何提供给客户端呢?最好的策略就是智能 DNS 域名解析,它会帮你解析到适合当前用户的 IP。
总结一个字:钱!
如果我们想要防御上T 的攻击,曾经咨询过一个第三方机房,大概是 10 万一个月。 对于一些月流水上千万的游戏来说,这个数字无所谓。但对于起步阶段的平台来说,就是天价了。 那我们有没有办法少花点钱呢?
大家首先想到的就是分布式了。没错的,能够想到这个的,都是杰出少年,哈哈!
如果我们用4 台 300G 高防的并联,自然就是 1.2T 的防御。 除非 4 台同时被打死, 否则我们还是有余地的。
细心的朋友就会问了,4 台,就有 4 个 IP 地址。如何来做呢?其实这个就交给客户端好了。如果客户端掉线了,就遍历 4 个地址,选择一台可以用的来用就是了。
这4 台,不见得要负载均衡。 因为我们要的是保证玩家在受攻击的时候,有可用的服务器可用,而不是要通过负载均衡来提升承载。 什么? 你的平台同时有几万人在线?那好办, 你用 10 台 1T 防御的做网关就好了。
看点02:CC(伪造数据包)
DDoS 常见的套路有几种1、发起超多长链接(针对长链接服务器),侵占服务器 IO 资源2、发起超多数据包(长短链接都可用)3、伪造数据包( CC)
前面两种比较好防御,因为高防服务器自动就可以识别。实际上,成本最低、伤害最大的,要算CC 攻击。
CC 攻击主要的套路有几种
1、抓包重放通过软件抓取客户端向服务器发送的合法流量包,然后无脑的多次发送。比如,我们抓一条拉取游戏历史记录的信息,然后无脑发送。大家应该能够想到,可能存在的情况。
一、如果历史记录是从数据库中实时统计。那么会使数据库服务器的查询和流量溢出。常见的就是MYSQL 等数据库进程 100%
二、如果历史记录是缓存到内存中的,那么至少也会产生放大攻击效果。放大的倍数就是返回包大小/ 请求包大小。重放攻击的防御手段,大家可以自行百度了,选择一个适合自己的方案即可。
2、SQL注入SQL 注入很简单,我演示一下。 SELECT * FROM history WHERE userid = $userid. 假如,这个 $userid 是由客户端传过来的,那么我们面临的问题就是这个 $userid 可能不是你期望的整型。
比如可能出现下面的情况(加粗的部分就是$userid 的值)
SELECT * FROM history WHERE userid = 12346 or 0 union select concat_ws("|",cast(orderid as char),ifnull(operator,""),ifnull(target,""),cast(ifnull(num,0) as char),cast(ifnull(time,0) as char),ifnull(note,""),cast(id as char),ifnull(account,""),cast(ifnull(goods_type,0) as char),cast(ifnull(goods_num,0) as char),cast(ifnull(goods_price,0) as char),cast(ifnull(price_type,0) as char),cast(ifnull(time,0) as char)),1,2 from t_log limit 0,1 -- "
这条SQL 语句调用了 N 个 concat_ws,cast,ifnull 等 SQL 函数。试图消耗 MYSQL 数据库进程的 CPU 以及产生大量的查询结果返回。
SQL 注入的防御,需要大家做好客户端传入的值的效验,特别是拼接 SQL 语句的时候,要格外注意可能出现的问题。
3、破解破解意味着攻击方知道你所有的业务逻辑,这是最难防御的。但大家应该假设这样的可能出现,因为在高手面前,我们的加密,混淆几乎等于0。
要想防御到这一步,就只有合理的规划好代码,每一个请求都严格效验。举一个打牌的例子,如果你明牌能赢。才表示你真的赢。
看点03:结束语
我的阅历有限,只能在此抛砖引玉,引起大家共同讨论。不管是棋牌游戏,还是普通游戏,都应该重视安全防护这一块。不要让自己本应该赚到手的钱,消失在大量的攻击中!