本文へスキップ

たけぞうBLOG

AIエージェント(Muse)に自宅サーバーへのSSHを許可する方法 〜Tailscale参加からNanoPi経由のProxmox多段SSHまで〜

たけぞう

MetaのパーソナルAIエージェント「Muse」に、自宅のサーバーを操作させるための下地を作りました。やったことは3つです。Museを僕のTailscaleネットワーク(tailnet)に参加させること、NanoPi R6S(Ubuntu)へSSHログインできるようにすること、そしてNanoPiを踏み台にしてProxmox VEノード(pve)へ多段SSHで入れるようにすること。ポート開放は一切なしで、到達経路はtailnet経由のみです。この記事は、その構築の記録です。

表記について:tailnet上のIPアドレス(100.x系)は省略し、「tailnet上のIP」と表記しています。LAN内のIPアドレスはプライベートアドレスのため、そのまま記載しています。

目次

広告

やりたかったことと全体構成

メールサーバーをはじめ、自宅のサービスはProxmox VE上のLXCで動いています。運用作業のたびに自分でSSHするのが面倒になってきたので、「AIエージェントにログインさせて、調査や定型作業を任せたい」が動機です。

ただし、エージェントに自宅LANへの侵入経路を持たせるのは怖い。そこで条件を次のように決めました。

  • ルーターのポート開放はしない(インバウンドの穴を開けない)
  • 到達経路はTailscaleのみ。エージェントは僕のtailnetに専用ノードとして参加する
  • 認証は公開鍵のみ。パスワードは共有しない
  • エージェントから到達できる先は、承認したデバイスだけに限る

最終的な構成はこうなりました。

Muse(クラウド上の専用VM / tailnet上のデバイス名: muse)
  │  Tailscaleトンネル経由のSSH(公開鍵認証)
  ▼
NanoPi R6S(Ubuntu 24.04 / ユーザー: kawai)
  │  LAN内SSH(公開鍵認証)
  ▼
Proxmox VEノード「pve」(192.168.2.242 / root)

前提: Muse側からしか接続できない

最初に検討したのは逆向き、つまり「自分のPCからMuseのVMへSSHで入る」構成でした。これは早々に断念しました。MuseのVMは外向き専用に隔離されていて、SSHサーバー自体が動いておらず、外から中へ入る経路が存在しないためです。Tailscaleについても、Muse側のクライアントは「参加して外へ接続する」専用で、接続を受け付ける側にはなれません。

つまり到達の方向は Muse → 自宅 の一方向のみ。この制約は、裏返すとセキュリティ上の利点でもあります。tailnetに参加させても、MuseのVM自体が踏み台や公開サーバーになることはありません。

手順1: Museをtailnetに参加させる

MuseにはTailscale連携が組み込まれていて、VMが独立したノードとしてtailnetに参加します。参加はMuse側で開始し、承認リンクが発行されるので、管理者がそれを開いて承認するだけです。

  • Muse側で参加を開始すると、承認用リンクが表示される
  • Tailscaleの管理画面で、デバイス名 muse を承認する
  • 承認が終わると自動的に接続が完了し、tailscale status でデバイス一覧に muse が現れる

この時点で、tailnet上の全デバイスがMuseから「見える」状態になります。ただし見えることと到達できることは別で、実際のTCP接続は対象デバイスごとに承認が求められる仕様でした。いきなり全開放にはならないのは安心材料です。

手順2: NanoPiのSSH到達確認

次にNanoPi R6Sへの到達を確認しました。ここで1つ注意点があります。MuseのVMからtailnetへの通信は、通常のネットワーク経路では届きません。ランタイムのプロキシのポートをTailscale用(3130)に切り替えて、そのプロキシ越しにTCP接続する必要があります。

  • ICMP(ping)はトンネルを通らないので、疎通確認には使えない
  • TCP接続が通るかどうかが唯一の判定材料

SSHのバナーを取得すると、NanoPiからは通常のUbuntuのOpenSSHが応答しました。

SSH-2.0-OpenSSH_9.6p1 Ubuntu

認証方式は publickey,password の2つ。Tailscale SSH(tailscaled内蔵のSSH)ではなく素のOpenSSHだったので、認証は通常のSSHの流儀で用意することになります。

手順3: 公開鍵を登録してログインする

パスワードは共有したくなかったので、Museの公開鍵(ed25519)をNanoPiの ~/.ssh/authorized_keys に登録しました。NanoPiに普段の方法でログインし、SSHさせたいユーザーで次を実行します。

mkdir -p ~/.ssh && echo 'ssh-ed25519 <Museの公開鍵> hatch' >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

登録後、Muse側から鍵認証のみ(BatchMode)でログインできることを確認しました。

$ whoami; hostname
kawai
NanoPi-R6S

