Mumble无法通过域名连接到服务器
0. 问题背景与问题描述
0.1 问题背景
Mumble 部署在阿里云的 ECS 上,IP 为 11.4.5.14,域名为 mumble.example.com。
域名未经过 ICP 备案
0.2 问题描述
Mumble 客户端无法通过域名连接到服务器,但是可以通过 IP 连接。
直接通过 IP 访问时,会有约为 5 秒的延迟。
1. 直连 IP 分析
1.1. 抓包分析直连 IP 连接
Wireshark 抓包如下:

可以看到,Mumble 客户端通过 UDP 协议请求了服务器的端口,用于显示延迟和提供服务器基本信息。
序号为 415 的包是点击连接服务器后,客户端发送的第一个包,通过 WireShark 可以看到,客户端使用 NBNS 协议向服务器发送了一个查询,查询内容为*
很明显,服务器端根本没有此项服务,因此客户端没有收到任何回应。
此时客户端又重新发送了两次请求,但是服务器端依然没有回应。
此时已经经过了 5 秒的时间。
而后客户端才进行了正常的 TCP 握手等操作。
1.2. 解决方案
由于 Mumble 已经长时间未更新,因此建议通过域名的方式访问服务器。
2. 通过域名连接分析
2.1. 抓包分析域名连接
Wireshark 抓包如下:

可以看到,点击连接后,客户端没有使用 NBNS 协议向服务器发送查询,而是直接进行了 TCP 握手操作,发送了序号为 685 的包。
在包 687 成功建立 TCP 连接后,客户端发送了一个 TLSv1 的 Client Hello 包。
观察包的内容:

可以看到,客户端在包的内容中,指定了 SNI 为 mumble.example.com。
而通过 IP 直连时,客户端并没有发送 SNI。

在客户端发送 Client Hello 包后,服务器端返回了三个 RST 包,关闭了连接。
Mumble 中提示:The remote host closed the connection.
2.2. 原因猜测
首先,我们可以确定服务器可以正常建立 TCP 连接,而且可以回应 IP 直连的请求。
与 IP 直接访问唯一的不同是,Client Hello 包中包含了 SNI。
而恰好,在 RST 包前,服务器与客户端的行为,与 HTTPS 的握手行为一致。
因此我们有理由怀疑,这次阻断为阿里云的防火墙阻断,原因是域名没有经过 ICP 备案但尝试了HTTPS连接
2.3. 验证猜测
我们准备了一个经过 ICP 备案的域名,mumble-icp.example.com,并且将其解析到了服务器的 IP 11.4.5.14。
使用这个域名进行连接,并通过 Wireshark 抓包。

可以看到,客户端成功建立了 TCP 连接,并且在发送了 Client Hello 包后,没有 RST 包返回,服务器也成功连接。
2.4. 解决方案
- 自行 ICP 备案,并实际架设网站,备案请遵守相关法律法规。
- 借用他人已经备案的域名,理论上 Mumble 并不是网站,同时 Mumble 是私用语音服务器,此行为可行,但实际操作请咨询工信部、阿里云以及其他有关部门。
- 使用 IP 直连,并忍受 5 秒的延迟。
- 将服务器迁出到国外。
3. 总结
Mumble 通过 IP 连接时,会有约为 5 秒延迟原因是:客户端尝试了 NBNS 协议,但服务器端没有此项服务,因此客户端没有收到任何回应。Timeout 后才进行了正常的 TCP 握手等操作。解决方案之一是使用域名连接。
Mumble 无法通过域名连接到服务器,原因是域名被阿里云拦截。解决方案之一是 ICP 备案。