対象を確認:サブスクリプションの直接編集ではなくOpenClashの上書きです

この記事は、OpenClashでカスタムルーティングルールを1本追加する手順に限定します。対象はOpenWrt LuCI、OpenClash安定版 v0.47.156、Mihomoコアです。Clash for Windows、Clash Verge Rev、FlClash、単独Mihomoの画面にはそのまま適用できません。

検証前にプロキシモードを rule にします。Mihomoはruleモードで通常のルールを上から順に照合します。global と direct では、カスタムルールのヒットを確認できません。OpenClash v0.47.156の英語UIでは「Services → OpenClash → Overwrite Settings → Rules Setting」を開き、「Custom Clash Rules」を有効にすると (Priority) と (Extended) が表示されます。周辺の表記はLuCIの言語パックで変わる場合があります。

サブスクリプションは書き換えません:OpenClashは起動時にカスタム内容を一時的な実行用YAMLへ統合します。元のサブスクリプションファイルを直接書き換えないため、更新後も上書き画面で管理します。

優先と拡張は最終的な挿入位置が異なります

どちらもYAMLを保存しますが、統合位置は別です。付属テンプレートはオブジェクト形式とトップレベルの rules: 配列を推奨し、rule-providers: や sub-rules: も定義できます。v0.47.156はルートYAML配列も受け付けますが、この形式で扱えるのはルールだけです。rule-providers を統合するにはオブジェクト形式を使い、空でもよいので配列型の rules を残します。sub-rules もオブジェクト形式が必要ですが、統合時に rules は必須ではありません。

領域保存先v0.47.156の挿入位置用途
優先(Priority)/etc/openclash/custom/openclash_custom_rules.list最終 rules の先頭サブスクリプションルールより前に照合したい狭い例外
拡張(Extended)/etc/openclash/custom/openclash_custom_rules_2.list元のルールで最後に DST-PORT,80 を含む項目の直前、なければ最初の MATCH/FINAL 直前、さらにない場合は2文字の国コードを持つ最初の GEOIP 直前、いずれもなければ末尾サブスクリプション前半の詳細ルールを残す追加

v0.47.156のポートアンカーは部分文字列で判定されます:DST-PORT,8080 も DST-PORT,80 を含むためアンカーになる場合があります。GEOIP へのフォールバックは GEOIP,CN,... のような2文字の国コードを持つルールだけが対象です。アップグレード後は統合順を再確認してください。

拡張が常に MATCH の後ろに入るという意味ではありません。スクリプトは元のサブスクリプション内のアンカーを先に記録します。最初に一致したルールが使われるため、優先領域に広範囲な MATCH や FINAL を置かないでください。

まず検証できる優先ルールを1本追加します

次の例は、特定のホスト名への通信を DIRECT にします。app.example.net はプレースホルダーなので、接続ログで確認した実際のホスト名に置き換えます。DIRECT はMihomoの組み込み処理です。

OpenClash 優先ルールrules:
  - DOMAIN,app.example.net,DIRECT
  1. 変更前の現象を再現し、ホスト名、一致したルール、選択グループを記録します。
  2. 後述のコマンドで2つのカスタムファイルをバックアップします。まだない場合は、スイッチが無効で空欄だったことを記録します。
  3. カスタムルールを有効にし、上記YAMLを Priority 領域に貼り付けます。
  4. 半角スペース2個のインデントを保ち、DNS、Fake-IP、サブスクリプション、モードを同時に変更しません。
  5. Apply Settings を1回押し、保存と検証用の再起動を行います。

ルールの対象名は実在するものに限られます:末尾フィールドは DIRECT、REJECT、GLOBAL、REJECT-DROP、PASS、COMPATIBLE などの対応済み組み込み対象、または現在のプロキシグループ、プロキシ、サブルール名と大文字小文字まで一致させます。すべてがネットワーク出口ではなく、PASS は後続ルールの照合を続け、REJECT は要求を拒否します。存在しない対象はスキップされ、Skiped The Custom Rule Because Group & Proxy Not Found が記録されます。

サブスクリプション前半の順序を残すときだけ拡張を使います

拡張領域は、サブスクリプションの詳細ルールを先に照合し、カスタムルールで後から補いたい場合に使います。次は独立した検証例です。前節の優先ルールは外し、updates.example.net を実際のドメインに置き換えます。

