恢复iChat音频和视频会议

iChat 的音频和视频通话依赖已不复存在的 Apple 服务。本文通过搭建一个兼容的替代服务,并给出让一台 2000 年代的 Mac 重新拨打电话所需的 /etc/hosts 条目和协议细节,让这些通话功能得以恢复。

中文
复制
iChat 音视频通话的服务架构示意图,标注了要替换掉的那些 Apple 服务

发布于:2026-09-11 12:36:14,作者 Chris Jones

更新于:2026-10-05 20:15:16 • 阅读时长 7 分钟

tl;dr

把下面这段加进你那台跑 Leopard 或 Snow Leopard 的老 Mac 的 /etc/hosts 文件里(没在 Tiger 或 Panther 上测过),iChat 应该就能重新打音视频通话了。前提是你的路由器做的是保留端口的 NAT(大多数都是)。

157.230.2.213 configuration.apple.com

注意,如果你用的是 pfSense 或 OPNsense 这类 BSD 路由器,需要在出站 NAT 设置里打开源端口保留。

iChat AV 与 iSight

我曾经是最招人烦的那种苹果死忠。2000 年代初,我觉得苹果什么都比别家强,不管事实是不是这样。但有一个领域确实如此——2000 年代初的音视频会议。

当时消费级视频会议的主要玩家是微软的 MSN Messenger、Yahoo! 的 Yahoo! Messenger,以及 AOL 的 AOL Instant Messenger(AIM)。然后在 2003 年 6 月的苹果全球开发者大会(WWDC)上,苹果连同 G5 处理器和 OS X 10.3 Panther 一起发布了「iChat AV」。

他们还发布了一款与之配套的、设计过度精致的漂亮摄像头,叫「iSight」。

我当时真的有一台 G4 笔记本和一只 iSight。感觉像活在未来,我很喜欢。这篇文章讲的是我怎么让早期 OS X 上的 iChat 视频会议重新通过互联网跑起来,重温一下当年的乐趣。

第一次尝试

2023 年初,我和朋友(下面称他为「Methodius」)决定直接试试看会发生什么。我们在 OS X Leopard 上测试一次简单的 iChat 语音通话。那个版本的 iChat 支持 XMPP(Jabber)服务器,于是我们各自在 jabb.im 上注册了账号,按下绿色的通话按钮。对方那边响了,提示正在尝试连接,然后……连接失败。

事情从来不会那么简单。

调试 iChat 与抓包

该用 tcpdump 看看流量了。好在那个年代的 OS X 预装了它,我不用额外装东西。除了抓包,我还用调试模式启动了 iChat,在终端里这样运行:

/Applications/iChat.app/contents/MacOS/iChat -errorLogLevel 7

iChat 的调试模式非常有用,却几乎没有任何文档,所以现在把它放在这里,方便我以后需要时查阅。

本应发生的事

  1. iChat 向 http://configuration.apple.com/configurations/macosx/ichat/1/snatmap.txt 发起一个 http 请求,获取 SNATMAP 服务器的地址。
  2. iChat 向该 SNATMAP 服务器发起一个 UDP 请求,获取自己的公网 IP 地址。
  3. 随后,两端的 iChat 通过各自的文本通信通道(在我们这里是 XMPP)交换各自的公网 IP 和端口。
  4. 接着,两端的 iChat 尝试建立点对点 RTP 连接,向此前通过 SNATMAP 服务器发现的公网 IP 和端口互相猛发数据包。由于 NAT 连接是有状态的,而向外的 NAT 连接会为发起请求的机器打开一条入站连接,所以位于 NAT 路由器之后的 iChat 能够彼此连接,无需事先设置 NAT 端口转发。

实际发生的事

  1. iChat 尝试向 http://configuration.apple.com/configurations/macosx/ichat/1/snatmap.txt 发起 http 请求,但被重定向到 https,而它无法连接,因为 OS X 的 TLS 套件太旧了。
  2. iChat 未能完成该请求,于是双方交换的不是公网 IP,而是私有局域网 IP,这显然无法穿过 NAT 建立连接。

不过,在写这篇文章时,那个 https URL 仍然可用,而且里面确实有东西!

snatmap://snatmap.apple.com:5678

