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

かつての私は、最も厄介なタイプの Apple 信者だった。2000 年代初頭、事実がどうであれ Apple は他より優れていると思い込んでいた。ただ、ひとつだけ本当にそうだった分野がある。2000 年代初頭の音声・ビデオ会議だ。

当時、コンシューマー向けビデオ会議の主要プレイヤーは Microsoft の MSN Messenger、Yahoo! の Yahoo! Messenger、そして AOL の AOL Instant Messenger(AIM)だった。そこへ 2003 年 6 月の Apple 世界開発者会議(WWDC)、Apple は 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 ではなくプライベート LAN の 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 が生成した仕様書を頼りに、簡単な UDP サーバーを書くことくらいなら学べる。

人生初のサーバー

本業はシステムエンジニア兼管理者だ。サーバーを立てて設定するのは仕事だが、自分でサーバーを書いたことは一度もない。実際のところ、この SNATMAP サーバーは練習台としてこれ以上ない題材だった。

プロトコルは以下のとおり:

  1. UDP、ポート5678
  2. リクエストパケットは16バイトで、4つのフィールドを含む。
    1. Type(リクエストは "1")
    2. Nonce(ランダムな数値。リクエストとレスポンスの紐付けに使う)
    3. クライアントのローカルIP(未使用)
    4. クライアントのローカルポート(未使用)
  3. レスポンスパケットは16バイトで、4つのフィールドを含む。
    1. Type(レスポンスは "2")
    2. Nonce(リクエストと同じランダムな数値)
    3. UDPリクエストの外部IP
    4. UDPリクエストの外部ポート

specファイルとSNATMAPサーバーのソースコードへのリンクは文末に。

テスト結果

Methodiusには子どもがいて、自由時間が僕よりずっと少ない。だからiChatが公網でどう動くか、自分一人でテストするしかなかった。独立したISP回線が2本あるわけでもないので、ラボの中に「インターネット」を構築することにした。やり方はこうだ。KVMホスト(Proxmox)上でNATルーター(OpenWrt)の仮想マシンを2台動かし、その間をフラットなネットワーク空間でつなぐ。この空間が「インターネット」の役割を果たす。2台のMacはUSB NICで物理的にKVMホストに接続し、仮想ルーターがそれぞれのNATプライベートLAN内でIPを割り当てる。「インターネット」側では、Jabber(ejabberd)、web(lighttpd)、SNATMAPサーバーが1台のDebian Linux仮想マシン上で動いている。

以下が図と、実際の物理環境の写真:Proxmoxサーバー(Thinkpadノート)と、それに接続された2台の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ファイルに次の1行を追加する。

157.230.2.213 configuration.apple.com

あとは通話したい友達にも同じことをしてもらう。そして緑の通話ボタンを思いきり押すだけ!

iSightは要らない

本当だ! かなり新しいLogitechのカメラでも使える。僕はOS X Leopard上でLogitech C920を使ってテストした。

最終結果

以下が、Methodiusと僕が本物のインターネット経由でiChat AVを使ってチャットしたときのスクリーンショット。iChat AV 実際のスクリーンショット

楽しんで、たくさん喋ろう!

出典: The Pipetogrep Blog← ホームへ戻る