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

Mihomo v1.19.30 の invalid domain エラーを修正する

Mihomo v1.19.30 で invalid domain と表示される場合は、fake-ip-filter または skip-domain 内の誤ったアスタリスクを特定し、正しいワイルドカードか列挙したホスト名へ変更します。設定を検証し、ロールバック手段も残してください。

  • Mihomo
  • YAML
  • 設定の検証
  • 設定互換性
目次

まずドメインパターンの検証エラーであることを確認する

この記事で扱うのは、明確な一連の症状だけです。同じ設定が Mihomo v1.19.29 以前では起動できたのに、v1.19.30 へ更新すると Parse config error: invalid domain と表示され、設定の読み込み段階でカーネルが直ちに終了します。

公式 issue #3116 には Linux Docker 環境での変更が記録されており、最終的に sniffer.skip-domain と dns.fake-ip-filter のドメインパターンへ原因が絞られました。v1.19.30 には、Clash 形式のドメインワイルドカードをより厳格に検証する変更が含まれています。これはノードの障害ではなく、プロキシモードを Direct へ切り替えて回避できる接続問題でもありません。

ログに Invalid YAML、unsupported field、proxy not found と表示される場合、またはカーネルは起動していても Web ページを開けない場合、障害は別の段階で発生しています。該当するエラーに沿って先に調査し、すべての設定エラーをこの記事のワイルドカード形式へ置き換えないでください。

まず最初のエラーに沿って切り分ける

ログまたは症状可能性が高い段階この記事が該当するか
Parse config error: invalid domainドメインパターンの検証v1.19.30 への更新後に発生した場合は該当する
Invalid YAML またはインデントの誤りYAML テキストの構造該当しないため、まず構文を修正する
proxy / group not foundポリシーグループまたはルールの参照該当しないため、まず不足している参照を追加する
カーネルは起動し、特定のドメインだけが失敗するDNS、ルール、ネットワーク該当しないため、まず接続記録を確認する

利用可能な設定と生成元を先に保存する

アスタリスクを検索する前に、現在の最終設定、クライアントの Profile、Merge またはオーバーライド、サブスクリプション変換テンプレートを個別に保存します。実行ディレクトリ内の config.yaml だけをバックアップしても不十分です。クライアントが次にサブスクリプションを更新すると、生成元の誤ったパターンによって修正が再び上書きされます。

古いカーネルが引き続き転送している場合は、先にサービスを再起動したり、サブスクリプションを何度も更新したりしないでください。まず現在の利用可能な状態を維持し、その後エラーログ、クライアントのバージョン、実際の Mihomo バージョンをコピーします。スクリーンショットと設定のコピーからは、サブスクリプションの token、ノードのパスワード、コントローラーの secret、個人用ドメインを削除してください。

ロールバック可能な経路を用意する

  1. 実際のカーネルバージョンを記録する

    クライアントの「About」画面、起動ログ、mihomo -v のいずれかで、実行中のバージョンが v1.19.30 であることを確認し、「最新版」という表現でバージョン番号を代用しないでください。

  2. 最終設定をエクスポートする

    カーネルが実際に読み込む YAML を保存し、Profile、Merge、オーバーライド、変換テンプレートも個別に保存します。

  3. 一つ前のカーネルを残す

    公式 Release から取得し、手元の端末で動作確認済みの v1.19.29 ファイルだけを、一時的なロールバック用として残します。

  4. ほかの変数を固定する

    調査中は、サブスクリプション、ノード、DNS モード、TUN 設定を同時に変更せず、二つ目の障害を加えないようにします。

最初の無効なドメインパターンを特定する

まず、実際に使用する v1.19.30 で最終設定をテストします。公式 issue で使われたコマンドは mihomo -t -f です。テストモードの成功が示すのは、現在のカーネルで設定を解析して初期化できることだけです。プロキシは起動せず、ノードが利用可能であることも証明しません。

v1.19.30 の安定版は、詳細を示さず invalid domain だけを返す場合があります。その場合は、最終 YAML と参照しているローカルファイルからアスタリスクを検索し、issue で問題が確認された sniffer.skip-domain と dns.fake-ip-filter を優先して調べます。一項目を修正するたびに再テストし、カーネルが次のエラーを示せるようにしてください。

現在の v1.19.30 で最終設定をテストする
mihomo -v
mihomo -t -f /path/to/config.yaml
Linux / macOS でドメイン一覧のアスタリスクを読み取り専用検索する
grep -R -n '\*' /path/to/config.yaml /path/to/rules 2>/dev/null