好吧,没问题。我自己搭了一个简单的 Web 服务器,自己托管那个文件,修改 OS X 的 /etc/hosts 文件,把 configuration.apple.com 指向我选定的 IP。运行之后……还是不行。

Apple 的 SNATMAP 服务器不再响应了。至此我们走进了死胡同,因为我们完全不知道这个 SNATMAP 服务器是如何工作的,也不知道 iChat 期望如何与它通信。我们学到了很多,但最终以失败告终。

几年之后

Methodius 和我在 2026 年夏天决定再试一次,不过这次有了一点 LLM 的帮助。借助之前的网络抓包,我们得以用 LLM 逆向工程 iChat 的视频会议框架,弄清楚发往 SNATMAP 服务器的请求长什么样,以及 iChat 期望收到什么样的响应。由此,我们生成了一份 SNATMAP 协议的规范文件。

虽然我既不会反编译 iChat,也看不懂汇编代码,但至少可以照着 LLM 生成的 spec 文件,学着写一个简单的 UDP 服务器。

人生第一个服务器

我的本职是系统工程师兼管理员。装服务器、配服务器是我的活儿,但自己写一个服务器,以前从没干过。事实证明,这个 SNATMAP 服务器拿来练手再合适不过。

协议如下:

  1. 走 UDP,端口 5678
  2. 请求包 16 字节,含四个字段。
    1. Type(请求填 "1")
    2. Nonce(随机数,用来把请求和响应配对)
    3. 客户端本地 IP(未使用)
    4. 客户端本地端口(未使用)
  3. 响应包 16 字节,含四个字段
    1. Type(响应填 "2")
    2. Nonce(与请求中相同的随机数)
    3. UDP 请求的外部 IP
    4. UDP 请求的外部端口

spec 文件和 SNATMAP 服务器源码的链接放在文末。

测试结果

Methodius 有孩子,空闲时间比我少得多,所以我得想办法自己一个人测 iChat 在公网上的表现。我手头没有两条独立的 ISP 线路,于是决定在实验室里搭一个"互联网"。做法是在 KVM 宿主机(Proxmox)上跑两台 NAT 路由器(OpenWrt)虚拟机,它们之间穿过一个扁平网络空间,这个空间就充当"互联网"。然后把两台 Mac 通过 USB 网卡物理连接到 KVM 宿主机上,由虚拟机路由器在各自的 NAT 私有局域网里给它们分配 IP。而在"互联网"这一侧,Jabber(ejabberd)、web(lighttpd)和 SNATMAP 服务器都跑在一台 Debian Linux 虚拟机里。

下面是示意图,以及实际物理环境的照片:Proxmox 服务器(那台 Thinkpad 笔记本)和接在它上面的两台 Mac。iChat Diagram iChat Lab 1 iChat Lab 2 iChat Lab 3 iChat Lab 4

这样一来,我就能快速测试、快速迭代了。

规范文件与源代码

如果你愿意,可以照着规范文件做一个自己的服务器版本。源代码是照着规范文件用 Python 手写的,只要系统能跑 Python 3,基本都能直接运行。

自托管

如果你想自托管,先准备一台 Web 服务器,让它能响应发往 configuration.apple.com 的请求,并从路径

/configurations/macosx/ichat/1/snatmap.txt

提供 snatmap.txt。

在 snatmap.txt 中写入

snatmap://YOUR_SERVER_IP:5678

把 YOUR_SERVER_IP 替换成运行 SNATMAP 服务器的那台机器的公网 IP 地址。

省事的办法

或者,你直接用我的服务器也行!世界上还剩那么 1 到 5 个想用这款上古软件视频聊天的人,我就一直给它开着。:D

在你那台跑 OS X Leopard 或 Snow Leopard 的老 Mac 上(更老的版本也许能行,但我没测过),把下面这行加进 /etc/hosts 文件。

157.230.2.213 configuration.apple.com

然后让想通话的朋友也照做。之后,猛戳那个绿色的通话按钮就行了!

你不需要 iSight

真的!你甚至可以用一款相当新的 Logitech 摄像头。我就是在 OS X Leopard 上用 Logitech C920 测的。

最终效果

下面是 Methodius 和我通过真正的互联网用 iChat AV 聊天的截图。iChat AV 实际截图

祝玩得开心,聊得愉快!

来源: The Pipetogrep Blog← 返回首页