使用支持 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)

5265 次点击
所在节点    程序员
54 条回复
wangyu17455
2022-07-13 22:17:38 +08:00
@shynome 露了 ip 就要被打,不能露 ip
LnTrx
2022-07-13 22:37:52 +08:00
如果 CDN 提供商不阻止、正向代理不被破解或多开,那确实有可行性
LnTrx
2022-07-13 22:40:51 +08:00
@liaohongxing 在楼主的方案下,如果根据 DNS 或 SNI 攻击,CDN 是罚不到楼主域名上的
noyle
2022-07-13 23:50:48 +08:00
@LnTrx 所以说这种情况对CDN危害很大。以前支持Domain Fronting的Google和Cloudfront都“修正”了这个bug了: https://en.wikipedia.org/wiki/Domain_fronting#Disabling
hanguofu
2022-07-14 06:14:53 +08:00
楼主这个方案挺好!谢谢分享~
Shiroka
2022-07-14 07:26:55 +08:00
CloudFlare Spectrum 好像就可以这么做,虽然在大陆用起来会很慢: https://www.cloudflare.com/zh-cn/products/cloudflare-spectrum/minecraft/
geekvcn
2022-07-14 07:40:18 +08:00
15 人服务器收益那么高能覆盖成本?感觉亏本的事直接关了服务器得了
wangyu17455
2022-07-14 08:41:26 +08:00
@Shiroka cf pro 送 5g 流量,超出 1g1 刀,business 送 10g ,超出也是 1g1 刀,Enterprise 无限流量,其实即使没有延迟问题也不能直接用 Spectrum ,还是得 ws 中转,1g1 刀这价格就离谱
lizhenda
2022-07-14 09:35:13 +08:00
思路不错哦
40huo
2022-07-14 17:37:53 +08:00
@wangyu17455 再问下,cdn 上开 https 需要上传证书,这时候怎么处理呢,因为填的接入域名是个备案的,必须传自己备案域名的证书么
wangyu17455
2022-07-14 19:03:45 +08:00
@40huo 将 ddns 域名解析到国外 ip 上用 certbot 申请证书,过程手要快,花生壳等 ddns 解析到国外 ip 会光速封,然后再去收个手机验证码解锁域名,然后你就获得了一张 3 个月的证书
hanguofu
2022-07-14 20:55:29 +08:00
也就是说上传给 cdn 的证书是假域名 host A 的证书?
wangyu17455
2022-07-14 22:45:46 +08:00
@hanguofu 是真域名的证书,虽然 tls 握手是和假域名握手,但是你不上传证书 cdn 不允许你开启 https
wangyu17455
2022-07-24 09:02:01 +08:00
寄!百度把 bug 修了,现在使用 cdn 必须备案了,不能添加 ddns 域名了

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

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

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

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

© 2021 V2EX