OpenClash 拡張ルールrules:
  - DOMAIN-SUFFIX,updates.example.net,DIRECT
  1. 優先のテスト項目を外し、他の条件は変えません。
  2. YAMLを Extended 領域に貼り、Apply Settings を押します。
  3. 実行用ルールで該当項目を探し、元のルールで最後に DST-PORT,80 を含む項目、最初の MATCH/FINAL、または GEOIP,CN,... のような2文字の国コードを持つ最初のルールと照合します。
  4. 実通信のログを確認します。より上のサブスクリプションルールが先に一致した場合、拡張項目は実行されません。これは正常な順序であり、保存エラーではありません。

拡張は統合後の位置で判定します:編集欄に文字があるだけでは不十分です。ルール順と実際の接続を確認します。

適用後は起動ログ、統合順、実通信を別々に確認します

v0.47.156の英語UIで Commit Settings はフォームとカスタムファイルを保存するだけで、OpenClashを再起動しません。Apply Settings は保存後にOpenClashを有効化して再起動します。すぐ検証するならApplyを1回押せばよく、先にCommitを押す必要はありません。

  1. OpenClashが稼働中に戻ったら、起動ログのYAML、ルール、グループに関する最初のエラーを確認します。
  2. 実行用設定またはルール一覧で DOMAIN,app.example.net,DIRECT の位置を確認します。
  3. 実際の端末から対象のホスト名へアクセスし、接続ログのルール種別、値、最終処理経路を照合します。
  4. 関係のないサイトも試し、残りのサブスクリプションルールが従来どおりか確認します。

ファイルの保存成功だけでは読み込みを証明できず、実行用YAMLに存在するだけでは実通信のヒットを証明できません。3段階が一致して完了です。

ルールが効かないときはモードとYAMLから確認します

現象最初の確認対処
保存後も変化しないCommit Settings だけを押したか短時間の切断が許容できるときに Apply Settings を実行
ルールはあるがヒットしないrule モードと、上にある先行ルールruleに戻し、完全なホスト名1つで検証
YAMLエラーインデント、コロン、リスト記号付属テンプレートに戻し、rules項目を1つだけ追加
Group & Proxy Not Found末尾名と大文字小文字実在するグループまたは対応済みルール対象を使用
RULE-SET が効かないproviderの定義、取得結果、behavior先に DOMAIN で経路を証明し、providerを別途追加

2つのYAMLは rule-providers と sub-rules も定義できますが、同名定義は統合時に上書きされる危険があります。最終YAMLと照合せずに、ネットで見つけた大きなprovider設定を両方へ貼らないでください。この単一ホスト検証にproviderは不要です。

一度に1項目だけ変更:ルールがヒットしないときに、コア、DNS、Fake-IP、ノード、サブスクリプションを同時に変えないでください。モード、YAML、ルールの対象名、ホスト名の順に固定します。

2つのカスタムファイルをバックアップし、切り戻し手順を残します

初回編集前にSSHで2ファイルをバックアップできます。次のコマンドはソースが存在するときのみコピーしますが、同名の .bak を上書きします。既存バックアップがあれば別名を使います。

OpenWrt Shelltest -f /etc/openclash/custom/openclash_custom_rules.list &&   cp /etc/openclash/custom/openclash_custom_rules.list /root/openclash_custom_rules.list.bak
test -f /etc/openclash/custom/openclash_custom_rules_2.list &&   cp /etc/openclash/custom/openclash_custom_rules_2.list /root/openclash_custom_rules_2.list.bak

バックアップ内容を確認したうえで、存在するバックアップを元のパスへ戻すには次を実行します。

OpenWrt Shell · 復元test -f /root/openclash_custom_rules.list.bak &&   cp /root/openclash_custom_rules.list.bak /etc/openclash/custom/openclash_custom_rules.list
test -f /root/openclash_custom_rules_2.list.bak &&   cp /root/openclash_custom_rules_2.list.bak /etc/openclash/custom/openclash_custom_rules_2.list

LuCIで元のテキストを戻すかカスタムルールを無効にする方法でも切り戻せます。その後 Apply Settings で実行用設定を再生成します。SSHでバックアップを戻した場合は、LuCIを再読み込みして内容を確認してから適用し、古いフォームによる再上書きを防ぎます。サブスクリプションの削除や、生成済み一時YAMLの長期的な直接編集は不要です。

完了条件:YAMLが解析でき、挿入位置が優先/拡張の意図と合い、ルールの対象名が存在し、OpenClashが正常に再起動し、実通信が予定した処理または経路を使い、元の2ファイルを復元できる状態にします。

OpenClashやMihomo関連クライアントの対応環境は、サイトのダウンロードページで確認できます。クライアントの入れ替えは、ルール順と接続ログの確認の代わりにはなりません。

公式情報源とバージョン範囲

バージョン番号、ファイル名、画面表示は更新で変わる場合があります。作業前にリンク先の公式資料を確認してください。