使用支持 websocket 的 cdn 保护 mc 服务器

2022-07-13 10:49:38 +08:00
 wangyu17455

前言:朋友的 mc server(java 版,1.12.2,日均玩家 10-15 人,mod 服),在多次遭受 ddos 攻击之后,朋友找到我,询问有没有一种方法可以以较低的成本保护他的 mc 服务器。

最开始考虑的方案是高防 ip ,高防 ip 的好处是操作简便,无需任何多余的设置,缺点则是价格贵,防御和机器配置绑定,若是购买通用高防服务器,想要获得足够的防御,需要购买对于 mc 开服来说过多核心(比如 8 核 e5)的服务器,若是购买 mc 专用的高防 ip ,则面临着超售严重和价格昂贵的问题。

随后又考虑了 cdn 方案(在玩家的客户端架设正向代理将 tcp 连接转为 websocket 连接经过 cdn 传输到 mc server),我最先想到了经常被 mjj 拿来拯救被墙机器的 cloudflare(下文将简称为 cf),通过 cf 的边缘节点走 cf 的内网回源到 mc 服务器,期间尝试了优选 ip 等一系列骚操作,但是最终因为延迟问题被迫放弃。

随后我将视角转向了国内 cdn ,国内 cdn 厂商相比 cf 有两大不足,一是需要备案,二是不免费+只能后付费,可以被有心人很轻易地刷出天价账单,但是胜在延迟低。可选的加速方式有全站加速(可以加速任意基于 tcp 的协议)和 http 加速,在价格上,全站加速的价格远高于普通的 cdn 的 1g0.2 元的均价,不考虑,最终决定使用支持 websocket 的 http 加速。此时只剩最后一个问题需要解决,如何避免被有心人刷出天价流量账单,经过我的多番寻找,最终找到了一个接近完美的方案:域前置。若是使用明文的 http 方案,攻击者可以加群下载客户端之后抓包获得加速域名,若是使用默认的 https 方案,会在两个地方暴露连接的域名,一是 dns 解析,二是 tls 握手中客户端发送的 sni ,对于 dns 解析,我们可以使用一种叫做 cname 拉平(对 cname 类型的 dns 查询直接在服务端进行递归的解析直到最终获得 ip)的方案,假设我们使用某 cdn 加速域名 example.com ,cdn 提供者会返回给我们一个 cname 域名,类似这种格式:example.com.xxx.yycdn.com ,对此域名进行递归的解析,一般来说会解析到 yycdn.com ,因此我们可以直接对 yycdn.com 建立 https 连接,而不必对带有我们域名 example.com 信息的的加速域名进行连接。对于 sni ,我们可以使用域前置技术,域前置技术简单地说就是 tls 握手中发送的 host A 和 http header 中发送的 host B 不一致,host A 放入 sni 中明文发送,而 host B 则是被 tls 连接保护,不会泄露。决定回源到哪个域名的是的是 host B,决定连接安全性的则是 host A ,只要 host A 的私钥或者百度的日志不泄露,那么 host B 就不会被解密出来(当然二进制文件里的 host B 字段也需要通过混淆 /加密 /加壳等方式保护好)。经过测试,距离较劲的玩家延迟增加了小于 20ms ,而较远的玩家延迟没有明显增加,日均玩家 10-15 人,一个月流量 500g 。以下是 demo

yu1745/websocket_tunnel: 将 tcp 连接转为 websocket 连接使其可以通过 cdn 传输 支持域前置技术以隐藏域名 (github.com)

5841 次点击
所在节点    程序员
54 条回复
des
2022-07-13 12:21:05 +08:00
百度 cdn 用 websocket 我记得要申请?
wangyu17455
2022-07-13 12:27:15 +08:00
@des 在线实时开通,不需要等
ChenYFan
2022-07-13 12:35:43 +08:00
国内 Websocket 不好搞吧。。。这东西很容易拿来当梯子用,我没记错的话有些是要客服申请的
wangyu17455
2022-07-13 12:37:25 +08:00
@ChenYFan 算是漏洞,本来是要备案才能用,但是百度 cdn 添加加速竟然不需要任何的验证
SomeBottle
2022-07-13 12:43:25 +08:00
有点意思,感谢技术分享
Les1ie
2022-07-13 12:45:50 +08:00
不少的 CDN 厂商在去年的这个时候修复了域前置的 bug ,没想到现在还有漏网之鱼 :)

