応用設定 読了時間:約12分

ClashのGeoIP・GeoSiteデータベース更新方法|MMDB・DATの入手先とルール設定

GeoIP.mmdbとGeoSite.datの役割、mihomoの自動更新先や手動での差し替え方法、GEOIP・GEOSITEルールの書き方とトラブル対処を解説します。

まずカーネルとデータ形式を確認

GeoIPは接続先IPの割り当て先に基づいて分類し、GeoSiteはドメインの集合に基づいて分類します。どちらもプロキシノードのサブスクリプションではなく、プロキシサーバーを提供するものでもありません。データベースを更新すると、該当ルールの判定基準が変わるだけです。ノードが追加されたり、ポリシーグループの出口選択が変更されたりすることはありません。

この記事の自動更新設定は、Clash Metaの後継として開発されているmihomoカーネルを対象にしています。旧バージョンのClashカーネルや、クライアントに組み込まれたカーネルでは、設定項目の対応状況やデータ保存先が異なる場合があります。まずクライアントの「バージョン情報」またはカーネル情報で、カーネル名とバージョンを確認してください。単独で実行している場合は、mihomo -vを実行します。クライアント名だけを見てGEOSITEに対応していると判断しないでください。

データファイル 格納されるデータ 対応する設定・ルール
country.mmdb MMDB形式のIPアドレス割り当てデータ geodata-mode: falseの場合にGEOIPで使用
geoip.dat GeoData形式のIP分類データ geodata-mode: trueの場合にGEOIPで使用
geosite.dat タグ別に整理されたドメイン集合 GEOSITEで使用。上記のモード切り替えの対象外

情報を調べると、GeoIP.mmdb、Country.mmdb、GeoSite.datといった表記をよく見かけます。これらはプロジェクト上のファイル名、旧来の名称、または概念を表す呼び方の場合があり、実際の読み込み先を示すとは限りません。mihomoで一般的に使われるデータファイル名は表に記載した小文字の名称です。Linuxのファイルシステムでは通常、大文字と小文字が区別されます。また、拡張子が同じでも内容に互換性があるとは限らず、MMDBとDATはファイル名を変えても相互に置き換えられません。

データの入手先:形式と収録タグを確認

MetaCubeX/meta-rules-datプロジェクトが提供するビルド済みデータを利用できます。このプロジェクトでは、対応するカーネル向けにGeoIPやGeoSiteなどのデータを公開しています。入手先を選ぶ際は、ダウンロードURLだけでなく、データの説明も確認してください。IPアドレスの割り当て情報の出典、ドメイン集合の生成方法、収録されているタグ、更新頻度を把握しておきましょう。

  • MMDB:カーネルが読み込める国・地域別の割り当てデータベースであることを確認します。都市データベースやASNデータベースを、同じ用途の代替データとして使わないでください。
  • GeoIP DAT:必要な国・地域コードと、ルールで参照する追加分類が含まれていることを確認します。
  • GeoSite DAT:cnなど、ルールで使用するタグが含まれていることを確認します。軽量版では一部のサービス分類が省かれている場合があります。
  • 更新URL:リポジトリのトップページやブラウザーで表示されるファイルのプレビューではなく、実際のバイナリファイルを取得できる公開URLを指定してください。

この記事の例では、プロジェクトのlatestリリースにあるデータを使用します。このURLは最新の公開内容を指すため、特定のバージョンを固定するものではありません。特定時点の通信振り分けを再現する必要がある場合は、そのときのデータファイルを保存し、取得日、入手元のURL、カーネルのバージョンを記録してください。同じIPアドレスやドメインでも、データの入手先によって分類が異なる場合があります。ファイルの更新日時だけで分類の正確さを判断することはできません。

mihomoの自動更新設定

以下の項目はYAMLのトップレベルに記述し、dnsやrulesと同じ階層に配置します。この例ではMMDBモードを選び、更新間隔を24時間にしています。geo-update-intervalの単位は秒ではなく時間です。モードを切り替えやすいよう、ここでは3種類のデータURLをすべて記載しています。ただし、実際に読み込まれるデータはカーネル、ルールの参照先、読み込み方式によって決まります。

geodata-mode: false
geodata-auto-update: true
geo-update-interval: 24

geox-url:
  geoip: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat"
  geosite: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
  mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb"

設定を重複して追加せず、既存の設定に統合

まず、現在の設定にgeox-urlがすでにあるか検索してください。同じ階層で同じキーを重複して定義しないでください。重複キーの扱いはパーサーによって異なる場合があります。サブスクリプションから設定が生成される場合は、クライアントが対応する永続的なオーバーライドやマージ機能を使ってください。一時的に生成されたファイルを直接編集すると、次回のサブスクリプション更新で変更が上書きされる可能性があります。

