外出先のスマホから、AI エージェントを動かしている Mac に SSH で入ろうとする。つながらない。「Mac ごと落ちたか?」と思うが、Mac は動いている。中から自分自身(localhost)に繋ぐと、ちゃんと応答する。黙っているのは、Tailscale 側の入口だけだ。
筆者はこの症状に、5 分おきの見張りと非常用の入口を置いて備えた。約 1 か月(2026 年 9 月 28 日〜10 月 27 日)のログを数えると、入口を起こし直すはずの見張りのほうが、修復の途中で止まっていた。
黙るのは Mac ではなく入口
macOS のリモートログインでは、sshd は常駐していない。launchd が 22 番で待ち受け、接続が来るたびに sshd を起こす(macOS 27.0.1 の実機の設定で確かめた)。
この待ち受けはアドレスを絞っていない。localhost から来ても Tailscale の IP から来ても、同じ待ち受けに届く。なのに、localhost には応えて、Tailscale の IP から来た接続にだけ黙る。なぜそうなるのかは、まだ特定できていない。
見張りを置いたら、見張りごと止まった
見張りは 5 分おきに、Mac 自身から Tailscale の IP の 22 番に繋ぎ、SSH の挨拶(SSH-2.0- で始まるバナー)が返るかを見る。返らず、localhost では返るときだけ、待ち受けを軽い順に起こし直す。
ログでは、22 番が Tailscale 側だけ黙ったのが 9 回。うち 4 回は、起こし直すとすぐ戻った。
問題は、戻らなかった 5 回のうちの 3 回だ。見張りは毎回、非常用の入口にも繋いで確かめるので、そちらのログには見張りの跡が 5 分おきに残る。その跡が、修復を始めた直後から途切れていた。長いときは 5 日あまり。
launchd は、前の回が終わらないうちは次の回を起動しない。修復の途中で固まり、見張りごと止まっていたとみられる(10 月 11 日には、リモートログインを切るコマンドが止められた記録も残っている)。
見張りは修復に夢中で、5 日間見回りに出ていなかった。
外から入る経路を、共有する部品で比べる
非常用の入口は、Tailscale の IP の 2222 番だけで待ち受ける、別の sshd(非常用 sshd)だ。リモートログインとは独立した非常口のつもりだった。実際は、救命ボートを本船と同じ桟橋につないでいた。どちらも Tailscale に乗っている。
外から入る経路を、何に乗っているかで並べるとこうなる。
| 経路 | 乗っているもの | 今回の症状で |
|---|---|---|
| リモートログイン(Tailscale 越し) | launchd の 22 番・Tailscale | 黙る(9 回) |
| 非常用 sshd(Tailscale の IP の 2222 番) | 別の sshd・Tailscale | 黙ったのは 4 回。うち 2 回は 22 番と同時 |
| Tailscale SSH | tailscaled 自身・Tailscale | リモートログインを通らないので、巻き込まれない見込み(未検証) |
| トンネル(Cloudflare Tunnel) | cloudflared・Cloudflare・リモートログイン | localhost は生きていたので、通る見込み(未検証) |
Tailscale SSH は、Tailscale の IP の 22 番を tailscaled が引き取り、tailnet の ID で認証する。ポートは 22 番固定で、macOS では App Store 版と Standalone 版はサーバーになれない。
トンネルは、Mac から外向きに繋ぐので受信ポートを開けずに済む。ただ、公式の手順では行き先を localhost の 22 番にする。道は別なのに、扉はリモートログインと同じだ。
料金は、Tailscale の 3 つが Personal プラン($0。SSH 機能も試せる)の範囲、トンネルは Cloudflare One を無料から試せる。
2 本目は「乗っているもの」が違う経路にする
筆者の構成では、22 番だけが黙った 7 回は、非常用 sshd が応答していた。残る 2 回は、どちらの扉も開かなかった。Tailscale の上に 2 本並べると、リモートログインの不調には効くが、Tailscale 側の不調にはまとめて負ける。
さらに足すなら、Tailscale を通らないトンネルが、壊れ方の重ならない候補になる。扉はリモートログインと共有するが、道は重ならない。
エージェントに作らせるときに確かめさせること
見張りも非常用 sshd も root の launchd ジョブなので、最後の sudo は人が打つ。そこまでの設定と確認は、次を確かめさせながらエージェントに任せられる。
| 確かめさせること | 外すと起きること |
|---|---|
修復は軽い順にし(launchctl kickstart → 読み込み直し → リモートログインの切り替え)、各段に時間制限を付ける | 修復が返らず、見張りごと止まる |
| 動作確認は localhost ではなく Tailscale の IP に対して、バナーが返るかで見る | localhost は応答するので「動いています」で終わり、この症状は見えない |
| 2 本目を作る前に、1 本目と共有する部品を表にする | 同じ IP の上に 2 本並べ、同時に黙る |
| localhost も黙っているときは、リモートログインに触らない | 原因が別の所にあるまま入口を切り、戻らなければ締め出される |
| 非常用 sshd は、Tailscale の IP が付くまで待ってから起動する | IP が付く前に起動すると、その IP で待ち受けられない |
| 非常用 sshd は、作った直後に外の端末から実際にログインして確かめる | 文法が通っても、その設定で入れるとは限らない |
Tailscale SSH の有効化(tailscale set --ssh)は、Tailscale の IP 経由のセッションの中でやらない | その IP への既存の SSH 接続が固まり、作業中のセッションごと止まる |
非常用 sshd の要は、待ち受けを Tailscale の IP に絞る数行だ。
Port 2222
ListenAddress 100.x.y.z
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
AllowUsers <username>
100.x.y.z は tailscale ip -4 で出る IP に置き換える。別の HostKey と PidFile を持たせ、sshd -t -f <設定ファイル> で文法を確かめる。
見張りにも見えないものがある。見張りは Mac 自身から繋いでいる。家の中から玄関を叩いているようなもので、外の端末の回線や Tailscale の中継は見ていない。Tailscale そのものが止まれば、Tailscale の上の入口は全部まとめて届かない。Mac が眠れば全部止まる(筆者はいま pmset でスリープを切っている)。
まとめ
外から入れないとき、Mac は生きていて入口だけが黙っていることがある。見張りを置くなら、見張り自身が固まらないよう修復に時間制限を付ける。2 本目の経路は本数ではなく、1 本目と何を共有するかで選ぶ。
回線全体の組み方はmosh と Tailscale で切れない回線を組む記事に、スマホ側の構成は外出先からエージェントを見守るスマホ環境にまとめた。筆者がこの Mac で動かしているエージェントは Claude Code(Pro $20/月、Max $100/月〜)だ。エージェントに任せる開発の相談はAI 開発支援で受けている。



