开服日的攻击是行业的见面礼:SYN 洪水打满连接表,UDP 反射撑爆带宽,登录接口被僵尸包淹没——防 DDoS 的体系在攻击到来之前就要建好,临时抱佛脚的代价是开服首日全服掉线。
---接入清洗:可疑流量引流到清洗中心
function AntiDDoS.decide(srcIp)
-- 单 IP 的连接与速率双限
local conn = ConnStat.of(srcIp)
if conn.count > 50 then
return "block", "连接数超限"
end
if conn.synPerSec > 30 then
return "challenge", "SYN 速率异常"
end
if ConnStat.blacklisted(srcIp) then
return "block", "黑名单"
end
return "pass"
end
---SYN 代理:半连接由网关代答
function AntiDDoS.synProxy(pkt)
-- 网关代答 SYN-ACK,完成三次握手才转发后端
if not Handshake.proxyReply(pkt) then
return false
end
return Forward.toGame(pkt)
end
接入层的第一道闸按单 IP 双限:并发连接 50 上限、每秒 SYN 30 次的速率线,超限的 IP 直接拉黑或进挑战。SYN 代理让握手在网关代答完成,半连接洪水打不满后端的连接表——僵尸包在网关就现了形,完成真实握手的流量才有资格到游戏服。清洗中心的引流在攻击超阈值时启动:运营商把目标 IP 的流量牵引到清洗节点,洗完的干净流量回注,10 Gbps 级的洪水在入口被消化。
---登录接口的挑战与限流
setontimerex(76, 5)
function AntiDDoS.loginGuard()
local qps = Login.qpsNow()
if qps > 2000 then
-- 超阈值开启挑战:登录前先答一道计算题
Login.enableChallenge(300)
Ops.alert("登录 QPS 异常,已开启挑战模式 300 秒")
end
end
业务层的登录接口按 QPS 限流:正常开服的登录峰值有基线,超基线的流量触发挑战模式——客户端先答一道轻量计算题再发登录请求,僵尸端的算力成本陡增而真机玩家无感。挑战的开启是自动的,时效 300 秒后自动关闭,攻击的波峰与防御的动作同步起伏。防御的分层职责清晰:清洗中心管带量的洪水、网关管连接的洪水、业务层管请求的洪水,三层的阈值独立配置互为冗余。
攻击的实时大盘:流量、连接数、清洗量、拦截量四条曲线同屏;清洗切换的演练季度一次,真到攻击时引流的开关不能是第一次摸。
连接的限制曾经按全局限,一次正常的开服洪峰把自己限死了,单 IP 维度的限制才是对的颗粒度。黑名单曾经永不过期,误伤的网吧出口永久失联,黑名单的 TTL 30 分钟自动解除。挑战模式的计算题曾经太简单,僵尸端直接穷举过了,题目的复杂度与验证的成本再平衡。
防御的阈值随开服节奏动态调整:开服日放宽、平日收紧。攻击的应急手册写明每级攻击的处置动作与决策人,慌乱中的判断靠预案。与运营商的清洗通道提前接通,引流的联系人与工单流程在攻击前演练过。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 沙巴克占领行会坐收税收却只进不出,非占领行会的玩家心里不平衡。税务官玩法把税收做成明账:占领行会对摆摊与…
实战应用:用在哪里 高端玩家婚姻系统只有仪式没有过程,社交绑定缺一个高光事件。比武招亲做成擂台玩法:擂主设擂摆彩头,攻擂者报…
实战应用:用在哪里 开服七日限时礼包发到第六天断了粮,9 月 1 日当天领奖按钮灰的,投诉当天破千。事故根因是一条数字日期循…
实战应用:用在哪里 玩家拔线不退游戏,连接半开着,人不在指令也没有,在线数虚高,容量预案被假数据带着跑。心跳探测给每个在线玩…
实战应用:用在哪里 周三发了合成系统补丁,周四又改强化概率,两条变更叠加后玩家分不清是哪个改出来的。发布日历把全月变更集中排…
实战应用:用在哪里 容量预案需要知道滚动一小时的副本进入峰值,而不是全天累计。滑动窗口用 60 个槽位每槽记一分钟的进入数,…