外出先から自宅PCにつなぎたいが、ルーターのポート開放はしたくない
自宅の母艦デスクトップPCに、外出先からノートPC経由でリモートデスクトップ(RDP)でつなぎたい場面が増えてきた。昔ながらのやり方だと、ルーターのポートを開放してRDP(3389番)を外部に晒す方法があるが、これはセキュリティ的に論外である。インターネットに向けて空けたポートは数時間もあれば総当たり攻撃の標的になる。
さらにうちの場合、マンションでグローバルIPが他の住戸と共用になっている(いわゆるCGNAT環境)。私は無知なだけかもしれないが、こういう環境では固定のグローバルIPを持てないので、DDNS(ドメイン名で動的なIPを追いかける仕組み)を使っても、そもそも自宅のルーターに外から到達できないと思い込んでいた。専用のVPNルーターを組んだり証明書を発行して回ったりするのも面倒だし、この時点で半分あきらめかけていた。
そこで今回、Tailscaleというサービスを使って、ルーターのポートを一切開けずに、しかも無料で、自宅デスクトップPCとノートPCを安全に直結する環境を作った。実装のほとんどはClaude Codeに任せたが、管理者権限が必要な操作や、どこまでを信頼する設計にするかという判断は自分で確認しながら進めた。この記事ではその全体像を、構成図・実際の設定画面・実行したコマンドつきでまとめる。Claude Codeがなくても、この記事の手順をなぞれば同じ環境を作れるはずだ。
Tailscaleとは何か
Tailscaleは、米Tailscale Inc.が開発しているサービスで、WireGuardという実績のある暗号化VPNプロトコルをベースにした「メッシュVPN」だ。普通にWireGuardを自前で構築しようとすると、端末ごとの鍵の生成・配布、NAT越えのための経路調整、デバイスが増減するたびの設定変更など、地味に面倒な作業が積み重なる。Tailscaleはこの面倒な部分をまるごと肩代わりしてくれる。
やることは非常にシンプルで、各端末にTailscaleのアプリを入れて、同じアカウントでログインするだけだ。それだけで端末同士が自動的に暗号化されたプライベートネットワーク(Tailscaleは「tailnet」と呼んでいる)に参加し、まるで同じLANにいるかのように直接通信できるようになる。ルーターの設定は一切触らない。
Tailscale社が運営するコーディネーションサーバーは、各端末の公開鍵とNAT越えに必要な接続情報を、常時管理し続けている。ただし、これはあくまで「誰が誰にどうやって到達できるか」という情報のやり取りであって、実際の画面転送やファイルのやり取りといった中身のデータはコーディネーションサーバーを経由しない。端末同士が直接つながる場合はP2Pで、直接つながらない場合は後述するリレーサーバー経由で流れる。
冒頭で書いたグローバルIP共用の問題も、Tailscaleでは気にする必要がなかった。端末同士が直接つながらない場合(まさにうちのようなCGNAT環境)は、Tailscaleが用意しているリレーサーバーを自動的に経由して接続してくれる。DDNSの設定もポート開放も不要で、ルーターの前段がどうなっているかを意識しなくていい。集合住宅などでグローバルIPを他の住戸と共用している人でも、そのまま使える。
同じ系統のツールとの違い
似た立ち位置のツールにOpenVPNやZeroTierがある。OpenVPNは証明書の発行やサーバー側のルーティング設定を自分で組む必要があり、2026年に新規でVPN環境を作るなら正直あまり選ばれない。ZeroTierは仮想的なLANスイッチを作るような仕組みで柔軟性は高いが、独自プロトコルを使っている。Tailscaleは標準のWireGuardプロトコルをそのまま使っているぶん、暗号化方式自体の検証がしやすく、そのうえで「ゼロコンフィグ」を徹底しているのが強みだ。実際に使ってみても、設定項目の少なさは頭ひとつ抜けている印象がある。
料金面では、個人利用なら無料のPersonalプランで十分。クレジットカードの登録も不要で、期限なく使い続けられる(プラン内容は変わる可能性があるので、最新情報は公式サイトを確認してほしい)。自宅サーバーや複数PC間の接続程度であれば、まず無料プランで試して困らない。
全体構成: 3つの層
今回作った環境は、役割の異なる3つの層が重なっている。壊れたときにどこが原因かを切り分けやすいよう、意識して分けて考えるようにした。

