設定の実践 · Clash 技術ブログ

Tailscale と Clash が競合する場合は?TUN、LAN、ルーティング優先度の修正

Tailscale と Clash を同時に有効にした場合だけ問題が起きるなら、実際の共存競合と判断できます。確認後は tailnet、MagicDNS、LAN のルーティングを Tailscale に任せ、通常のインターネット通信を Clash へ渡してください。

  • Tailscale
  • TUN
  • ローカルネットワーク
目次

Tailscale と Clash が単独では正常で、同時に有効にした場合だけ切断されるときに初めて、本当の競合と判断できる

Tailscale だけを有効にした状態では tailnet のデバイスへアクセスでき、Clash TUN だけを有効にした状態では普段の振り分けを行える必要があります。それぞれ単独では正常で、併用時だけ失敗する場合に、ルート、DNS、デフォルト出口の競合を調べます。どちらか一方が単独でも失敗するなら、先にそのツール自体の設定を修正してください。

三つの状態を個別に記録します。Tailscale だけ、Clash だけ、両方を有効にした状態で、それぞれ一つの tailnet IP、一つの tailnet デバイス名、一つのローカルネットワークアドレス、一つの公開アドレスをテストします。IP とデバイス名で結果が異なれば、ルーティングと MagicDNS の問題をすでに切り分けられます。

三組の比較から分かること

結果可能性の高い問題
100.x アドレスにもデバイス名にも到達できないTailscale サブネットが TUN またはデフォルトルートに取り込まれている
100.x アドレスには到達できるが、デバイス名では到達できないMagicDNS または Clash DNS の取り込み順
tailnet は正常だが、公開インターネットが切断される二つのツールがデフォルト出口または exit node を奪い合っている
特定のローカルサブネットだけに到達できないTailscale のサブネットルートとローカルサブネットが重複している

ルーティングテーブルを見れば、対象サブネットを奪ったネットワークアダプターが分かる

Tailscale はデバイスへ 100.64.0.0/10 の範囲からアドレスを割り当て、管理者が承認したサブネットルートを受け取る場合もあります。exit node を選ぶとデフォルトルートも追加されます。Clash TUN もルートを書き込むため、二つのスイッチだけを見ても競合は診断できません。

障害が発生している状態で route print、ip route、netstat -rn の結果を保存し、単独で動作させた状態と比較します。100.64.0.0/10、実際に公開されたサブネット、家庭内 LAN、デフォルトルートがそれぞれどのインターフェースを指しているか、同じプレフィックスで metric の異なる二つの項目がないかを重点的に確認してください。

OS ごとにルートを確認する
# Windows
route print

# Linux
ip route
ip rule

# macOS
netstat -rn

デフォルトのインターネット出口は一つのツールだけに任せる

Tailscale exit node と Clash TUN はどちらもデフォルトのインターネット通信へ影響します。目的が Tailscale 経由で自宅の NAS へアクセスし、公開通信の振り分けを Clash に任せることだけなら、このデバイスで Tailscale exit node を選ばないでください。

Tailscale には tailnet と公開済みサブネットだけを任せます。

反対に、会社の方針で公開通信をすべて指定の Tailscale exit node へ通す必要がある場合は、Clash の対象を明示したアプリまたはプロキシポートだけに絞り、この併用が組織の方針に沿っていることを確認してください。二つのツールがどちらもデフォルト出口を宣言している状態で時々接続できても、単にその時点のルート metric が一方に有利なだけで、安定した設定ではありません。

tailnet と実際のサブネットは Tailscale に任せる

Clash Verge Rev など、TUN から任意のサブネットを除外できるクライアントでは、100.64.0.0/10、実際に使う家庭内 LAN、Tailscale の管理コンソールで承認した advertised routes を除外範囲へ追加できます。

他人のプライベートサブネットをすべてコピーしないでください。除外範囲が広すぎると、本来 Clash で処理すべき接続まで直接外へ出てしまいます。

Mihomo のルールでこれらのサブネットを明示的に DIRECT にすることもできますが、ルーティング層の除外とルール層の DIRECT は完全に同じではありません。ルールが判断するには、接続が先にコアへ入る必要があります。100.x のリクエストが Clash の接続記録に現れない場合はシステムルートを直接確認し、記録に現れてプロキシへ一致する場合はルールを調整してください。

自分のネットワークに合わせて入力する

  • 100.64.0.0/10 の tailnet アドレス範囲
  • 自宅またはオフィスで実際に使う LAN サブネット
  • Tailscale コンソールで承認済みのサブネットルート
  • Docker、WSL、仮想マシンで実際に tailnet と重複するサブネット

IP では到達できるのにデバイス名で失敗する場合は、ルーティングではなく MagicDNS を修正する

100.x アドレスへ直接アクセスできれば、tailnet へのルートは概ね存在しています。それでもデバイス名の名前解決に失敗する場合、Clash DNS、ブラウザの DoH、システム resolver のいずれかが tailnet の名前を Tailscale の DNS 設定へ渡していない可能性があります。

まず tailscale status でデバイスのアドレスを取得し、nslookup または OS の名前解決ツールで短い名前と完全な tailnet 名を比較します。トラブルシューティング中はブラウザ独自の DoH を無効にし、Clash の nameserver-policy またはローカルドメイン除外を確認してください。tailnet 名を公開 DNS へ転送しないでください。

WSL、Docker、遠隔地の LAN が偶然同じサブネットを使っている場合がある

Tailscale のサブネットルートが 192.168.1.0/24 を公開し、現在いるカフェや自宅も 192.168.1.0/24 を使用している場合、システムはアドレスだけではどちらへアクセスするか判断できません。Docker と WSL2 も独自のプライベートサブネットを追加するため、競合がコンテナやサブシステム内だけで発生する場合があります。

サブネットが重複した場合は、自分で制御できる LAN、Docker、仮想マシンのアドレス設計を優先して変更します。同じプレフィックスを高優先度のルートで長期的に奪い合う構成では、ネットワークの切り替え、スリープ復帰、アップグレードの後に再び失敗します。

スリープ復帰時や Wi-Fi の切り替え後だけ失敗するなら、多くはルートの書き換え順が変わっている

ノートパソコンのスリープ復帰、有線から Wi-Fi への切り替え、スマートフォンのテザリングへの接続時には、二つのクライアントがデフォルトインターフェースを再検出してルートを書き込みます。再接続が完了するまで待ってからルーティングテーブルを比較してください。決まった順序で一方を再起動すると復旧するなら、起動順に問題がある証拠です。

両方のクライアントを更新しても繰り返し発生する場合は、自動起動時の競合を減らします。システムのネットワークが準備できてから必要なトンネルを起動し、Tailscale exit node を同時に自動選択しないでください。障害と無関係な設定まで消去されるため、毎回ネットワーク全体をリセットしないでください。

修正完了とするには、二つの用途がどちらも機能することを証明する

同じテスト周期で検証する

  1. tailnet IP へアクセス

    100.x のルートが引き続き Tailscale に割り当てられていることを証明します。

  2. tailnet 名へアクセス

    MagicDNS または専用の名前解決が引き続き機能することを証明します。

  3. 公開済みサブネットへアクセス

    承認済みの subnet route が Clash に取り込まれていないことを確認します。

  4. 公開インターネットへアクセスして Clash の記録を確認

    通常の振り分けが引き続き想定したポリシーで処理されることを証明します。

四項目のうち失敗した項目に対応するルート、DNS、サブネット、デフォルト出口だけを調整します。Tailscale の担当と Clash の担当を同時に説明できて初めて、偶然の metric 順序に依存しない設定になったといえます。

参考資料