Tailscale + RDP手順書をレビューして落とし穴を潰す — キー失効と無人モードをcodexと詰めた

個人personal

自宅にWindows機が2台ある。片方(サブ機・Win11 Home)から、もう片方(メイン機・Win11 Pro)を遠隔で触りたい。そのための「Tailscale + リモートデスクトップ(RDP)」手順書は前に書いてあったので、今日はそれをClaude Codeにレビューさせた。骨子は正しかったが、「数か月後に急に繋がらなくなる」落とし穴が1つ抜けていた。そこを補足して、さらにOpenAIのcodexにセカンドオピニオンを取ったら、私が見落としていた点をもう1つ拾ってくれた、という一日。

何の手順書か(役割だけ整理)

先にPCの役割を1行で整理しておく。

  • メイン機(つながれる側)= Win11 Pro。RDPのホストになれるのはこっち
  • サブ機(つなぐ側)= Win11 Home。RDPホストにはなれない。発信専用

手順書の骨子は3つ。①この役割の非対称性(Homeはホストできないのでメイン機がPro必須)、②Tailscale(VPN)を通すのでルーターのポート開放は不要、③あとはメイン機でRDPを有効化して、サブ機からTailscaleのIP宛に繋ぐだけ。

Claude Codeに読ませた第一声は「このまま実行すれば通ります」だった。役割整理もポート開放不要の理屈も全部正しい、と。手順書そのものはすでに別記事として存在するので、ここでは中身を丸ごと再掲しない。今日の主役は「レビューで何が抜けていたか」のほうだ。

そもそも一度書いた手順書をなぜ今さらレビューにかけたかというと、書いた直後は「初回で動くこと」しか検証していなかったからだ。実際にサブ機からメイン機を触るのはこれからで、明日その設定を進めたい。動かす前に、手順書に穴がないかもう一度点検しておきたかった。

レビューで見つけた落とし穴

骨子は正しい。ただ、初回セットアップが通ることと、半年後も通り続けることは別の話だった。レビューで浮かんだのは「現地に行かないと復旧できない」系の落とし穴で、しかも初日には絶対に踏まない。全部、しばらく経ってから牙をむくやつだ。

補足として3点を書かせた。

  • 補足1:Tailscaleのキー失効。 Tailscaleのデバイス鍵はデフォルトで約180日で切れる。常時ホストのメイン機がこれで失効すると、手元で再ログインするまでTailnetから外れて、リモートから一切見えなくなる。管理コンソールでメイン機だけ「キー有効期限を無効化(Disable key expiry)」しておくべき。
  • 補足2:RDPの資格情報はPINじゃない。 普段メイン機にPINや顔認証(Windows Hello)でログインしていても、RDPで入るときはPINではなくMicrosoftアカウントのパスワードが要る。ここを勘違いすると初回接続で普通に弾かれる。
  • 補足3:BitLockerのプリブート認証。 起動時にPINやパスワードを要求するBitLocker構成だと、再起動後にWindowsが立ち上がる前(=Tailscaleが動く前)の画面で止まる。そこは手元でしか解除できないので、リモート復旧が詰む。TPMによる自動解除なら問題なし。

3つとも「初日は動くのに、キーが切れた日・再起動した日に突然死ぬ」タイプ。手順書に初回手順しか書いていないと、半年後の自分が原因不明のまま途方に暮れる。

codexにセカンドオピニオンを取った

この補足3点、自分とClaude Codeだけで「正しいはず」と決めるのが少し不安だった。Tailscaleの180日とか、Windows Helloの挙動とか、断定を含んでいる。そこで「一応OpenAIのcodexのレビューを受けてもらえますか」と頼んで、別モデル(gpt-5.5)にセカンドオピニオンを取った。

質問の投げ方は工夫した。手順書を丸ごと渡すのではなく、「補足3点それぞれが技術的に正確か・条件付きか・不正確か、手順書に入れる重要度は高中低のどれか」を問う形にした。瑣末なクソリプはいらない、致命的な誤りと重要な見落としだけ挙げてくれ、と添えて。

返ってきた判定は、3点とも重要度「高」。しかも「現地に触れないと復旧できない系だから重い」という、私がぼんやり感じていた不安の正体を言語化してくれた。

うれしかったのは、私の断定にちゃんと条件を付け足してくれたことだ。

  • 補足2(PINじゃない)には、「ローカルアカウントならローカルのパスワード、企業管理のWindows Hello for Business構成ではPINや生体でRDP認証が通る例外もある」と。個人利用なら「MSアカウントのパスワード」でいいが、言い切りすぎないほうがいい。
  • 補足3(BitLocker)には、「TPMのみの自動解除なら普通は問題ないが、BIOS/UEFIを変更するとBitLocker回復画面に入って、そこでも同じく詰まる」と。プリブートPINだけでなく回復画面も同じ罠だ、というのは私の頭になかった。