geodata-mode: trueに変更すると、GEOIPはgeoip.datを使用します。このモードでcountry.mmdbだけを差し替えても、現在使用中のIPデータは更新されません。GeoSiteは引き続きgeosite.datを使用するため、GeoSiteのためにGEOIPモードを切り替える必要はありません。

初回ダウンロード時の依存関係に注意

自動更新には、カーネルからデータのURLにアクセスできる必要があります。DNSエラー、TLSハンドシェイクエラー、ネットワークのタイムアウトなどで更新が中断することがあります。ダウンロードに、まだ読み込まれていない地理ルールを使っている場合は、起動時に依存関係の問題が起きる可能性もあります。その場合は、まず利用可能なファイルを手動で配置してから更新リクエストの接続経路を調べると、何度も再起動するより問題を特定しやすくなります。

クライアントの「地理データベースを更新」操作と、ノードサブスクリプションの更新は別の処理です。メニュー名はクライアントのバージョンによって異なります。操作後は、カーネルログでダウンロードと読み込みの結果を確認してください。設定にtrueと記載されていても、直前に更新が完了した証拠にはなりません。

手動で差し替える場合:データ保存先を確認してからカーネルを停止

データ保存先は、インストール先やサブスクリプションのYAMLファイルがあるディレクトリとは限りません。GUIクライアントでは、サービスモード用のデータファイルを別に管理している場合があります。クライアントの設定ディレクトリへのリンク、実行ログ、カーネルの起動引数から保存先を確認してください。ディスク内で見つけた同名ファイルを、確認せずに上書きしないでください。

以下では、単独で実行するmihomoを例に説明します。-dでデータディレクトリを明示すると、異なる作業ディレクトリから起動した際に別のファイルを誤って読み込むのを防げます。以下のコマンドはプロジェクトの作業ディレクトリで実行します。正常なmihomo-data/config.yamlがあり、システムにcurlがインストールされている必要があります。

mkdir -p ./mihomo-data

curl -fL --output ./mihomo-data/country.mmdb.new \
  https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb

curl -fL --output ./mihomo-data/geosite.dat.new \
  https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat

-fを指定するとHTTPエラーのステータスコードでコマンドが失敗し、-Lを指定するとリリースファイルのリダイレクトを追跡します。2つのコマンドが成功した後、ファイルのサイズが0バイトではないことと、ゲートウェイから返されたHTMLページではないことを確認してください。ダウンロードの成功はリクエストが完了したことを示すだけです。最終的にはカーネルがファイルを読み込めるか確認してください。

  1. 対象のデータディレクトリを使用しているカーネルを停止します。GUIクライアントでは、クライアントが管理するカーネルまたはサービスを停止してください。別のプロセスを起動してポートを競合させないでください。
  2. 現在のcountry.mmdbとgeosite.datを別のバックアップディレクトリにコピーし、現在の設定も保存します。
  3. ダウンロード済みの.newファイルを、正式なファイル名に変更します。DATモードの場合は、geoip.datをダウンロードし、バックアップしてから置き換えてください。
  4. 同じデータディレクトリを指定して設定をテストし、再起動後にログと実際の接続でルールが適用されたかを確認します。
mv ./mihomo-data/country.mmdb.new ./mihomo-data/country.mmdb
mv ./mihomo-data/geosite.dat.new ./mihomo-data/geosite.dat

mihomo -t -d ./mihomo-data -f ./mihomo-data/config.yaml
mihomo -d ./mihomo-data -f ./mihomo-data/config.yaml

このリネームコマンドは同名ファイルを上書きするため、必ず先にバックアップしてください。設定テストで確認できるのは起動前の基本的な妥当性であり、すべてのアクセス経路を検証するものではありません。失敗したら具体的なエラーを確認し、直前のデータに戻してください。形式の問題とネットワークの問題が混在しないよう、複数の入手先を続けて試すのは避けましょう。

GEOIP・GEOSITEとルールの順序

Clashのルールは通常、上から順に評価され、最初に一致したルールのポリシーが適用されます。以下はルールの一部であり、完全な設定ファイルではありません。プロキシ選択は、既存のproxy-groupsにあるポリシーグループ名と完全に一致させてください。既存の出口名に置き換えることもできます。

rules:
  - DOMAIN-SUFFIX,internal.test,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,プロキシ選択

ドメイン分類とIP分類は同じではない

