2026年:TCP keepalive、TCP_USER_TIMEOUT、およびレンタル ProxyMac Mac mini へのアイドル SSH 生存
欧州や米国東海岸からSSHでProxyMac Mac mini(香港・東京・ソウル・シンガポール・米国)へ伸ばす運用では、入力が続くときは生きているのに、Cursor を7〜25分ほどアイドルにした直後や tail -f の無音区間のあとにセッションだけが消える、という現象が珍しくありません。原因が「Apple Silicon 上の SSH が壊れている」ことはほぼなく、ほとんどの場合は無言のまま切るミドルボックスのタイマーと、生存を証明しないデフォルトソケットの組み合わせです。本稿では二層の心象モデル(OpenSSH の keepalive とカーネル TCP の挙動)、観測症状で引ける意思決定表、数値デフォルト入りのコピペ可能な~/.ssh/config(アプリ層プローブ30秒、連続4回未応答でクライアント切断)、具体カウンタに触れる7段階の証拠収集手順(多くのゲスト Wi‑Fi で120秒前後に見えるキャリアのアイドルタイマーなど)、および関連ガイドへのリンク—autossh・Mosh・keepalive、高 RTT クライアント調整、MTU ブラックホール—をまとめ、TCP をいじる前に IPQoS が犯人でないことを切り分けられるようにします。
ソケット経路が安定したらヘルプセンターのブートストラップをブックマークし、料金ページでリージョンを比較してください。経路が未検証のままだと、新しいメンバーが毎回同じパケット損失の都市伝説を繰り返します。
長距離経路でアイドル SSH が「静かに死ぬ」とき
症状は大きく三つに分類できます。(A) ターミナルがバナーも Broken pipe も出さず固まり、キーを押すまで何も起きない。(B) 最後のパケットからちょうど120〜900秒後に client_loop: send disconnect: Broken pipe が出る。(C) 対話シェルは残るのに scp や rsync が0%のまま永遠に進まない。A は上流のNAT 束縛が期限切れになったのに RST を返さないパターンが多く、ホテル Wi‑Fiで UDP 音声優先がアイドル TCP を飢えさせる構成で起きやすいです。B はステートフル FWが無音フローの最大継続時間を強制しているケースに対応しがちです。C はPMTUD ブラックホールと重なるので、keepalive の数式を弄る週末を費やす前に MTU の記事で突合してください。
- SSH トンネル越しの画面共有は、キー入力がなくても動画フレームが止まるためアイドル間隔が長くなります。
- 踏み台はタイマーを乗算します。各ホップが独自の300秒アイドル方針を持つことがあります。
- LaunchAgent 駆動の git pullはサーバ側で処理が進んでいても、キャリアから見ると無音に見えがちです。
カーネル TCP keepalive と OpenSSH ServerAliveInterval
カーネルの TCP スタックは macOS では net.inet.tcp.keepidle 系の遅延のあと keepalive セグメントを送れますが、sysctl だけで遠隔ミドルボックスを制御することはできません。一方 OpenSSH の ServerAliveInterval は、OS デフォルトが2時間超になることもある待ち時間を経ずに、SSH プロトコルメッセージを注入して上位層のタイマーをリセットします。両者は補完関係です。SSH keepalive はSSH 接続が生きていることを示し、TCP keepalive はエンドツーエンドで4タプルがまだ尊重されていることを示します。
失敗クラス別チューニング表
| 症状シグネチャ | 第1のつまみ | 第2のつまみ | エスカレーション |
|---|---|---|---|
| アイドル > 15分、キー入力で即復帰 | ServerAliveInterval 30 | 踏み台ホップ数を減らす | Wi‑Fi の BSSID を取得しゲスト Wi‑Fi ガイドと比較 |
| 300秒の倍数で Broken pipe | クライアント側 TCPKeepAlive yes | ControlMaster ガイドに沿いソケット多重化 | ISP の文書化されたアイドルタイマーを確認 |
| アイドルがなくても SCP が途中で停滞 | MSS クランプを確認 | PMTUD テストを実行 | 遅延表に基づきリージョンを変更 |
| 夜間ビルドだけ失敗 | ミニから夜間 curl cron | WAN DHCP 更新をログ | ジョブをミニ発の pull に移す |
ProxyMac 向けクライアント ~/.ssh/config レシピ
リージョンごとにホストエイリアスを明示命名し、新しいチームメイトが同じ数値を継承できるようにします。下のスタンザは香港向けですが、JP/KR/SG/US のエイリアスへそのまま複製できます。IPQoS は長 RTT ガイドを読んだ後にだけ調整してください。スループット用と低遅延用クラスを誤って混ぜると、バルク転送中に keepalive パケットが飢えたりします。
Host proxymac-hk-dev
HostName your-node.proxymac.com
User youruser
ServerAliveInterval 30
ServerAliveCountMax 4
TCPKeepAlive yes
IPQoS throughput
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
SRE が Confluence に貼れる 7 段階プローブ手順
ping -c 20でベースライン RTTを記録し、中央値とp95を保存する。- 素の SSH を開き12分間アイドルにし、シェルが戻るか記録する。
- 捨てセッションで
ssh -vvvを有効にし、expecting SSH2_MSG_KEXINITで止まる箇所を grep する。 - 512MBファイルの並列 SCP を行い、90秒後にスループットが崩れるなら MTU を疑い keepalive を疑わない。
- 企業 VPN のスプリットトンネルが有効ならVPN 状態をログに残す。多くの製品はミニ宛て TCP とアイドル UDPを別扱いにします。
- sshd を管理できるならClientAliveIntervalはクライアント方針に合わせる。サーバが10秒プローブ、クライアントが30秒というズレは無駄な負荷になります。
- 最終設定をアーカイブし、OpenClaw ゲートウェイの systemd/launchd メモの隣に置き、自動化と人間が同じ真実を参照する。
autossh・Mosh・高 RTT 調整との併用—二重適用に注意
autossh と Mosh のガイドはプロセス監視と UDP 耐性を扱います。本稿の TCP 視点は、素の OpenSSH over TCPをループに残す必要があるときに追加してください。例:git+ssh リモート、ローカル OpenClaw ゲートウェイへの ssh -L ポートフォワード、Mosh に置き換えられない rsync --partial over SSH。Cipher や圧縮の変更を検討する場合は、keepalive で生存を証明したあとに順序付けしてください。大容量コピー時の AEAD と CPU 負荷の相互作用はIPQoS と暗号の記事にあります。
ServerAliveInterval 5 は一部の DDoS 対策アプライアンスを刺激し、プローブ連打のあと TCP RST を返すことがあります。エンタープライズエッジでは段階的に上げてください。
FAQ
ミニ側の sysctl tcp keepidle を下げるべきか? 顧客管理のラップトップでは通常いいえ。まずクライアントを直します。データセンター隣接のミニが不安定脚を起こすことは稀です。
ControlMaster はアイドルタイマーを悪化させるか? 複数セッションを 1 本の TCP に載せるため、ハンドシェイクコストは下がりますが、その一本が60秒の UDP 飢えた Wi‑Fi タイマーに当たると全セッションが巻き添えになります。経路ごとの多重数を監視してください。
IPv6 のみの uplink は? Happy Eyeballs が IPv4 のブラックホールを隠すことがあります。SSH ターゲットがどちらのアドレスファミリか文書化してから、スタックごとにタイマーを変えてください。
専用 ProxyMac Mac mini なら TCP の衛生状態を測れる理由
Apple Silicon M4 のレンタルミニは、HK / JP / KR / SG / US に固定されたエンドポイントとなり、ピアリングが読みやすい—カフェ NAT を渡り歩く開発用ラップトップとは対照的です。連続的な sysctl と nettop のベースライン、CI シークレットを所有する同一ホストへの OpenClaw 自動化、GUI の信頼プロンプトが必要なときの画面共有を同じマシンで回せます。このネットワーク規律をリージョン別の透明な料金と組み合わせると、金曜夜に毎回崩れる単一トンネルに詰め込むよりAPAC 専用タイマー向けの 2 台目のミニの方が合理的だと経理にも説明しやすくなります。