rrn-sw-*、a*.example.com、*a.example.com のいずれか

アスタリスクが同じラベル内のほかの文字と混在しており、v1.19.30 が明示的に拒否するパターンです。

*.example.com または time.*.com

アスタリスクだけで一つの完全なラベルを構成しており、形式自体は正しいため、次の項目を探します。

example.com.、a..example.com、先頭または末尾にスペースがある値

末尾のドット、空のラベル、先頭・末尾の空白も、厳格な検証で拒否されます。

アスタリスクがまったく見つからない

プラス記号、末尾のドット、空のラベル、クライアントが生成した最終設定を確認し、サブスクリプションの原文だけを検索しないでください。

まず三種類の正しいドメインワイルドカードを区別する

Mihomo のドキュメントでは、この書式を Clash 形式のドメインワイルドカードと呼び、ルーティングルールの DOMAIN-WILDCARD とは異なる構文であると明記しています。ルールのチュートリアルから似たアスタリスク表現をコピーし、fake-ip-filter または skip-domain へ直接記述しないでください。

重要なのはアスタリスクを先頭と末尾のどちらへ書くかではなく、ドットで区切られた一つの完全なラベルをアスタリスクだけで構成することです。time.*.com が正しいのは、中間の部分がアスタリスクだけだからです。rrn-sw-* は、アスタリスクと rrn-sw- が同じラベルに混在するため正しくありません。

実際に一致させたい範囲に応じて書式を選ぶ

正しい書式一致する範囲一致しない対象
*.example.coma.example.com のような、ちょうど一階層のサブドメインexample.com、b.a.example.com
+.example.comルートドメインと任意の階層のサブドメイン別のサフィックス
.example.com任意の階層のサブドメインexample.com のルートドメイン
time.*.com中間にちょうど一つの完全なラベルがあるものtime.com、time.a.b.com
*ドットを含まない単一ラベルのホスト名ドットを含む完全修飾ドメイン名
構文上の誤った例:次の部分ラベルワイルドカードは v1.19.30 で拒否されます
rrn-sw-*
a*.example.com
*a.example.com
a*b.example.com

実際の目的に合わせて書き換え、機械的に置換しない

固定したルートドメインの直下または複数階層のサブドメインへ一致させる場合は、アスタリスク、プラス記号、ドット接頭辞から選べます。元の目的が rrn-sw- で始まる一連の LAN ホストへ一致させることなら、Clash 形式のドメイン一覧には rrn-sw-* と同等の部分ラベルワイルドカードがありません。実際のホスト名を列挙する方法が最も確実です。

rrn-sw-* を機械的に *.rrn-sw、rrn-sw.*、+.rrn-sw へ変更しないでください。これらが表すラベル構造は異なるため、検証に通っても目的のホストへ一致しない場合があります。まず実際に問い合わせる名前を列挙し、各設定が対象範囲を説明できるようにしてください。

例:LAN のホストを列挙し、正しいドメイン範囲を残す
sniffer:
  skip-domain:
    - "rrn-sw-01"
    - "rrn-sw-02"

dns:
  fake-ip-filter:
    - "+.example.com"
    - "time.*.com"

誤った書式と実行可能な対処

本来の目的次のようには変更しない実行可能な対処
rrn-sw- で始まる短いホスト名へ一致させるrrn-sw-* を使い続けるrrn-sw-01、rrn-sw-02 など、実際のホスト名を列挙する
example.com の直下にあるサブドメインへ一致させるa*.example.com*.example.com を使用する
ルートドメインとすべてのサブドメインへ一致させる*example.com+.example.com を使用する
ルートドメインを含めず、すべてのサブドメインだけへ一致させる*.example.com が複数階層も含むと誤解して使用する.example.com を使用する

同じ v1.19.30 で修正を検証する

候補のコピーを保存してから、同じ v1.19.30 で設定テストを実行します。引き続き invalid domain と表示される場合は、次の項目へ対処してください。最初のエラーが消えただけで、唯一利用可能な設定を上書きしないようにします。すべてのエラーがなくなってから、クライアントに候補を読み込ませてカーネルを再起動してください。