GEOSITE,cn,DIRECTは、データベース内のcnドメイン集合を使います。「.cnで終わるすべてのドメイン」を表す簡略記法ではありません。GEOIP,CN,DIRECTは接続先IPの割り当て先を検索します。ドメインによってはCDN経由で異なる地域のIPが返るため、この2つのルールで異なる結果になる場合があります。

ドメインルールをIPルールより前に置くと、DNSの結果に依存せず、ドメイン集合に基づいて先に判定できます。ただし、GeoSiteで判定するには、接続情報からドメイン名を取得できる必要があります。アプリがIPアドレスへ直接接続し、ドメイン名を復元する仕組みもない場合、GeoSiteが元のサービスを自動で特定することはできません。

no-resolveの実際の意味

no-resolveは、このIPルールの判定だけを目的としたドメイン名前解決を行わない、という意味です。接続に利用可能な宛先IPがすでに含まれていれば、そのIPでの判定は引き続き行われます。DNS全体を無効にする設定でも、「DNSリクエストを直接接続にする」ためのスイッチでもありません。

そのため、ドメインがGeoSiteに一致せず、後続のGEOIPルールにno-resolveが付いていて、利用可能な宛先IPもない場合は、MATCHまで進むことがあります。これはルールの設計によるもので、データベースの破損とすぐに結論づけるべきではありません。MATCHは最後に置いてください。地理ルールより前に置くと、後続のルールは適用されません。

更新後に反映されない場合:エラーの種類ごとに確認

症状 まず確認する項目 対処方法
GEOSITEルールを認識しない 実行中のカーネルとルールの対応状況 クライアントが古いカーネルを使っていないか確認します。データファイルだけを差し替えても解決しません。
ドメイン集合が見つからないというエラーが出る 現在のgeosite.datに該当タグが含まれているか データの入手先でタグの説明を確認し、ルールを修正するか、該当する集合を含むデータを選びます。
データベースを読み込めない 形式、ファイルサイズ、アクセス権、大文字・小文字 ダウンロードされたファイルがHTMLではないか確認し、読み込み可能なバックアップに戻してから再取得します。
更新は成功したが、ルールの適用結果が変わらない データディレクトリ、モード、ルールの順序、接続の再利用 新しいファイルが読み込まれているか確認し、新しい接続でルールの適用結果を確認します。
定期更新がタイムアウトする データ配布先の名前解決とダウンロードリクエストの経路 まずデータファイルを手動で配置して動作を復旧し、その後、更新経路を調べます。

ウェブページを開けるかではなく、接続ログで確認

テスト時はルールモードにし、確認したいドメインへ実際に接続します。接続パネルで宛先ドメイン、宛先IP、適用されたルール、最終的なポリシーを記録してください。グローバルモードでは、ここで説明したルールの順序を検証できません。ウェブページが開けても、接続経路が1つ使えたことしか分からず、GeoSiteやGeoIPのルールに一致した証拠にはなりません。

データベースを更新しても、既存の接続すべてに新しい振り分けが適用されるとは限りません。テストに使ったページやアプリの古い接続を閉じてから、あらためてリクエストを送ってください。必要に応じて、クライアントの接続管理機能で該当する接続を終了します。それでも期待どおりにならない場合は、まず正確なDOMAINルールでポリシー名とルールの読み込みを確認してから、分類データ自体を調べてください。

更新・ロールバックのチェックリスト

  • カーネルのバージョン、現在のgeodata-mode、データディレクトリ、入手先のURLを記録します。
  • GeoSiteのタグが存在することと、GEOIPがMMDBとDATのどちらを読み込んでいるかを確認します。
  • 古いファイルと設定をバックアップし、ダウンロード用の一時ファイルと正式ファイルを分けておきます。
  • 設定をテストして再読み込みし、新しい接続で適用されたルールを確認します。
  • 問題が起きた場合は、設定と対応するデータをまとめて復元します。新しいルールが、以前のデータにないタグを参照したままにならないよう注意してください。
  • 定期更新を再開した後、次回の更新ログを確認し、永続的なオーバーライドがサブスクリプションの更新で上書きされていないことを確かめます。

GeoIP・GeoSiteの更新では、「ルールが参照する分類」「カーネルが選択する形式」「実際に読み込まれるファイル」の3つを一致させることが重要です。まずこの3点を確認してから、更新間隔を調整してください。ほかの設定項目は設定リファレンスを参照してください。ルール、ポリシーグループ、サブスクリプションの違いについては、用語集もご覧ください。

Clashをダウンロードクライアントとシステム要件