Tailscale Funnel使い方|ポート開放なしで外部公開

Tailscale Funnel使い方|ポート開放なしで外部公開 アイキャッチ画像 AI自動化




「自宅のMac miniで動かしてるn8nやWebアプリ、外からアクセスできないかな…」と思ったこと、ありませんか?

ルーターのポート開放は設定が面倒だし、プロバイダーによっては固定IPが取れないこともあります。そんな悩みをシンプルに解決するのが、Tailscale Funnelです。

結論、TailscaleをインストールしてコマンドひとつでOK。自宅サーバーで動いているサービスを、インターネット上の誰でもアクセスできるURLで公開できます。

初めてTailscaleを触る方は基本編から、すでに使っている方は応用編からどうぞ。

この記事では、Funnelの仕組みから設定手順、実運用のコツまで解説します。

Tailscale Funnelとは?30秒でわかる仕組み

Tailscale Funnelは、ポート開放なしでローカルサービスをインターネットに公開できる機能です。

通常、自宅サーバーのサービスを外部公開するには「ポート開放」が必要です。ルーターの管理画面に入り、ポート番号を設定して…という作業は、初心者にはハードルが高いですよね。

Tailscale Funnelはこの問題を、暗号化されたリレーサーバーを経由することで解決します。

【Funnelの通信の流れ】

  1. あなたのデバイスに yourname.tailnet-name.ts.net という固定URLが割り当てられる
  2. インターネットからのアクセスは、TailscaleのリレーサーバーがDNSで受け取る
  3. リレーサーバーが暗号化トンネルを通じてあなたのデバイスに転送
  4. ローカルで動いているサービスがレスポンスを返す

大事なポイントは、リレーサーバーは通信を復号しないという点です。エンドツーエンドで暗号化されているので、外部への通信も安全に保たれます。

Tailscale ServeとFunnelの違い

Tailscaleには「Serve」という似た機能もあります。違いはこうです。

機能 アクセスできる人
Tailscale Serve 自分のtailnet(VPN)メンバーのみ
Tailscale Funnel インターネット上の誰でも

社内ツールや個人利用なら Serve、Webhookの受け口や外部に公開したいサービスには Funnel が向いています。

Funnelを使う前に確認すること

設定に入る前に、3つだけ確認してください。

① Tailscaleがインストールされていること

Tailscale v1.38.3以降が必要です。まだインストールしていない方は、Tailscale公式サイトからダウンロードできます。インストール自体は無料で、個人利用なら月0円のPersonalプランで使えます。

② MagicDNSが有効になっていること

Tailscaleの管理コンソール(login.tailscale.com)にアクセスして、「DNS」タブで「MagicDNS」がオンになっているか確認してください。これがオフだとFunnelのURLが生成されません。

③ macOSの場合はCLI版を使うこと

macOSでApp Store版のTailscaleを使っている方は注意が必要です。公式ドキュメントによると、macOSのApp Store版ではFunnelが使えない場合があります。Tailscaleの公式サイトからダウンロードできるオープンソース版(pkgインストーラー)を使いましょう。

【基本編】3ステップでFunnelを有効化する

実際に設定してみます。ここでは「ローカルのポート3000で動いているサービスを外部公開する」ことを例にします。

ステップ1:ローカルサービスを起動する

まず、公開したいサービスがローカルで動いていることを確認してください。

たとえばn8nをDocker経由で動かしている場合、http://localhost:5678 のようなURLでアクセスできる状態にします。Pythonのシンプルなテストサーバーを使う場合は下記のように起動できます。

# Pythonのテスト用HTTPサーバー(ポート3000で起動)
python3 -m http.server 3000

ステップ2:Funnelコマンドを実行する

ターミナルを開いて、以下のコマンドを実行します。

# ポート3000のサービスをFunnelで外部公開
tailscale funnel 3000

初回実行時は、ブラウザが自動で開いてtailnetのポリシーファイルの更新確認が表示されます。「承認する」をクリックすると、自動でFunnelが設定されます。

成功すると、以下のようなURLが表示されます。

https://your-device.tailnet-name.ts.net

このURLが、外部からアクセスできる公開URLです。

ステップ3:動作確認とFunnelの停止

表示されたURLをブラウザで開いて、ローカルサービスが見えれば成功です。

現在の状態を確認するコマンドは下記です。

# Funnelの現在の状態を確認
tailscale funnel status

公開を止めたいときはこちらです。

# Funnelを無効化
tailscale funnel off

以上です。ルーターの設定画面を一切触ることなく、外部公開が完了しました。

💡 公式ドキュメントに沿って検証

公式の手順通りに進めたところ、初回実行時にtailnetポリシーファイルの更新承認が必要な点で少し戸惑いました。コマンドを打っても何も起きないように見えますが、バックグラウンドでブラウザが開くのを待つ必要があります(ブラウザが前面に来ないケースもあるため、タスクバーを確認してください)。

また、使えるポートは443・8443・10000の3種類のみという制限があります。ローカルのサービスはどのポートでもOKですが、Funnel側(インターネットに公開するポート)はこの3つに限られます。コマンドでポートを指定する場合は以下のように書きます。

tailscale funnel --https=8443 3000
# ローカルポート3000を、外部ポート8443で公開

ドキュメントには書かれていないポイント:App Store版macOSのTailscaleではFunnelコマンドが動作しない場合があります。その場合はpkg版(公式サイトからダウンロード)に切り替えると解決します。

検証環境:macOS Sequoia 15 / Tailscale 1.80系