另外,现在的 MC 玩家越来越硬核了,域前置 websocket 都给整上了,我这通过 OpenVPN 联机玩 MC 的瑟瑟发抖 :(
Sakura
2022-07-13 13:07:37 +08:00
感谢技术分享
cherryas
2022-07-13 15:56:46 +08:00
看不懂,说错了别笑我,

请求肯定会走 ip 对吧,抓到 ip 然后,ddoc 拉满,不就行了。
Greenm
2022-07-13 17:08:53 +08:00
@cherryas 只能看到 CDN 的 IP ,没有意义
iqoo
2022-07-13 17:18:16 +08:00
既然都用加壳的客户端了,不如搞个私有协议的敲门方案。
jsq2627
2022-07-13 17:37:07 +08:00
还是能够被伪造证书 MITM 抓包获取 Host 。所以还需要配合 SSL Pinning 解决
liaohongxing
2022-07-13 19:32:53 +08:00
ddos 无脑发 tcp 包就可以了。流量大到将百度云 CDN 打垮。百度云 CDN 拉你入黑名单停 24 小时或者直接给你 cname 解析到源站去,国内 CDN 普遍不替你扛 ddos 攻击, 付钱另外说。
ragnaroks
2022-07-13 19:59:14 +08:00
我是做 csgo 社区服的,如果开服收益足够的话考虑下云堤;这个方案应该只有 CF 这种免费无限量抗 D 的适用。
gam2046
2022-07-13 20:12:45 +08:00
@wangyu17455 #17 ddos 本质并不向服务端发送数据,也不存在限速可以抵御 ddos 的情况(比如原始的 syn flood)。同时与你的应用层协议也无关,ddos 还是针对 tcp 设计的 bug 来实现的。当然现在的演变,不在局限于早期的 ddos ,也有一些基于应用层协议的 ddns 应用方式。但如果是返璞归真,纯真的 ddos ,只要是基于 tcp 的上层协议,无论做什么都逃不掉。区别只是攻击方与防守放谁愿意付出更大的成本。
wangyu17455
2022-07-13 21:03:03 +08:00
@liaohongxing 文章花费了大量的篇幅讲怎么藏域名,攻击者是不知道我的域名的,攻击者只能 ddos 我设置的假域名,也就是那个 host A
wangyu17455
2022-07-13 21:05:32 +08:00
@gam2046 朋友目前受到的攻击主要是 100g 以下的 udp 反射攻击,这个程序主要是为了防御这种攻击
liaohongxing
2022-07-13 21:38:25 +08:00
你没明白的我的意思

CDN 探测到攻击后 ,后续的新请求 CDN 可以改变它那个 cname 的值直接指向你的源站 IP ,避过他的 CDN 系统,直接指向你的源站 ,后续的攻击洪水直接到达你的源站。

攻击 abc.com -> cname -> abc.com.cdn.com -> 192.168.1.1(CDN) -> 192.168.1.0(CDN) -> 223.5.5.5(源站)

CDN 探测到攻击后

攻击 abc.com -> cname -> abc.com.cdn.com -> 223.5.5.5(源站)


你这模式只适合 CF 这种免费替人扛 D 的服务商,国内普遍不免费替人扛 D
wangyu17455
2022-07-13 21:48:42 +08:00
@liaohongxing 假设我设置的假域名是 a.com ,真域名是 b.com ,我既不会向 a.com 连接,也不会向 b.com 连接,而是会向 a.com 递归解析到倒数第二层的 cname 连接,倒数第一层是 ip ,倒数第二层是一个不带任何前缀的所有使用了百度云 cdn 的域名共享的 cname ,我会向这个地址发起连接,然后此时你抓包抓到的是假域名 a.com 的 sni ,ddos 导致 a.com 回源与 b.com 无关,你只能向 a.com 发起 cc 攻击,如果你攻击代理程序监听的端口,我限速限连接数限多开就好了
liaohongxing
2022-07-13 21:59:07 +08:00
朝共享的顶级 cname 的 "IP" 发起连接这样是可以, 如果这一 IP 入口受到攻击,CDN 只能通过 BGP 或其他技术调度流量,牺牲这一节点, 如果这样,国内 CDN 一般都有惩罚机制 。限制你的使用

如果只在 cname 这层 ,CDN 完全可以控制 cname 的指向的 IP 切走流量,不走它们 CDN 系统。
shynome
2022-07-13 22:15:49 +08:00
有客户端了直接 VPN 不就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX