Tailscaleで自宅サーバーに外から安全にアクセスする
自宅サーバーに外出先からアクセスするために、ルーターのポート開放をせずに済むTailscaleを導入した記録です。テールネットの仕組み、サーバーと手元の端末への導入手順、マジックDNS、Tailscale経由のSSH、serveとFunnelの使い分け、UFWを自宅LANとTailscaleの帯だけに絞る設定までまとめました。
目次
- はじめに
- ふつうに「外部公開」するのが怖い理由
- Tailscaleとは何か
- Tailscaleを使うと何が変わるか
- ステップ1:サーバーにTailscaleを入れる
- ステップ2:自分のスマホやパソコンにも入れる
- ステップ3:マジックDNSで「名前」でアクセスする
- Tailscale経由でSSHログインする(鍵の管理がいらない)
- serveとFunnel:普段使いは限定、外部公開は最小限
- ファイアウォール(UFW)と組み合わせる
- なぜルーターのポート開放(ポートフォワード)が要らないのか
- 個別設定で知っておくとよいこと
- Claude Codeへの指示書
- どうやってつながっているのか(仕組み)
- よくあるトラブルと対処
- まとめ
はじめに
自宅サーバーを作ってみたものの、「外出先からどうやって安全につなげばいいのか分からない」と困っていませんか。
家の中(自宅のネットワーク)からならサーバーに簡単につなげます。
ですが、外出先のスマホや、職場のパソコンから自宅のサーバーに触りたくなったとき、どうすればいいのか。
昔ながらのやり方だと、ルーターの設定をいじって、自宅サーバーの入り口をインターネットに向けて開ける必要があり、これがなかなか怖い作業です。
結論として、Tailscale(テールスケール)というツールを使ったら、この問題はあっさり解決しました。
難しいルーター設定も、インターネットへの入り口の開放もせずに、外出先からでも「まるで家の中にいるように」自宅サーバーへ安全につなげるようになりました。
この記事では、Tailscaleが怖い設定なしで外部アクセスを成り立たせている仕組みから、実際の導入手順、ファイアウォールとの組み合わせ方までを順番にご紹介します。
前提となるサーバーは、古いWindows機にUbuntuを入れて作った自宅サーバーです。
ファイアウォール(UFW)の設定もそちらで済ませてありますが、この記事はTailscale単体の話として読めるように書いています。
後半にはClaude Codeへの指示書も載せます。
ふつうに「外部公開」するのが怖い理由
まず、なぜ昔ながらのやり方が怖いのかを説明します。
自宅サーバーに外からつなげるようにする伝統的な方法は、ルーターで「ポート開放」という設定をして、サーバーの特定の入り口(ポート)をインターネットに向けて開ける、というものです。
ところがこれをやると、その入り口は世界中の誰からでも到達できる状態になります。
インターネットには、開いている入り口を四六時中探し回っている自動プログラム(ボット)がたくさんいます。
入り口を開けた瞬間から、見ず知らずの相手による接続の試みやログインの総当たりが延々と来る、というのが現実です。
設定を少しでも間違えると、サーバーの中身をのぞかれたり、乗っ取られたりする危険があります。
ファイアウォール(UFW)で入り口を絞っているのも、まさにこれを避けるためでした。
そこで、そもそも「インターネットに入り口を開けない」やり方として、Tailscaleを使います。
Tailscaleとは何か
Tailscaleは、自分の持っている端末だけを、インターネット越しに一つの「専用ネットワーク」でつないでくれるツールです。
技術的には「WireGuard(ワイヤーガード)」という、高速で安全なVPNの仕組みを土台にしていて、その面倒な設定(鍵の交換や経路の管理)を全部肩代わりして、ログインするだけで使えるようにしたものです。
自分のサーバー・スマホ・パソコン・タブレットに、それぞれTailscaleを入れて同じアカウントでログインすると、離れた場所にあっても、全部の端末が同じ家の中のネットワークにいるかのようにつながります。
この自分専用のネットワークのことを、Tailscaleでは「テールネット(tailnet)」と呼びます。
私の場合は、サーバー(Linux)・スマホ2台(Android)・ノートパソコン(Windows)を同じアカウントで入れて、1つのテールネットにしています。
もう少し中身を説明すると、Tailscaleはネットワーク全体を一台の中央サーバーに集めるのではなく、端末同士が網の目のように直接つながる「メッシュ型」のVPNです。
土台のWireGuardが各端末のあいだに暗号化したトンネルを張り、Tailscaleはその鍵交換と相手探しを自動でやってくれます。
テールネットに入った各端末には、CGNATと呼ばれる「インターネットには出回らない予約帯」(100.64 で始まる範囲。正確には 100.64.0.0/10 という幅を持つ標準的な共有アドレス帯)から、テールネット内だけで通じる固定のプライベートIPが1つずつ割り当てられます。
この番号は端末ごとに固定なので、IPアドレスでも端末を呼べますし、後述のマジックDNSを使えば名前でも呼べます。
ここがポイントなのですが、Tailscaleはインターネットに入り口を開けません。
あくまで「自分の端末同士」が、暗号化された通り道で直接つながるだけです。
さきほどの「世界中の誰からでも到達できる」状態とはまったく違い、招待していない他人は、そのネットワークの存在にすら気づけません。
ルーターのポート開放も不要です。
Tailscaleを使うと何が変わるか
導入すると、こんなことができるようになります。
- 外出先からサーバーにアクセスできる:外にいても、家の中にいるのと同じ感覚でサーバーの画面やファイルに触れます。
- ルーター設定が要らない:怖いポート開放をしなくて済みます。
- つなぐ相手を自分の端末に限定できる:テールネットに入っているのは自分の端末だけです。
- 分かりやすい名前でアクセスできる:「マジックDNS」という機能で、番号の住所を覚えなくても、端末に付けた名前でアクセスできます。
ステップ1:サーバーにTailscaleを入れる
まずは自宅サーバーにTailscaleを入れます。
SSHでサーバーに入った状態で、公式のインストール用コマンドを1行実行します。
curl -fsSL https://tailscale.com/install.sh | sh
これでTailscale本体(私の環境では1.9系のバージョン)が入ります。
続けて、起動して自分のアカウントでログインします。
sudo tailscale up
このコマンドを実行すると、画面に承認用のリンク(URL)が表示されます。
そのリンクを、パソコンやスマホのブラウザで開いて、Tailscaleのアカウントでログイン・承認します(アカウントは、GoogleやGitHubなどのログインを使って無料で作れます)。
承認が済むと、このサーバーが自分のテールネットの一員になります。
ちゃんとつながったかどうかは、次のコマンドで確認できます。
tailscale status
これを実行すると、いま自分のテールネットに入っている端末の一覧が表示されます。
まずはサーバー自身、続いて後で追加するスマホやパソコンがここに並べば成功です。
ステップ2:自分のスマホやパソコンにも入れる
次に、ふだん使うスマホやパソコンにも、それぞれTailscaleのアプリやソフトをインストールして、サーバーのときと同じアカウントでログインします。
スマホはアプリストアから、パソコンは公式サイトから入れられます。
これで、サーバー・スマホ・パソコンが、全部同じテールネットに入った状態になります。
同じアカウントでログインするだけなので、難しくありません。
どの端末を入れるかはアカウント単位で自由に決められます。
ステップ3:マジックDNSで「名前」でアクセスする
Tailscaleは、各端末にテールネット内だけで通じる住所(IPアドレス)を割り当てます。
ただ番号を覚えるのは面倒なので、「マジックDNS(MagicDNS)」という機能をオンにして、サーバーに付けた分かりやすい名前でアクセスできるようにします。
設定は、Tailscaleの管理コンソール(ブラウザで login.tailscale.com を開きます)から行います。
- ブラウザで管理コンソールにログインする
- 上部のメニューから「DNS」の設定ページを開く
- 「MagicDNS」の項目をオンにする
あわせて、端末の一覧(Machines)の画面で、サーバーに分かりやすい名前を付けておきましょう(この記事では例として myserver とします)。
以後は、ブラウザのアドレス欄に myserver と打つだけで、そのサーバーにアクセスできます。
各サービスを開くときは、myserver:ポート番号 のように、名前のうしろにそのサービスのポート番号を付けて指定します。
このあと自宅サーバーに入れていく各サービスも、すべてこの形で外から安全に開けるようになります。
Tailscale経由でSSHログインする(鍵の管理がいらない)
ここまでで「ブラウザで外からアクセス」はできるようになりました。
あわせて、サーバーを操作するSSH(遠隔ログイン)も、Tailscale経由にしておくと便利です。
起動コマンドにオプションを1つ足すだけで有効にできます。
sudo tailscale up --ssh
こうしておくと、同じテールネットに入っている自分の端末から、鍵の準備をしなくてもサーバーにSSHでログインできます。
誰がログインできるかはTailscaleのアカウント(自分の端末かどうか)で管理されるので、パスワードや鍵を別途配って回る必要がありません。
外出先のパソコンやスマホからサーバーを操作したいときも、Tailscaleさえオンになっていれば、そのままつなげます。
serveとFunnel:普段使いは限定、外部公開は最小限
Tailscaleには、サービスの公開範囲を決める2つの仕組みがあります。
私はこの2つを使い分けているのですが、ここがこの構成の肝なので、少し詳しく説明します。

serve は、サーバーで動いているサービスを、テールネットの中だけに、https://(サーバー名)/… というきれいな安全な形で見せる仕組みです。
普段使いのサービス(たとえばスマホから使う自作Webアプリなど)は、これでテールネット限定にしておきます。
コマンドの形はおおむね次のようになります。
sudo tailscale serve --bg <ポート番号>
たとえばサーバーのある番号のポートで動いているアプリを指定すると、Tailscaleがそれを受け取って、テールネット内の端末に https://(サーバー名).(テールネットのドメイン)/ として見せてくれます。
ここで効いてくるのが、Tailscaleが自分のテールネット用に証明書を自動で用意してくれることです。
自分でHTTPSの証明書を取りに行かなくても、テールネット内のアクセスが最初から暗号化された https:// になります。
--bg は「バックグラウンドで動かし続ける」指定で、これを付けないとコマンドを閉じたときに公開が止まります。
Funnel(ファンネル)は、指定した一部のサービスだけを、インターネットへ公開する仕組みです。
コマンドは serve とほぼ同じ形で、serve を funnel に変えるイメージです。
sudo tailscale funnel --bg <ポート番号>
ポイントは、サーバー全体を開けるのではなく、「この入り口の、この機能だけ」とピンポイントで公開できることです。
serve が「テールネット内に見せる」のに対し、funnel は「同じ仕組みのまま、その一本だけをインターネット側にも開ける」という違いです。
私の場合は、ObsidianのノートをAIから読ませるMCPサーバーで、claude.aiのような外部サービスから届く必要があったので、そのMCPサーバーだけをFunnelで公開しています。
逆に言えば、それ以外は全部 serve(テールネット限定)のままにしてあります。
いま何をどちらで公開しているかは tailscale serve status で一覧して確認できます。
つまり、普段使いのアクセスは全部テールネット限定(serve)にしておき、外部公開がどうしても必要な一部だけをFunnelで開ける、という二段構えです。
「外に出すものは最小限」という原則を、仕組みのレベルで守れるのが安心なところです。
Funnelで公開する入り口には、あわせて合言葉(トークン)による制限も足して、二重に守っています。
ファイアウォール(UFW)と組み合わせる
ここがこの構成でいちばん効いてくるところです。
土台のサーバーを作った時点では、ファイアウォール(UFW)で、サーバーの管理用の入り口(SSHの22番、CasaOSの80番、各アプリのポートなど)を絞っていました。
Tailscaleを入れたことで、この絞り方を「自宅LANと、Tailscaleの端末から『だけ』通す」という形に一本化できます。
具体的には、UFWの許可を次のように2系統だけにします(SSHの22番を例にすると、こんなイメージです)。
sudo ufw allow from <自宅LANの範囲> to any port 22 proto tcp # 家の中から
sudo ufw allow from 100.64.0.0/10 to any port 22 proto tcp # Tailscaleの端末から
<自宅LANの範囲> はサーバーを作ったときに調べた自宅ネットワークの範囲、100.64.0.0/10 はTailscaleが各端末に割り当てる専用アドレスの帯(さきほど触れたCGNATの予約帯。100.64 で始まる /10 の範囲で、Tailscaleの管理画面やドキュメントでも確認できます)です。
CasaOSの80番や各アプリのポートも、同じようにこの2系統からだけ許可します。
ここが設計のキモなのですが、こうしておくとインターネット側(不特定多数)に開いている管理ポートはゼロになります。
外から自宅サーバーを触るときは、必ずTailscaleをオンにして、割り当てられたプライベートIP(あるいは名前)経由でアクセスすることになるので、UFWの許可も「Tailscaleの帯から来たものだけ」で済みます。
Tailscaleを入れる前は「外部公開はしないが、もし開けるなら怖い」という状態でしたが、Tailscaleを土台にすることで、そもそも外部に開ける必要そのものが消えるわけです。
なぜルーターのポート開放(ポートフォワード)が要らないのか
昔ながらのやり方では、外から自宅サーバーに届かせるために、家のルーターで「ポートフォワード(特定の番号宛ての通信を、サーバーに転送する)」を設定していました。
これは、家の玄関(ルーター)に外向きの穴を開ける作業です。
Tailscaleでこれが要らなくなる理由は、接続を「外から中へ」ではなく「中から外へ」張るからです。
サーバーは起動すると、自分からTailscaleの仲介役(後述のコーディネーションサーバー)へ「自分はここにいる」と外向きに接続を出します。
これは、ふだんパソコンがWebサイトを見に行くのと同じ向きの通信なので、ルーターは何の設定もなしに通します。
外出先の端末も同じように外向きに接続を出し、両者が仲介役を介してお互いの居場所を知った上で、直接つながり合う仕組みです。
どちらの端末も「自分から外へ出ていく」だけなので、家のルーターに着信用の穴(ポートフォワード)を一切開けずに済みます。
穴がないということは、そこを狙った総当たりも成立しません。
これが、Tailscaleがポート開放なしで外部アクセスを成り立たせている核心です。
個別設定で知っておくとよいこと
実際に運用してみて「最初にやっておくとよかった」と感じた設定をいくつか紹介します。
どれも管理コンソールから設定できます。
- サーバーは「キーの有効期限」を切っておく:Tailscaleは安全のために、各端末のログインに有効期限を設けています。ずっと動かしっぱなしのサーバーでこれが切れると、ある日突然外からつながらなくなって慌てます。管理コンソールの端末一覧から、サーバーだけ「キーの有効期限を無効にする(Disable key expiry)」にしておくと安心です。普段持ち歩くスマホやパソコンは、有効期限はそのままで問題ないです。
- 端末に分かりやすい名前を付ける:それぞれの端末に「自宅サーバー」「自分のスマホ」のような名前を付けておくと、一覧が見やすくなり、マジックDNSでのアクセスも楽になります。
- 使わなくなった端末は無効にできる:機種変更などで使わなくなった端末は、管理コンソールから削除・無効化できます。テールネットに入れる端末を自分で管理できます。
Claude Codeへの指示書
ここまでの構築を実際にやってもらうための、サーバーに入れたClaude Codeへの指示書です。
これを渡せば、サーバー側の導入を進めてくれます。
スマホやパソコン側のアプリ導入は、最後に自分で行います。
あなたはこのUbuntuサーバーの構築を手伝うエンジニアです。
私は非エンジニアなので、専門用語は噛み砕いて、操作の前には何をするか一言説明してください。
目的:Tailscaleを使って、外出先からでも自宅サーバーに安全にアクセスできるようにしたい。
インターネットへのポート開放はしたくない。
次の手順で進めてください。
1. このサーバーにTailscaleをインストールして起動し、私がログイン承認する手順を案内してほしい。
Tailscale経由のSSH(--ssh)も有効にしたい。
2. ログイン後、このサーバーが専用ネットワークに入れたかを確認する方法を教えてほしい。
3. マジックDNS(分かりやすい名前でのアクセス)が使えるようにしたい。
4. 普段使いはテールネット内に限定(serve)し、外部公開が要るものだけFunnelで開ける方針にしたい。
5. ファイアウォール(UFW)を見直して、SSH(22)・CasaOS(80)・各アプリの管理ポートを、
自宅LANの範囲とTailscaleの帯(CGNATの予約帯。100.64で始まる/10の範囲)からだけ
許可する形にしてほしい。インターネット側(不特定多数)に開く管理ポートは無くしたい。
各ステップで、何をしたか・次に私が手元の端末で何をすればいいかを説明してください。
「ポート開放はしたくない」「外部に開ける入り口は最小限に」という方針を最初に伝えておくのがコツです。
どうやってつながっているのか(仕組み)
少し技術的な話になりますが、なぜポート開放なしで外からつながるのかを説明しておきます。
Tailscaleには、各端末の「居場所」を仲介するコーディネーションサーバーがあります。
端末はそこに「自分はいまここにいる」と登録し、つなぎたい相手の居場所を教えてもらいます。
このやり取りで相手が分かると、あとは端末同士が直接、暗号化した通り道(WireGuard)でつながります。
データそのものはコーディネーションサーバーを通らないので、中身を会社に見られることもありません。
家の外の端末と家の中のサーバーは、ふつうルーターに阻まれて直接つながれませんが、Tailscaleは「NAT越え」という技術で、両側から同時に通信を試みて穴を通します。
それでも直接つながれない厳しいネットワークのときは、リレー(DERPと呼ばれる中継地点)を経由して、暗号化したまま橋渡しします。
直接つながれるときは直接、無理なときはリレー経由、と自動で切り替わるので、利用する側は何も意識しなくて大丈夫です。
要するに、「外向けの入り口を開ける」のではなく、「内側から外へ出ていって、自分の端末同士だけで合流する」やり方なので、見知らぬ他人が入り込む余地がない、というわけです。
よくあるトラブルと対処
つまずきやすい点をQ&Aでまとめておきます。
Q. ログインの承認がうまくいかない
サーバーとスマホ・パソコンが、すべて同じアカウントでログインできているかを確認してください。
違うアカウントだと、同じテールネットに入れません。
承認用のリンクは、ふだん使っているブラウザで開くと進めやすいです。
Q. 外出先からサーバーにつながらない
まず、つなぐ側の端末(スマホなど)でTailscaleがオンになっているかを確認します。
スマホアプリは、いつのまにかオフになっていることがあります。
サーバー側は tailscale status で状態を確認できます。
Q. 職場や外出先の厳しいネットワークからつながらない
直接つながれない環境でも、上で説明したリレー経由で自動的につなごうとします。
つながるまで少し時間がかかることがあるので、慌てずに少し待ってみてください。
Q. しばらく使わなかったらサーバーにつながらなくなった
サーバーのキーの有効期限が切れた可能性があります。
上の個別設定で、サーバーだけ有効期限を無効にしておくと防げます。
Q. 家の中(自宅LAN)からはアプリが開けるのに、外出先からだけ開けない
管理ポートをUFWで「自宅LANとTailscaleの帯から」許可しているか確認してください。
自宅LANの行しか入れていないと、家の中(自宅LANのIPで来る)からは開けても、外出先(Tailscaleの帯のIPで来る)からははじかれます。
上のUFWの2行のうち、Tailscaleの帯からの許可が抜けていないかを見直すと直ることが多いです。
Q. tailscale serve で見せたはずのアプリが、テールネットの他の端末から開けない
serve は「サーバーのどのポートを公開するか」を指定します。
アプリ側がサーバー内部のそのポートで実際に動いているか(docker ps でポートを確認)、tailscale serve status で意図したポートが割り当たっているかを確認してください。
指定ポートと実際の待ち受けポートが食い違っていると、つながりません。
まとめ
いかがでしたか。
今回は、自宅サーバーに外出先から安全にアクセスするためのTailscaleを紹介しました。
振り返ると、
- 伝統的なポート開放は、世界中に入り口をさらすので怖い
- TailscaleはWireGuardを土台に、自分の端末だけをテールネットでつなぐ
- サーバーと自分の端末に入れて同じアカウントでログインし、マジックDNSで名前アクセスする
- 普段使いは
serveでテールネット限定、外部公開はFunnelで最小限、という二段構えにする - UFWの許可を「自宅LANとTailscaleの帯から」の2系統に絞り、インターネットに開く管理ポートを無くす
- 接続は「内側から外へ」張るので、ルーターのポート開放(ポートフォワード)が要らない
という内容でした。
怖いネットワーク設定をせずに、安全と便利さを両立できるので、自宅サーバーを作るなら早めに入れておくのがおすすめです。
ここまで済ませておくと、あとは自宅サーバーにサービスを足していくだけです。
私はこの土台の上に、有料のObsidian Syncを置き換えるSyncthingから順に、いろいろなものを載せていきました。
この記事が誰かの役に立てばうれしいです。