結果:コマンド1回で外部アクセス可能なHTTPS URLが発行、SSL証明書も自動生成されていました。

【応用編】実運用で役立つカスタマイズ

基本の設定ができたら、実運用で使えるオプションを紹介します。

特定のパスだけを公開する

サービス全体ではなく、特定のパスだけを公開したい場合は、ターゲットにURLを指定します。

# /api パスだけをFunnelで公開
tailscale funnel --https=443 http://localhost:3000/api

Webhookの受け口だけを外部に開けたい、というユースケースに便利です。

TCPポートをそのまま転送する

HTTPに限らず、TCPポートをそのまま転送することもできます。

# TCPポート2222を外部ポート10000でFunnel
tailscale funnel --tcp=10000 2222

SSHやデータベースの特定ポートを外部に公開したいときに使えます(セキュリティに注意してください)。

常時稼働させる(起動時に自動で有効化)

Tailscaleはデフォルトでは再起動後にFunnelの設定が引き継がれます。ただし、ローカルサービス(n8nなど)が立ち上がっていないとFunnel経由のアクセスは失敗します。

Dockerを使っているなら、restart: always を設定しておくと、Mac mini再起動後も自動でサービスが起動します。

# docker-compose.yml
services:
  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "5678:5678"

n8nのWebhookをFunnelで受け取る実例

n8nをローカルで動かしながら、GitHubのWebhookを受け取りたい場面を考えます。

  1. n8nをポート5678で起動
  2. tailscale funnel 5678 で外部URL発行
  3. GitHubのWebhook設定に https://your-device.tailnet.ts.net/webhook/xxx を入力
  4. GitHubからのPushイベントをローカルのn8nで受信できる

これだけで、クラウドサーバーを用意しなくてもWebhookを受け取れます。

ただし、常時稼働が必要な用途ではVPSの方が安定します。自宅Macのネット環境やスリープ設定に依存するため、本番用途には向きません。本番運用を検討している方は、XServer VPS のような常時稼働VPSと組み合わせる方法も検討してみてください。

よくあるトラブルと対処法

Q. URLにアクセスしても「接続できない」と表示される

原因1:ローカルサービスが起動していない
Funnelが有効でも、ローカル側のサービスが落ちていると接続できません。まず localhost:ポート番号 に直接アクセスできるか確認してください。

原因2:Funnelが停止している
tailscale funnel status で現在の状態を確認してください。再起動後に停止している場合は、もう一度 tailscale funnel ポート番号 を実行します。

原因3:ポートの指定ミス
Funnelで使えるポートは443・8443・10000のみです。他のポートを指定してもエラーになります。

Q. macOSでコマンドが「command not found」になる

App Store版のTailscaleを使っている場合、tailscale コマンドがPATHに含まれていないことがあります。

Tailscale公式サイトからpkg版をダウンロードしてインストールし直すと解決します。もしApp Store版を使い続けたい場合は、以下のパスを試してください。

/Applications/Tailscale.app/Contents/MacOS/Tailscale funnel 3000

Q. 「Funnel is not allowed for this device」エラーが出る

tailnetのポリシーファイルで、Funnelの使用が許可されていない状態です。

管理コンソール(login.tailscale.com/admin/acls)で、ポリシーファイルに以下が含まれているか確認してください。

"nodeAttrs": [
  {
    "target": ["autogroup:member"],
    "attr": ["funnel"]
  }
]

初回Funnel実行時に自動で追加されるはずですが、管理者が手動で削除していた場合はこの設定を追記します。

Q. HTTPSにリダイレクトされない

FunnelはTLS(HTTPS)専用です。HTTPでのアクセスは自動的にHTTPSにリダイレクトされます。ローカルサービス側がHTTPSを要求する設定になっていないか確認してください。Funnel側でSSL証明書は自動発行されるので、ローカルサービスはHTTPのままでOKです。

Tailscale Funnelが向いているケース・向いていないケース

Funnelは便利ですが、万能ではありません。使い分けの基準を整理しておきます。

Funnelが向いているケース

  • Webhookの一時的な受け口(GitHub、Stripe等)
  • 開発中のサービスを一時的にデモ共有したい
  • 自宅NASやHomeAssistantに外からアクセスしたい
  • AIツール(Ollamaなど)のAPIを一時的に外部公開したい
  • コストをかけずに試してみたい

Funnelが向いていないケース

  • 24時間365日の安定稼働が必要な本番サービス
  • 大量のトラフィックが想定される用途(帯域制限がある)
  • 固定IPアドレスが必要な場合
  • ポート443・8443・10000以外が必要な場合

本番運用や常時稼働が必要なら、VPSを使う方が現実的です。ConoHa VPS は月額1,000円程度から使えて、Dockerとの相性もよいのでn8nやOllamaのホスティングに向いています。

まとめ

  • Tailscale Funnelはポート開放なしでローカルサービスをHTTPSで外部公開できる
  • コマンドは tailscale funnel ポート番号 のみ。SSL証明書も自動
  • 使えるFunnel側ポートは443・8443・10000の3種類のみ
  • macOSのApp Store版は動作しない場合があるため、pkg版を推奨
  • 常時稼働・本番用途にはVPSと組み合わせるのが現実的

Tailscale Funnelは「とりあえず外から繋いでみたい」という場面で非常に役立ちます。無料で始められるので、まずは試してみてください。

自宅サーバーでn8nを動かす手順については、こちらの記事も参考にしてください。
n8nをDockerで自宅サーバーに構築する方法

コメント

タイトルとURLをコピーしました