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エージェントに触らせたい方の参考になれば幸いです。