- 経路 — Tailscale: WireGuardによる端末間の直接接続。ルーターのポート開放は不要で、実際に1つも開けていない。3389番をインターネットに晒す必要がそもそもないので、外部からの総当たり攻撃の的にならない。MagicDNSという仕組みで、IPアドレスを覚えなくても分かりやすい名前で端末に到達できる。
- 画面 — Windowsリモートデスクトップ: 実際にPCを操作する本体。ここがメインで、以下の手順もまずこれを完成させることを目標にする。
- ターミナル — OpenSSH Server(任意): 入れておくとコマンド操作もできて便利だが、必須ではない。詳しくは手順の最後に補足として書く。
Tailscaleが提供しているのはあくまで「経路」の部分で、実際に画面を映す機能自体はWindows標準のRDPがそのまま担っている。Tailscaleは「安全な土管を1本引く」役割に徹していると考えるとわかりやすい。
導入手順(RDP編)
1. 両方の端末にTailscaleを入れる
デスクトップPC・ノートPCの両方に公式サイトからインストーラーを落として実行し、同じアカウント(GoogleアカウントやMicrosoftアカウントなど)でログインするだけだ。特別な設定はほぼ不要で、ログインした瞬間にその端末がtailnetに参加する。
2. デバイス承認を有効にする
Tailscaleの管理コンソールで「Device Approval(デバイス承認)」を有効にしておくと、新しいデバイスがtailnetに参加する際に管理者の承認が必須になる。アカウント自体が乗っ取られた場合の保険として、この設定は入れておくことを強くすすめる。

