复活 iChat 的音频与视频会议功能

Hacker News Top 新闻

摘要

一篇爱好者的详细技术帖,介绍如何在旧版 OS X(Leopard / Snow Leopard)上通过 /etc/hosts 重映射早已停服的 SNATMAP 服务器 configuration.apple.com,从而复活 iChat 的音频与视频会议功能。作者逐步讲解了 XMPP 配置、tcpdump 调试、iChat 的调试模式,以及在 NAT 路由器背后建立点对点 RTP 连接的流程。

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

缓存时间: 2026/10/06 05:47

# 复活 iChat 的音频和视频会议功能 来源:https://blog.pipetogrep.org/2026/09/11/resurrecting-ichat-audio-and-video-conferencing/ 发布于:2026\-09\-11 12:36:14,作者 **Chris Jones** 更新于:2026\-10\-05 20:15:16 • 阅读约 7 分钟 ## 一句话总结 在运行 Leopard 或 Show Leopard 的旧 Mac 上(在 Tiger 或 Panther 上尚未测试),在 `/etc/hosts` 文件中添加以下内容,iChat 就应该能再次进行音频和视频通话了。这假设你的路由器支持端口保留型 NAT(大多数都支持)。 ``` 157.230.2.213 configuration.apple.com ``` 请注意,如果你使用的是基于 BSD 的路由器(如 pfSense 或 OPNsense),需要在出站 NAT 设置中启用源端口保留。 ## iChat AV 与 iSight 我曾经是那种最让人讨厌的 Apple 狂热粉丝。在 2000 年代初,无论 Apple 的东西是否真的更好,我都认为它们胜过市面上的一切。不过在某个领域它确实如此,那就是 2000 年代初的音视频会议。 当时消费级视频会议领域的巨头包括:Microsoft 的 MSN Messenger、Yahoo\! 的 Yahoo\! Messenger,以及 AOL 的 AOL Instant Messenger(AIM)。随后在 2003 年 6 月 Apple 的全球开发者大会(WWDC)上,伴随着 G5 处理器和 OS X 10.3 Panther,Apple 发布了“iChat AV”。 iChat AV 宣传截图(https://blog.pipetogrep.org/images/ichatav_screen_marketing.png) 他们还发布了一款设计精美、过度工程化的摄像头来配合它,名为“iSight”。 初代 iSight 摄像头(https://blog.pipetogrep.org/images/isight.jpg) 我当时确实有一台 G4 笔记本和一个 iSight。感觉就像生活在未来,我非常喜欢它。这篇文章讲述的是我如何让早期 OS X 上的 iChat 视频会议功能重新在互联网上运转起来,重拾当年的乐趣。 ## 第一次尝试 2023 年初,我的朋友(下文称之为“Methodius”)和我决定直接试一试,看看会发生什么。我们在 OS X Leopard 上尝试进行一次简单的 iChat 音频通话。那个版本的 iChat 支持 XMPP(Jabber)服务器,所以我们各自在 jabb.im(https://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 随后尝试通过之前从 SNATMAP 服务器获取到的公网 IP 和端口互相发送数据包,建立点对点的 RTP 连接。由于 NAT 连接是有状态的,出站 NAT 连接会为发起请求的机器打开一条入站连接,因此位于 NAT 路由器后面的 iChat 之间可以互相连接,无需事先设置 NAT 端口转发。 ## 实际发生的情况 1. iChat 尝试向 `http://configuration.apple.com/configurations/macosx/ichat/1/snatmap.txt` 发送 HTTP 请求,但被重定向到了 https,而它无法建立 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 期望如何与它通信。我们学到了很多东西,但最终以失败告终。 ## 多年之后 2026 年夏天,Methodius 和我决定再次尝试,但这次借助了一些 LLM 的帮助。利用我们之前捕获的网络数据包,我们让 LLM 逆向分析了 iChat 的视频会议框架,搞清楚了发往 SNATMAP 服务器的请求是什么样的,以及 iChat 期望收到怎样的响应。据此,我们生成了一份 SNATMAP 协议的规范文件。 虽然我没有反编译 iChat、阅读汇编代码并理解其逻辑的能力,但至少我可以根据 LLM 生成的规范文件学习编写一个简单的 UDP 服务器。 ## 宝宝的第一台服务器 我的本职工作是系统工程师和管理员。我负责安装和配置服务器,但以前从未自己写过一个服务器。事实证明,这个 SNATMAP 服务器是练习编写服务器的绝佳入门项目。 该协议: 1. 在 UDP 5678 端口上通信 2. 请求数据包在 16 字节内包含四个字段。 1. 类型(请求为 “1”) 2. Nonce(用于将请求与响应配对的随机数) 3. 客户端本地 IP(未使用) 4. 客户端本地端口(未使用) 3. 响应数据包在 16 字节内包含四个字段 1. 类型(响应为 “2”) 2. Nonce(与请求中相同的随机数) 3. 来自 UDP 请求的外部 IP 4. 来自 UDP 请求的外部端口 SNATMAP 服务器的规范文件和源代码的链接在本文末尾。 ## 测试结果 由于 Methodius 有孩子,因此自由时间远少于我,我需要一种能自己测试 iChat 在互联网上如何工作的方法。由于我没有两条独立的 ISP 线路可以折腾,我决定在实验室里“搭建一个互联网”。具体做法是:在 KVM 宿主机(Proxmox)上运行两台 NAT 路由器(OpenWrt)作为虚拟机,它们穿越一个作为“互联网”的扁平网络空间。然后我通过 USB 网卡将两台 Mac 物理连接到物理 KVM 宿主机上,虚拟机路由器会为它们分配各自 NAT 后面的私有 LAN 地址。接着在“互联网”网络上,我在一个 Debian Linux 虚拟机中运行了 Jabber(ejabberd)、web(lighttpd)和 SNATMAP 服务器。 下面是示意图,以及 Proxmox 服务器(Thinkpad 笔记本)和两台 Mac 物理连接的实拍照片。 iChat 示意图(https://blog.pipetogrep.org/images/ichat_diagram.png)iChat 实验室 1(https://blog.pipetogrep.org/images/ichat_lab1.jpg)iChat 实验室 2(https://blog.pipetogrep.org/images/ichat_lab2.jpg)iChat 实验室 3(https://blog.pipetogrep.org/images/ichat_lab3.jpg)iChat 实验室 4(https://blog.pipetogrep.org/images/ichat_lab4.jpg) 有了这个环境,我就能快速地进行测试和迭代了。 ## 规范文件与源代码 如果你想的话,可以利用规范文件来创建自己的服务器版本。源代码是根据规范文件用 Python 手写的,可以在几乎所有能够运行 Python 3 的操作系统上直接运行。 - 规范文件(https://github.com/llamallama/iChatSNATMAP/blob/main/SPEC.md) - 源代码(https://github.com/llamallama/iChatSNATMAP/blob/main/snatmap.py) ## 自建服务 如果你想自建服务,请确保你有一个 web 服务器配置为响应对 `configuration.apple.com` 的请求,并从以下路径提供 `snatmap.txt`: ``` /configurations/macosx/ichat/1/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 实际截图(https://blog.pipetogrep.org/images/ichatav_screen_real.png) 尽情享受,聊得愉快!

相似文章

引用 Luke Curley

Simon Willison's Blog

技术评论:Luke Curley探讨WebRTC的设计如何通过激进丢弃音频数据包来优先保障低延迟,这与LLM语音应用中提示词准确度比速度更重要的需求相矛盾。他讲述了在浏览器限制下在Discord实现重传所面临的挑战。

Chirp Pong

Simon Willison's Blog

Simon Willison 实验了 Chirp Pong——一个通过手机麦克风发送音频信号来同步游戏状态的双人静态 HTML 网页游戏,证明用声音进行设备间网络通信是可行的。

Parrot

Product Hunt

Parrot 是一款免费开源的 Mac 会议助手,可在通话过程中实时录音并进行设备端转录,无需机器人加入会议,支持 Claude、Ollama 本地模型或自建服务器,通话后生成承诺与遗漏问题报告。