カーネルの起動は、最初の受け入れ条件にすぎません。fake-ip-filter へ一致するはずのドメイン、sniffer でスキップするはずのドメイン、通常のインターネットドメインへそれぞれアクセスし、DNS の結果と接続記録を確認します。書式が検証を通っても一致範囲が誤っていれば、修正完了ではありません。

ロールバック可能な順序で候補を適用する

  1. 候補のコピーをテストする

    mihomo -t -f を実行し、v1.19.30 から設定テストの成功が明示されるまで続けます。

  2. 元のファイルを保存してから置き換える

    以前の利用可能な YAML を残し、クライアントの実行中に唯一の元ファイルを上書きしないでください。

  3. カーネルを再読み込みまたは再起動する

    ログで v1.19.30 の起動を確認し、古いプロセスや古い設定が引き続き読み込まれていないことを確かめます。

  4. 実際の一致結果を再テストする

    対象が明確なドメインのリクエストを使い、DNS、スニッフィング、ルールの一致、最終ページへのアクセスを確認します。

修正の完了基準

  • v1.19.30 で最終設定のテストモードが成功する
  • カーネルを起動して稼働を維持でき、新しい設定解析エラーがない
  • 列挙した LAN ホストが想定どおりにスニッフィングまたは Fake-IP をスキップする
  • 一階層、任意の階層、ルートドメインの一致範囲が、選んだ構文と合っている
  • 通常のインターネットドメインとノード接続が、広がったルールによる影響を受けていない
  • 元の設定、生成元、旧カーネルのロールバック用ファイルを引き続き確認できる

更新後に再発する場合は生成元を修正する

手動修正後は起動できても、サブスクリプションの更新、Profile の切り替え、クライアントの再起動で同じエラーが再発する場合、無効なパターンは変換テンプレート、リモート設定、Merge、オーバーライドのいずれかから生成されています。一時的な実行ファイルを繰り返し編集せず、修正前後の最終 YAML を比較し、どの層が古い値を書き戻したかを特定してください。

サブスクリプションまたは変換ツールを管理できる場合は、テンプレートを直接修正して再生成します。クライアントだけを管理できる場合は、制御可能な Merge またはオーバーライドで一覧全体を置き換え、更新後の最終設定も正しいことを確認してください。token を含むサブスクリプションを不明な変換サイトへアップロードせず、広すぎるサフィックス一つですべての未知の状況を覆わないようにします。

サブスクリプションを更新するたびに再発する

サブスクリプションの変換テンプレートまたは上流設定を修正し、候補を再生成します。

Profile を切り替えると再発する

各 Profile の Merge、Script、ローカルオーバーライドを個別に確認します。

ディスク上のファイルは変更済みだが、カーネルが古い値を報告する

実際の読み込みパス、プロセス、クライアントが生成した最終設定を確認します。

広範なサフィックスを使わないと起動できない

まず必要なホストを列挙して不足分を記録し、範囲の拡大を長期的な解決策にしないでください。

すぐに修正できない場合は、安全にロールバックする

制御できない生成元が誤った設定を出力し続け、短期間では修正できない場合は、まず TUN またはシステムプロキシを無効にしてシステムの直接接続を復元し、バックアップ設定へ戻します。業務上の依存がある場合は、手元の端末で動作確認済みの v1.19.29 へ一時的に戻し、生成元の修正後に v1.19.30 を再テストできます。

ロールバックはサービスを復旧するためだけのもので、古い書式が正しいことを証明しません。v1.19.30 の厳格な検証を導入するコミットは現在の安定版に含まれ、より詳細なエラーパスを示すコミットはその後に追加されています。「旧版ではエラーにならない」と「新しい Alpha の方が特定しやすい」を混同し、長期的なバージョン方針にしないでください。

利用可能と分かっている状態へ戻す

  1. 失敗するカーネルの再試行を停止する

    まずクライアントによる通信の引き継ぎを無効にし、動作していないローカルポートへシステム通信が送られ続けるのを防ぎます。

  2. 設定のバックアップを復元する

    Profile、最終 YAML、必要なオーバーライドを復元し、配布元が不明なディレクトリ全体をインポートしないでください。

  3. 必要な場合はカーネルを一時的に戻す

    公式の v1.19.29 と手元の端末で動作確認済みのアーキテクチャだけを使用し、ロールバックの理由と日付を記録します。

  4. 同じバージョンでの再テストを予定する

    生成元の修正後に v1.19.30 へ戻し、設定テスト、起動、実際のドメイン検証を繰り返します。

参考資料