OpenClaw × Tailscale Funnel 深掘り — MacからLINE Botを公開する

OpenClaw × Tailscale Funnel 深掘り — MacからLINE Botを公開する

Tailscale FunnelはOpenClawが公式にネイティブ統合している唯一のトンネリング手段。ngrokやCloudflare Tunnelと違い、OpenClawの設定だけで完結する。

Tailscale Funnel とは何か

Tailscaleは本来、デバイス間のプライベートVPN(tailnet)を作るサービス。Funnelはそのtailnetの中にあるサービスをパブリックインターネットに公開する拡張機能。

インターネット
    │
    ▼
Tailscale Funnel イングレスノード(Tailscaleが管理)
    │ (TLS終端、HTTPS自動)
    ▼
あなたのMac上のOpenClaw (:18789)
    │ (loopbackのまま!)
    ▼
LINEに返信

ポイント:

Serve と Funnel の違い

Serve Funnel
アクセス範囲 tailnet内のデバイスだけ インターネット全体
用途 ダッシュボードを自分のスマホから見る LINEのWebhookを受ける
認証 Tailscale ID で自動認証可能 パスワード認証必須
LINEで使える ❌(LINEサーバーはtailnetに入れない)

LINE Botには Funnel が必須。 LINEサーバーはあなたのtailnetのメンバーではないので、Serveでは到達できない。

前提条件

セットアップ手順

1. Tailscaleインストール(オープンソース版)

# Homebrew でオープンソース版をインストール
brew install tailscale

# デーモン起動
sudo tailscaled

# ログイン
tailscale up

⚠️ App Store版のTailscaleではFunnelは動かない。 Homebrewでインストールすること。

2. Tailscale管理コンソールで設定

login.tailscale.com/admin にアクセスして:

  1. DNS → MagicDNSが有効か確認
  2. DNS → HTTPSが有効か確認(「Enable HTTPS」)
  3. Access controls → Funnelのnode attributeが設定されているか確認

ACLに以下を追加(まだなければ):

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

3. OpenClawの設定

# Funnelモードを有効化
openclaw config set gateway.tailscale.mode "funnel"

# Funnelにはパスワード認証が必須(トークン認証では起動を拒否する)
export OPENCLAW_GATEWAY_PASSWORD="your-secure-password"
# または設定ファイルに直接書く(非推奨)
openclaw config set gateway.auth.mode "password"
openclaw config set gateway.auth.password "your-secure-password"

# bindはloopbackのまま(Tailscaleがプロキシするので変更不要)
openclaw config set gateway.bind "loopback"

# Gateway再起動
openclaw gateway restart

⚠️ tailscale.mode: "funnel"auth.mode: "password" でないと起動を拒否する。 これはOpenClawのセキュリティ設計。公開インターネットにトークンだけで晒すのは危険なため。

4. 動作確認

# Tailscaleのステータスを確認
tailscale status

# FunnelのURLを確認
tailscale funnel status

公開URL(例):

https://macbook-pro.tail12345.ts.net

5. LINE Developers に Webhook URL を登録

https://macbook-pro.tail12345.ts.net/line/webhook

⚠️ 重要な注意点

macOSのオープンソース版 Tailscale が必要

App Store版のTailscaleではFunnelが使えない。Homebrewでインストールしたtailscaleコマンドが必要。既にApp Store版を使ってる場合は:

  1. App Store版をアンインストール
  2. brew install tailscale でインストール
  3. sudo tailscaledtailscale up で再ログイン

Webhook ポートの問題(既知のIssue)

Telegramで報告されている問題(GitHub #30022)がLINEにも当てはまる可能性がある。gateway.tailscale.mode: "funnel" はGatewayのメインポート(18789)にFunnelを向けるが、一部チャネルのWebhookリスナーが別ポートで動いている場合、リクエストが到達しない。

LINEの場合、Webhookはメインポートの /line/webhook で受けるので通常は問題ないが、もし405エラーが出たら手動Funnel設定に切り替える:

# 自動Funnel を無効化
openclaw config set gateway.tailscale.mode "off"

# 手動でFunnelを設定
tailscale funnel --bg 18789

# Gateway再起動
openclaw gateway restart

Macのスリープ対策

sudo pmset -a sleep 0 disksleep 0 displaysleep 0
sudo pmset -a hibernatemode 0 powernap 0
sudo pmset -a standby 0 autopoweroff 0
sudo pmset -a autorestart 1  # クラッシュ時の自動再起動

セキュリティ設計

Funnel経由でインターネットに公開されるということは:

Funnelのイングレスノードはtailnetへのパケットレベルのアクセスは持たない。つまりFunnelが侵害されても、tailnet内の他のデバイスには影響しない。

shutdownでFunnel設定を片付ける

openclaw config set gateway.tailscale.resetOnExit true

これを設定しておくと、OpenClawが停止した時にTailscale Funnel/Serveの設定を自動でクリーンアップする。

Serve vs Funnel の使い分け(社長向け推奨構成)

# 普段はServe(tailnet内からダッシュボード見る用)
openclaw config set gateway.tailscale.mode "serve"

# LINEを使いたい時だけFunnelに切り替え
openclaw config set gateway.tailscale.mode "funnel"
openclaw gateway restart

ただし切り替えるたびにGateway再起動が必要なので、LINE Botを常時使うなら最初からFunnelで良い。

最終的な設定ファイル(完成形)

{
  "gateway": {
    "bind": "loopback",
    "tailscale": {
      "mode": "funnel",
      "resetOnExit": true
    },
    "auth": {
      "mode": "password"
    }
  }
}

パスワードは環境変数で管理:

export OPENCLAW_GATEWAY_PASSWORD="your-secure-password"

トラブルシューティング

症状 原因 解決策
Funnel起動拒否 auth.modeがpasswordじゃない openclaw config set gateway.auth.mode "password"
HTTPS エラー Tailscale管理コンソールでHTTPS無効 管理コンソールで有効化
Funnel使えない App Store版Tailscale Homebrewでオープンソース版をインストール
LINE Webhook 405 ポートミスマッチ 手動Funnel設定(tailscale funnel --bg 18789
Macスリープで止まる macOSデフォルトのスリープ pmset で無効化

参考リンク

関連記事