NanoPiの素性はこんな感じです。

項目 値
OS Ubuntu 24.04.5 LTS(aarch64、カーネル 6.1.141)
CPU / メモリ 8コア / 7.7GiB
ルートディスク 25GB(使用率 52%)
稼働時間 約8日16時間(確認時点)

SSHの接続方法(プロキシ経由のProxyCommandなど)はClaude側でスクリプト化したので、次回からは「NanoPiで〜して」と頼むだけで同じ経路で入れるようになりました。

手順4: NanoPiからProxmoxへ多段SSH

NanoPiに入れたら、あとはLAN内の通常のSSHです。NanoPiの kawai ユーザーの鍵で、Proxmoxノードの root にログインできました。もともと自宅内の運用で使っていた鍵がそのまま通りました。

# NanoPi上で実行
$ ssh [email protected] 'whoami; hostname'
root
pve

これで Muse →(tailnet)→ NanoPi →(LAN)→ Proxmox の多段SSHが成立です。Proxmoxに入れれば pct exec で各LXCコンテナにも届くので、メールサーバーやこのブログのコンテナまで、理論上は全てエージェントの作業範囲に入ります。

動作確認の結果

Proxmoxノードの状態も読み取りだけ確認しました。

項目 値
バージョン Proxmox VE 9.2.26(カーネル 7.0.14-6-pve)
稼働時間 104日
CPU / メモリ 4コア / 31GiB(使用 5.9GiB)
VM QEMU VMはなし
コンテナ LXC 11個が全て running(mail、tv、tunnel、tailscale、audiobooks、emby、takezou.com、land189、gitea、carpal-backend、nas)
ストレージ local-lvm 約3.7TB(使用率 62%)、local 12%

ついでに気づいたこととして、ストレージの backup と iodata が inactive 表示でした。これは今回の作業とは別に、あとで確認する宿題にしています。

運用の注意点(ハマりどころ含む)

  • NanoPiのTailscaleは「入るときにON」ならよい:NanoPi側のtailscaledはsystemdで enabled + active になっていて、再起動しても自動でtailnetに復帰します。常時起動が前提のマシンなので、普段は意識する必要はありません。逆に tailscale down している間や電源が落ちている間は、Museからは一切届かなくなります

  • デバイス鍵の有効期限(180日):Tailscaleのデバイス鍵には既定で180日の有効期限があります。期限が切れると再認証が必要になりますが、NanoPiはヘッドレスで、しかも再認証の経路自体がtailnetなので、切れた瞬間に詰みます。管理コンソールの Machines → nanopi-r6s →「…」→ Disable key expiry で無効化しておくのが安全です。ただし、鍵が自動で入れ替わる安全側の仕組みを外すことにもなるので、持ち歩くノートPCやスマホではなく、こうした常設サーバーに限るのがよいと思います。Muse側のデバイス(muse)も同じ日に参加したので同じ期限です

  • 到達確認はTCPで:前述のとおりpingは通りません。「pingが返らない=落ちている」ではないので、切り分けのときに誤診しないよう注意です(監視の誤診についてはメールサーバーの記事でもやらかしています)

  • 権限の範囲:Museに渡したのは「NanoPiの一般ユーザー」と「その先のProxmox root」です。特に後者は強い権限なので、エージェントに任せる作業は当面、状態確認や調査などの読み取り中心にして、変更を伴う操作は都度確認しながら進める運用にします

まとめ

  • Museはtailnetに専用ノードとして参加でき、接続は Muse → 自宅 の一方向のみ。ポート開放なしで自宅サーバーへの到達経路が作れた
  • 認証は公開鍵のみで、パスワードの共有は不要だった
  • NanoPiを踏み台にした多段SSHでProxmoxのrootまで到達でき、pct exec 経由でLXC群も作業範囲に入った
  • つまずきどころは「pingが通らない」「デバイス鍵の180日有効期限」の2つ。特に有効期限は、切れてからでは手遅れなので先に無効化しておく

これで、次からはチャットで「Proxmoxの様子を見て」と頼むだけで、エージェントが自分でログインして確認してくれるようになりました。次は、この経路を使って定型の状態レポートを定期的に出させるところまで進める予定です。

同じように自宅サーバーをAIエージェントに触らせたい方の参考になれば幸いです。

広告

この記事をシェア

この記事を書いた人: たけぞう

熊谷に住みながら都内のIT企業でエンジニアをしています。このブログでは、実際に使い込んだガジェットやアウトドア用品をエンジニアの視点でレビュー。良い点も気になる点も正直にお伝えするので、モノ選びの参考にしていただければ嬉しいです。 趣味はスポーツジムでのトレーニングとジョギング。ランニングギアやトレーニング関連のアイテムも、実際に使った印象をレビューしていきます。