3. デスクトップPC側でRDPを有効にする
「設定」→「システム」→「リモートデスクトップ」からオンにするだけだ。この操作にはWindowsの管理者権限が必要になる。なお、リモートデスクトップをホスト(接続を受ける側)にできるのはWindows 11 Pro以上で、Home版にはこの設定項目自体が存在しない。デスクトップPC側がHome版の場合は、この方法は使えない。
あわせて、同じ画面の「詳細設定」からネットワークレベル認証(NLA)が有効になっていることを確認しておく。既定でオンになっているはずだが、これは接続開始前の段階で認証を要求する仕組みで、認証前の攻撃面を減らせる。
4. デスクトップPC側の鍵の有効期限を無効化する
初期設定のままだと、Tailscaleの鍵には有効期限(既定で180日)があり、切れると再認証が必要になる。ノートPCのように手元にある端末なら、切れたときにその場で再認証すればいいだけだが、常に自宅に置きっぱなしの母艦デスクトップPCでこれをやられると、外出先から突然つながらなくなって詰む。そこでTailscaleの管理コンソール(Machinesタブ)を開き、母艦側のデバイスの行にある「…」メニューから「Disable key expiry」を選んで、有効期限を無効化しておいた。
ただし当然トレードオフがある。無効化すると、そのデバイスの鍵は無期限に有効になる。母艦を紛失したり侵害されたりした場合、鍵を手動で失効させるまでその状態が続く。自宅に据え置いたまま持ち出さない端末だから許容できる判断であって、ノートPCのように持ち歩く端末には向かない設定だと思う。
実際につなぐ(RDP)
ここまで設定できれば、ノートPC側でTailscaleが起動していることを確認したうえで、通常のRDPクライアントからそのまま接続できる。
mstscを起動し、コンピューター名にTailscaleのMagicDNS名を入力する (例: desktop-pc.your-tailnet-name.ts.net)
MagicDNSが有効になっていれば、覚えにくいTailscale IP(100.x.x.xという特殊なレンジのアドレスが割り当てられる)を意識しなくても、わかりやすいホスト名で到達できる。同じLAN内にいれば数msで直結し、外出先など経路が直接張れない場合はTailscale側のリレーサーバーを自動的に経由してくれる。どちらの場合でもRDPの体感速度に大きな違いは感じなかった。
補足: SSHでのターミナルアクセス(任意)
RDPだけでも目的は達成できるが、私はコマンド操作もしたかったのと、万が一RDPの調子が悪いときの保険としてSSHも入れておいた。ここは必須ではないので、コマンド操作をしないなら読み飛ばしてもらって構わない。
管理者権限で開いたターミナルから、次のコマンドでOpenSSH Serverをインストール・起動・自動起動設定する。
# OpenSSH Serverのインストール Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # サービスを起動し、自動起動に設定 Start-Service sshd Set-Service -Name sshd -StartupType Automatic
ここで一つ、実際にハマった落とし穴があった。ホストキー(C:\ProgramData\ssh\ssh_host_*_key)の所有者が一般ユーザーのままになっていると、サービスが起動直後に落ちる(終了コード1067)。所有者とアクセス権をSYSTEMとAdministratorsだけに揃える必要がある。なお下のコマンド中のS-1-5-32-544とS-1-5-18は、それぞれ「Administratorsグループ」「SYSTEM」を指すWindows共通の識別子で、環境ごとに変わる値ではない。
Get-ChildItem C:\ProgramData\ssh\ssh_host_*_key | ForEach-Object {
icacls $_.FullName /setowner "*S-1-5-32-544"
icacls $_.FullName /inheritance:r /grant "*S-1-5-18:F" /grant "*S-1-5-32-544:F"
}
Start-Service sshd
ノートPC側で鍵ペアを作る
まだSSHの鍵を持っていなければ、ノートPC側で鍵ペアを生成する。パスフレーズは空でも動くが、ノートPCを紛失したときのリスクを考えると付けておいた方がいい。
ssh-keygen -t ed25519 -f ~/.ssh/laptop_ed25519
生成される2つのファイルのうち、laptop_ed25519.pub(公開鍵)の中身をデスクトップPC側に持っていく必要がある。この段階ではまだSSHでの接続が使えないので、RDPで開いた画面にコピペするか、USBメモリなどで運んで、次の手順のadministrators_authorized_keysに貼り付ける。laptop_ed25519(拡張子なしの方、秘密鍵)はノートPCの外に出してはいけない。
公開鍵を登録する
ログインユーザーがAdministrators権限を持っている場合、公開鍵の置き場所は通常の~/.ssh/authorized_keysではなくC:\ProgramData\ssh\administrators_authorized_keysになる。先ほどの公開鍵の中身をこのファイルに追記したうえで、所有者をAdministratorsに、アクセス権をSYSTEMとAdministratorsだけに絞っておかないと、鍵を置いても無言で認証が効かない。
$p = 'C:\ProgramData\ssh\administrators_authorized_keys' icacls $p /setowner "*S-1-5-32-544" icacls $p /inheritance:r /grant "*S-1-5-18:F" /grant "*S-1-5-32-544:F"
ノートPC側のconfigを整える
接続のたびにホスト名・ユーザー名・鍵のパスをフルで打つのは面倒なので、ノートPC側の~/.ssh/configにエイリアスを作っておく。
Host pc
HostName desktop-pc.your-tailnet-name.ts.net
User user
IdentityFile ~/.ssh/laptop_ed25519
これで、公開鍵認証によりパスワードなしで接続できる。
ssh pc
セキュリティ: どのくらい堅牢で、どこは割り切るべきか
便利さの裏で「実際どのくらい安全なのか、逆にどこは割り切って使っているのか」は把握しておいた方がいい。整理すると3つの層がある。
- 通信内容: 十分に堅牢。WireGuardによる端末間の暗号化そのもの。Tailscale社は通信内容を復号できる鍵を持たず、リレーサーバーを経由する場合でも暗号化されたまま素通しするだけ。ここは特に割り切る必要のない部分だ。
- 鍵の配布: 一定の割り切りが必要。どの公開鍵がどのデバイスのものかという対応表は、Tailscale社のコーディネーションサーバーが管理している。同社が侵害されれば理論上は成立してしまう攻撃はあるが、個人利用でそこまで対策するのはやりすぎだと判断し、ここはTailscale社を信頼する前提で割り切ることにした。
- 認証: 一番弱く、対策が必須。TailscaleへのログインをGoogleアカウントなどの外部IDプロバイダーに委ねているため、そのアカウントが乗っ取られると、攻撃者が自分の端末をtailnetに参加させて母艦に到達できてしまう。VPN自体の暗号強度とは無関係に突破される経路なので、ここだけは割り切らず、2要素認証を必ず掛けておくべきだと思う。
この「認証」の弱さを補う保険として効いているのが、先ほど設定したDevice Approvalだ。仮にアカウントを乗っ取られても、攻撃者の端末は承認待ちの状態で止まり、母艦には到達できない。
Tailscaleでのリモートアクセスのメリット・デメリットをまとめてみた
メリット
- ルーターのポートを一切開けずに済むので、外部からの総当たり攻撃を受ける入口自体が存在しない
- マンションなどグローバルIPが共用の環境でも、DDNSやポート開放なしでそのまま使える
- 設定項目が驚くほど少なく、アプリを入れてログインするだけで環境ができあがる
- MagicDNSのおかげで、IPアドレスを意識せず分かりやすい名前で端末にアクセスできる
- 個人利用なら無料で、期限を気にせず使い続けられる
デメリット・課題
- 認証を外部アカウントに委ねる設計上、そのアカウントの管理がそのままセキュリティの生命線になる
- Tailscale社の鍵配布サーバーという「第三者」を一定程度信頼する必要がある(気になる場合はTailnet Lockという追加の対策もあるが、個人利用ではやや過剰)
- 母艦側の鍵の有効期限を無効化する場合、その端末の鍵は無期限に有効になり続ける。据え置き専用機だから許容できる判断で、持ち歩く端末には向かない
実装はClaude Codeにほぼ丸投げできた
ここまでの設定作業――OpenSSH Serverのインストール、権限まわりのトラブルシューティング、コマンドの組み立て――は、ほとんどをClaude Codeに指示して進めてもらった。「TailscaleでRDPをつなげたい、こういう構成にしたい」と伝えるだけで、具体的なコマンドを組み立てて実行し、エラーが出れば原因を調べて次の一手を提案してくれる。
ただし2点、自分で意識しておくべきことがあった。
- 管理者権限が必要: サービスの起動やファイルの所有者変更など、Windowsの管理者権限がないと実行できない操作が多く出てくる。Claude Codeを動かしているターミナル自体を管理者権限で起動しておく必要があった。これはPowerShellに限った話ではなく、コマンドプロンプトでもVSCodeの統合ターミナルでも同じで、要は「そのターミナル(プロセス)を管理者として起動しているかどうか」がすべてになる。VSCodeを使う場合は、VSCode自体を管理者として起動すれば、その中の統合ターミナルも管理者権限を引き継ぐ。
- 設計判断は自分で確認する: 「Device Approvalを有効にするか」「認証層としてどこまで外部アカウントを信頼するか」「鍵の有効期限を無効化するか」といった、セキュリティの根幹に関わる判断は、提案をそのまま受け入れるのではなく、自分で意味を理解した上で決めるようにした。実装を任せることと、何が起きているか理解しないまま公開範囲を広げることは別の話だと思う。
丸投げできる部分と、自分で判断すべき部分を分けて考えれば、ネットワークやWindowsのサービス管理に詳しくなくても、この規模の環境構築は十分に一人で完結できると感じた。
まとめ
ルーターのポートを一切開けずに、しかも無料で、自宅PCへ外出先から安全にアクセスできる環境ができた。グローバルIPが共用のマンションだから無理だろうと思い込んでいた分、設定の手軽さは想像以上だった。ただし便利さと引き換えに、認証周りの管理(2要素認証、Device Approval)だけは手を抜かないようにしたい。


コメント