断定を条件付きに直せるのは、公開手順書としてはかなり大事なところ。半年後の自分が「PINで通るって書いてあるのに弾かれた」と混乱する未来を1つ潰せた。

そして、私が見落としていた4点目を追加で拾ってくれた。

  • 補足4:Tailscaleの「Run unattended(無人モード)」を有効化する。 Windowsではログインユーザーとしてではなく、システムとしてTailscaleを動かさないと、再起動後や未ログイン状態でメイン機がTailnetに出てこないことがある。Tailscale公式のRDP手順でも案内されている設定だという。

これは効いた。常時ホストなのに「誰かがログインしていないとTailnetから消える」なんて、初日には気づきようがない。まさに補足1〜3と同じ「あとで詰む」系で、レビューをかけて正解だった。

手順書に反映した

「全部入れといてください」と伝えて、4点+codexの但し書きを手順書の計6箇所に反映させた。常時接続の設定、資格情報の注意、再起動とBitLockerの注意、トラブルシュート表、運用メモ、チェックリスト。編集後に構造が崩れていないか(見出しの並びや手順の通し番号がズレていないか)も確認させて、崩れていないことを見た。

外部の設定は、Tailscale管理コンソールの Disable key expiry が肝になる。ただしcodexの但し書きどおり、「PCを紛失・廃棄したときは管理画面から必ずそのデバイスを削除する」という一文もセットで入れた。期限を切らない代わりに、いなくなった端末は自分で消す責任が残る。

Tailscale KB: Key expiry

ついでに今のメイン機の状態も見てもらった

手順書が固まったので、「今このメイン機で設定・確認しなきゃいけないことがあるはず」と思って、現状を読み取り確認させた(変更が要るものは変更前に必ず確認、という条件付きで)。

読み取った結果、下地はおおむね整っていたが、詰めておくべき点が2つ見つかった(具体的な待受ポートやアドレスなどの構成値は、公開記事なのでここには書かない)。

  • スリープが有効になっていた。常時ホストにするなら、寝ている間に本体がスリープしたら元も子もない。
  • Tailscaleの状態が「starting / NoState」でIPが取れず、オンライン扱いになっていなかった。

この2つ目が皮肉で、まさにcodexが追加してくれた補足4(Run unattended未設定)が原因の可能性が高い。理屈で「あとで詰む」と書いた落とし穴に、同じ日に自分のメイン機が片足を突っ込んでいたわけだ。レビューで拾った知識が、そのまま自分の環境の診断名になった。

途中、Tailscaleのコマンド出力がShift-JISに化けてJSONのパースが失敗する小さな罠も踏んだ。文字コードをUTF-8に指定し直して取り直したが、それでもCLIが NoState を返し続けたので、深追いはやめてGUI(トレイアイコン)確認に切り替える、と判断した。BitLockerの状態は管理者権限がないと読めなかったので、これも明日に回す。

明日やること

今日はメイン機の下地確認と手順書の補強までで、実接続テストとサブ機側は手つかず。忘れないように、続きのメモをmdx-playground側に残させた(別ディレクトリに保存していないか、保存先も実際に確認させた)。

  • メイン機のスリープを無効化する(powercfg /change standby-timeout-ac 0
  • Tailscaleを無人モード(Run unattended)にして、トレイが「Connected」になるまで見届ける
  • 接続後にメイン機のTailscale IPを控える(サブ機の接続先になる)
  • 管理コンソールでメイン機のキー有効期限を無効化する
  • 管理者PowerShellでBitLockerのKey Protectorsを確認する(TPMのみなら対応不要)
  • サブ機(Home)にTailscaleをインストールしてConnected確認
  • サブ機から mstsc でメイン機へ接続テスト。ダメなら3389番ポートで疎通を切り分ける

学び

  • 手順書のレビューは「初回で動くか」より「半年後も動き続けるか」で見ると、初日には踏まない落とし穴(キー失効・再起動後の未接続・プリブート認証)が一気に見えてくる。全部「現地に行かないと直せない」ので、リモート前提の構成では特に重い。
  • 自分の補足に断定が混じっているときは、別モデルにセカンドオピニオンを取る価値がある。今日はcodexが3点を条件付きに整理し直したうえ、4点目を拾ってくれた。人間がやったのは「不安だから確認したい」と判断したことだけで、検証は道具に回せた。
  • レビューで得た知識がそのまま自分の環境の診断に効くことがある。「Run unattendedが要る」と書いた直後に、自分のメイン機がまさにそれで未接続だった。理屈と実物が同じ日に噛み合うと、腹落ちの速度が違う。
  • CLIの出力が化けたら深追いしない。Tailscaleのコマンドが文字化けでパースに失敗し、UTF-8で取り直してもCLIが状態を掴めないままだった。ここで粘っても消耗するだけなので、GUI確認に切り替えると決めた。ツールの一系統が詰まったら別系統に逃がす、という切り替えの早さは覚えておきたい。