tailscale-subnet-router-debug について
tailscale-subnet-router-debug は、Tailscale のサブネットルーター接続障害を診断するスキルです。ルートの広告と承認から転送、戻り経路の確認まで、順序に沿った7段階のチェックを行います。
主な機能
- 01順序に沿った7段階の接続確認
- 02ルート広告と承認の確認
- 03クライアントのルート受け入れ確認
- 04ポリシールーティングテーブル52の調査
- 05転送と戻り経路の検証
活用シーン
- 01クライアントからサブネット端末に届かない問題の診断
- 02承認済みルートがルーティングテーブルにない場合の調査
- 03Docker のサブネットルート広告のトラブルシューティング
- 04応答トラフィックが戻らない原因の特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rshade/ agent-skills --skill tailscale-subnet-router-debugインストール後、Claude Code で/tailscale-subnet-router-debugを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/common-failures.mdpolicy-routing.mdroute-lifecycle.md詳細
Tailscale サブネットルーターのデバッグ
Tailscale サブネットルーターの接続障害を診断して修正します。 ルートのアドバタイズから戻り経路の確認まで、ルートのライフサイクル全体を対象とする7つのチェックを順番に実行します。
このスキルでできること
- サブネットルーターがルートをアドバタイズしていることを確認します。
- ルートが承認されていることを確認します(管理コンソールまたは
autoApprovers)。 - クライアントがサブネットルートを受け入れることを確認します(
--accept-routes)。 - ポリシールーティングテーブル52にインストールされたルートがあるかを調べます。
- サブネットルーターでIPフォワーディングが有効になっていることを確認します。
- サブネットルーターからターゲットに直接到達できることをテストします。
- 応答トラフィックの戻り経路を確認します。
よくある問題のきっかけ
- クライアントからサブネットルーターには ping できるものの、アドバタイズされたサブネット上のデバイスには ping できない
- 管理コンソールではルートが承認済みと表示されるのに、
ip routeが空になっている - Docker コンテナーで
TS_ROUTES経由のルートアドバタイズに失敗する - ターゲットにはトラフィックが届くものの、応答が返ってこない
- 「ルーター自体からは動作するが、ほかのクライアントからは動作しない」
診断ワークフロー
各ステップを順番に実行します。最初に失敗した時点で停止し、先に修正してから続行してください。後続のステップは先行するステップに依存します。
ステップ1 — ルートがアドバタイズされていることを確認する
tailscale status --json | jq '.Self.AllowedIPs'
合格: サブネット CIDR が AllowedIPs に表示されます(例:10.100.0.0/24)。
失敗: Tailscale IP のみが表示されます。ルートはアドバタイズされていません。
修正: tailscale set --advertise-routes=<CIDR> を実行します。Docker の場合は、TS_ROUTES 環境変数を確認してください。初回起動時に認証に失敗していると、反映されないことがあります。その場合は、実行時に tailscale set を実行してください。
ステップ2 — ルートが承認されていることを確認する
管理コンソールを確認するか、ピアノードから次を実行します。
tailscale status --json | jq '.Peer[] | select(.HostName=="<router>") | .AllowedIPs'
合格: ピアから見たルーターの AllowedIPs に、サブネット CIDR が表示されます。
失敗: ピアからは Tailscale IP のみが表示されます。ルートは承認待ちです。
修正: 管理コンソールで承認するか、ACL に autoApprovers を追加します。
"autoApprovers": {
"routes": { "10.100.0.0/24": ["tag:subnet"] }
}
ステップ3 — クライアントがルートを受け入れることを確認する
tailscale debug prefs | grep -i route
失敗: --accept-routes が false(デフォルト)です。クライアントは、承認済みであってもアドバタイズされたサブネットルートを無視します。
修正: tailscale set --accept-routes=true を実行します。Docker の場合は、TS_EXTRA_ARGS に --accept-routes を追加します。Docker では tailscale down を使用しないでください。containerboot が停止します。代わりに tailscale set を使用してください。
ステップ4 — ポリシールーティングテーブルにルートがあることを確認する
ip route show table 52
合格: サブネット CIDR のルートが dev tailscale0 経由で表示されます。
失敗: テーブル52が空か、サブネットルートがありません。
重要: ip route(テーブルの指定なし)には、メインテーブルのみが表示されます。Tailscale はポリシールーティングテーブル52を使用するため、デフォルトの出力にはルートが表示されません。これは最もよくある誤検知です。
次も確認してください。
ip rule show
テーブル52とTailscaleのポリシールーティングの仕組みについて詳しくは、references/policy-routing.md を参照してください。
ステップ5 — サブネットルーターでIPフォワーディングが有効になっていることを確認する
cat /proc/sys/net/ipv4/ip_forward
合格: 1 が返されます。
失敗: 0 が返されます。カーネルが転送パケットを黙って破棄しています。
修正: sysctl -w net.ipv4.ip_forward=1 を実行します。Docker Compose では、sysctls: [net.ipv4.ip_forward=1] を設定します。Linux ホストで設定を永続化するには、/etc/sysctl.d/ に追加してください。
ステップ6 — サブネットルーターからターゲットへのネットワーク経路を確認する
サブネットルーターから次を実行します。
ping <target-ip>
ip addr show
合格: ルーターからターゲットに到達でき、アドバタイズされたサブネット上にインターフェースがあります。
失敗: ルーターからターゲットに到達できません。これはローカルネットワークの問題(ファイアウォール、VLAN、ルーティング)であり、Tailscale の問題ではありません。
ステップ7 — 戻り経路を確認する
ターゲットは、サブネットルーターを経由して応答を返す必要があります。ターゲットのデフォルトゲートウェイがサブネットルーターでない場合、戻りトラフィックは別の経路を通り、破棄されます。
修正: ターゲット(またはそのゲートウェイ)に、サブネットルーターの内部 IP を指す 100.64.0.0/10 の静的ルートを追加します。または、マスカレードを有効にします。
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Tailscale 1.64+ では、デフォルトで --snat-subnet-routes が有効になり、この問題が自動的に処理されます。
エラー処理
失敗したチェックを黙ってスキップしないでください。具体的な失敗内容と修正方法を報告してから、続行してください。修正のために Tailscale の再起動やコンテナの再作成が必要な場合は、そのようにユーザーに指示し、ステップ 1 から再実行してください。
参考資料
references/route-lifecycle.md— 広告から戻り経路までの、ルートライフサイクル全 7 段階references/policy-routing.md— テーブル 52、ip rule、VRF との類似点、およびip routeで Tailscale のルートが見つからない理由references/common-failures.md— 症状から検索できる、根本原因と修正方法をまとめた表