Telegram 数据中心之谜
摘要
关于 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)
## DC2 和 DC3 去哪了
为了满足群友的好奇心,有人创建了一个用于查询用户所在数据中心的机器人。于是群友们纷纷开始查询自己的 DC:
- 使用 \+86 手机号注册的用户发现自己在 DC5(新加坡),即将经历下一次宕机。
- 使用 \+1 手机号注册的用户在 DC1(美国迈阿密),既享受连接速度又稳定。
- 使用欧洲手机号注册的用户在 DC4(荷兰阿姆斯特丹),成为中文 Telegram 社区中最稀有的群体。
嗯?等等……Telegram 不是声称有 5 个 DC 吗?DC2 和 DC3 在哪?
[](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)此时服务器返回 `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)
这是因为第三方客户端在下载用户头像时,会从 MTProto 协议的 [userProfilePhoto](https://core.telegram.org/constructor/userProfilePhoto) 结构体中的 `dc_id` 字段获取该用户的 DC。
[](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)机器人说该账号位于数据中心 DC4(荷兰阿姆斯特丹)。
嗯?这个新账号不是 DC2 吗?为什么机器人说是 DC4?
原来,机器人是通过 Telegram 的 Web CDN 来确定用户 DC 的。如果我们打开 https://t.me/dctest\*\* 并查看源代码,会发现新账号的头像域名以 cdn4 开头,导致机器人将其识别为 DC4。
[](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)
但进一步分析后,他们可能并非真正位于 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)同样,查看两人历史消息中的图片,只有少量旧图片存储在 DC3,新图片存储在 DC1。相比之下,其他 DC 的用户,其图片都存储在各自对应的 DC 上。
此外,`@urie\*\*` 在 2021 年曾向一个 DC 识别机器人(文件法)发送文件进行测试,结果也是 DC1。
[](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)
> 测试过程中,我们尽量让每个号码连接到错误的 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监听的并行重建
基于俄罗斯XMPP服务Jabber.ru的真实事件,使用ACME自动化对合法TLS监听进行分析和复现,展示了如何实现和检测基于证书的拦截。
调查:俄罗斯审查系统(TMCT)泄露中国DPI签名
调查显示,俄罗斯TMCT互联网审查系统正在生成包含中文字符的封锁页面,表明这些设备由中国联通提供。
监控厂商被曝滥用电信接入权限追踪用户位置
Citizen Lab 揭露两起监控活动,利用 SS7 与 Diameter 漏洞,通过非法电信接入追踪手机位置。
特朗普手机可能泄露客户地址
特朗普手机被指控不安全地存储客户数据,可能泄露了T1 Phone预订单中的地址和电话号码。泄露的信息还显示订单数量远低于病毒式传播的说法。
@GYLQ520: Telegram 自带的搜索功能是真的烂,中文简直是灾难级别,翻个旧消息全靠运气。 有人直接开源了一套解法——Telegram Search,把 OpenAI 的语义向量塞进聊天记录检索里,你只要记得“大概聊过什么”,它就能帮你挖出来,完…
Telegram Search 是一个开源工具,利用 OpenAI 的语义向量对 Telegram 聊天记录进行智能检索,支持中文优化、自动备份和 Docker 一键部署。