Telegram 数据中心之谜

Hacker News Top 新闻

摘要

关于 Telegram 五个数据中心、按手机号码国家代码分配、某些查询中 DC2 和 DC3 用户神秘缺失以及 DC 检测方法中的漏洞的调查。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/15 13:43

# Telegram DC 之谜 - Coxxs 来源:https://dev.moe/en/3025 Telegram 声称拥有 5 个数据中心(DC),在 Telegram 的代码和文档中分别称为 DC1~DC5。其中,DC1 和 DC3 位于美国迈阿密,DC2 和 DC4 位于荷兰阿姆斯特丹,DC5 位于新加坡。 每个账号在注册时会关联到一个数据中心,并且**不会**随着用户的手机号或地理位置而改变。用户不能自由选择 DC,如果连接到错误的 DC,服务器会返回错误信息,要求客户端连接到账号对应的正确 DC。 ## 从经常宕机的 DC5 说起 在 5 个 DC 中,DC5 在中国 Telegram 社区里格外出名——并非因为它默默服务了大量中国用户,而是因为它经常宕机。 DC5 宕机时,用户无法使用 Telegram,而 Telegram 圈子里的讨论热点往往是“DC5 怎么又挂了”。DC5 的用户只能一边看着客户端不断“正在重新连接”,一边等待恢复,然后加入其他 DC 用户的聊天群组里去吐槽 DC5。 [![](https://dev.moe/wp-content/uploads/2022/05/image-1.png)](https://dev.moe/wp-content/uploads/2022/05/image-1.png) ## DC2 和 DC3 去哪了 为了满足群友的好奇心,有人创建了一个用于查询用户所在数据中心的机器人。于是群友们纷纷开始查询自己的 DC: - 使用 \+86 手机号注册的用户发现自己在 DC5(新加坡),即将经历下一次宕机。 - 使用 \+1 手机号注册的用户在 DC1(美国迈阿密),既享受连接速度又稳定。 - 使用欧洲手机号注册的用户在 DC4(荷兰阿姆斯特丹),成为中文 Telegram 社区中最稀有的群体。 嗯?等等……Telegram 不是声称有 5 个 DC 吗?DC2 和 DC3 在哪? [![](https://dev.moe/wp-content/uploads/2022/05/image.png)](https://dev.moe/wp-content/uploads/2022/05/image.png)通过搜索机器人发送的消息,有 360 个用户位于 DC1,50 个在 DC4,390 个在 DC5。DC2 和 DC3 的用户数为 0。通过“大数据查询”机器人的消息,似乎确实没有 DC2 或 DC3 的用户。 因此,有人[猜测](https://t.me/tgsucks/307) DC2 和 DC3 没有用户,而另一些人[分析和推测](https://blog.hertz.zone/2021-11-07_TGDC) DC2 和 DC3 分别是 DC1 和 DC4 的从属数据中心,当主 DC 繁忙时才会接受用户注册。 真的是这样吗? ## Telegram DC 分配规则(2022-05) TL;DR: - DC1、DC2、DC4 和 DC5 根据**注册时**提供的手机号的**国家代码**进行分配。这 4 个数据中心随时接受新用户注册,并且拥有大量现有用户。 - DC3 曾经有用户,但大约在 2020 年,DC3 的现有用户**可能已被迁移到** DC1。DC3 目前很可能没有用户,也不再接受新注册。 换句话说,DC2 实际上有大量用户,并且和其他 DC 一样,**只要注册时的手机号国家代码落在 DC2 的范围内(例如 \+49 德国),用户就一定会被分配到 DC2**。与此同时,DC3 虽然仍在运行,但很可能没有关联的用户。 既然 DC2 有很多用户,为什么上述机器人从未检测到 DC2 用户呢? 这是因为该机器人获取 DC 的方法存在缺陷。 ## 我到底在哪个 DC? 目前有 3 种常见的确定 DC 的方法。下面我们注册一个 DC2 的新账号,分别用这 3 种方法测试。 ### 方法一(登录法) 使用一个会被分配到 **DC2** 的手机号,通过 Telegram 的 [MTProto 协议](https://core.telegram.org/mtproto)(与官方客户端使用的协议相同)连接到 **DC1**,调用 [auth.sendCode](https://core.telegram.org/method/auth.sendcode) 接口,尝试发送验证码来注册账号。 [![](https://dev.moe/wp-content/uploads/2022/05/image-4.png)](https://dev.moe/wp-content/uploads/2022/05/image-4.png)此时服务器返回 `PHONE_MIGRATE_2` 错误,指示客户端应该连接到 DC2(如果连接到 DC2 后执行相同操作,验证码会直接发送)。 **这样我们就知道这个账号是 DC2 账号了。** 这个方法也适用于已注册的账号,但需要知道用户的手机号,因此难以查询群成员的 DC。 ### 方法二(头像/文件法) 注册好 DC2 账号(以下简称新账号)后,我们用一个能显示用户 DC 的第三方客户端(Plus Messenger),**用另一个账号登录**,查看新账号的 DC。但是客户端无法显示 DC,直到我们为新账号上传头像,之后它显示新账号在 DC2。 [![](https://dev.moe/wp-content/uploads/2022/05/image-5.png)](https://dev.moe/wp-content/uploads/2022/05/image-5.png) 这是因为第三方客户端在下载用户头像时,会从 MTProto 协议的 [userProfilePhoto](https://core.telegram.org/constructor/userProfilePhoto) 结构体中的 `dc_id` 字段获取该用户的 DC。 [![](https://dev.moe/wp-content/uploads/2022/05/image-6.png)](https://dev.moe/wp-content/uploads/2022/05/image-6.png) **该方法根据用户上传文件所在的 DC 来确定用户的 DC。** > 如果你用新账号登录第三方客户端查看自己的 DC,可能会使用方法一来确定 DC,因为客户端知道自己连接的是哪个服务器。 ### 方法三(Web CDN 法) 最后,我们用前文提到的机器人来查询新账号的 DC。 [![](https://dev.moe/wp-content/uploads/2022/05/image-7.png)](https://dev.moe/wp-content/uploads/2022/05/image-7.png)机器人说该账号位于数据中心 DC4(荷兰阿姆斯特丹)。 嗯?这个新账号不是 DC2 吗?为什么机器人说是 DC4? 原来,机器人是通过 Telegram 的 Web CDN 来确定用户 DC 的。如果我们打开 https://t.me/dctest\*\* 并查看源代码,会发现新账号的头像域名以 cdn4 开头,导致机器人将其识别为 DC4。 [![](https://dev.moe/wp-content/uploads/2022/05/image-8.png)](https://dev.moe/wp-content/uploads/2022/05/image-8.png) **由于 DC2 和 DC3 会“借用”同一地区 DC4 和 DC1 的域名来提供 Web CDN 服务**,因此机器人无法识别出任何 DC2 用户——他们全都被误认为是 DC4 用户。 > 另一种类型的机器人需要用户发送图片/文件来确定其 DC。这种方法与方法二类似,可以准确识别用户的 DC。 ## DC3 的消失 在正确使用方法来确认用户的 DC 后,我们发现全球范围内(尤其是海外群组)DC2 用户并不罕见,但 DC3 用户极为稀少。经过大量搜索,我们找到了两位 DC3 用户:`@urie\*\*` 和 `@flowinglig\*\*`。 [![](https://dev.moe/wp-content/uploads/2022/05/image-9.png)](https://dev.moe/wp-content/uploads/2022/05/image-9.png) 但进一步分析后,他们可能并非真正位于 DC3。例如,调用 [photos.GetUserPhotos](https://core.telegram.org/method/photos.getUserPhotos) 查看头像列表,发现 `@urie\*\*` 上传了 7 个头像,其中只有两个在 DC3 上,新上传的头像都在 DC1 上。 [![](https://dev.moe/wp-content/uploads/2022/05/image-10.png)](https://dev.moe/wp-content/uploads/2022/05/image-10.png)同样,查看两人历史消息中的图片,只有少量旧图片存储在 DC3,新图片存储在 DC1。相比之下,其他 DC 的用户,其图片都存储在各自对应的 DC 上。 此外,`@urie\*\*` 在 2021 年曾向一个 DC 识别机器人(文件法)发送文件进行测试,结果也是 DC1。 [![](https://dev.moe/wp-content/uploads/2022/05/image-12.png)](https://dev.moe/wp-content/uploads/2022/05/image-12.png) 遗憾的是,由于我们无法获取他们的手机号,无法通过方法一(登录法)进行准确测试。我们只能通过方法二(头像/文件法)推断他们从 DC3 迁移到了 DC1。 为了进一步确认 DC3 不再接受新用户,我们生成了全球各地区的 10000 多个手机号,并使用方法一(登录法)测试了 Telegram 的 DC 分配规则。结果如下: [![](https://dev.moe/wp-content/uploads/2022/05/image-14.png)](https://dev.moe/wp-content/uploads/2022/05/image-14.png) > 测试过程中,我们尽量让每个号码连接到错误的 DC——通过返回的 `PHONE_MIGRATE_X` 错误来了解该号码实际对应的 DC,同时避免产生过多的垃圾短信,以免骚扰用户或让 [Pavel Durov](https://en.wikipedia.org/wiki/Pavel_Durov) 为短信费用破产。测试后,我们筛选出确认属于 DC4 的号码,然后将剩余号码重新连接到 DC4,以确保不会遗漏任何分配到 DC3 的号码。 基于以上分析,我们可以得出结论:DC3 确实不再接受新用户,现有用户很可能已全部迁移至 DC1。 虽然我们没能找到消失的 DC3,但如果你想要成为某个特定 DC 的用户、避免 DC5 的宕机风险,或者测试某个机器人是否可靠,现在可以参考上图,用一个特定国家代码的手机号进行注册。 --- 由于 Telegram 的服务器和部分运行机制并非开源,本文中有不少结论基于推测。如果你发现文章中的错误或有更多线索,欢迎留言。 文章撰写时参考了以下项目与内容,在此表示感谢: - Hertz 的 Telegram DC 分析报告([Telegram DC Analysis Report](https://blog.hertz.zone/2021-11-07_TGDC)) - oott123 的 Which DC is My Telegram Account On?([Telegram DC 查询](https://lab.best33.com/telegram-datacenter/))(Web CDN 法) - GramJS([GramJS](https://github.com/gram-js/gramjs)) - Plus Messenger(头像法) - @WooMaiBot(Web CDN 法) - @where\_is\_my\_dc\_bot(文件法) **Coxxs** > 本文([https://dev.moe/en/3025](https://dev.moe/en/3025))为 Coxxs 原创作品,转载时请注明原文链接。

相似文章

合法TLS监听的并行重建

Lobsters Hottest

基于俄罗斯XMPP服务Jabber.ru的真实事件,使用ACME自动化对合法TLS监听进行分析和复现,展示了如何实现和检测基于证书的拦截。

特朗普手机可能泄露客户地址

The Verge

特朗普手机被指控不安全地存储客户数据,可能泄露了T1 Phone预订单中的地址和电话号码。泄露的信息还显示订单数量远低于病毒式传播的说法。