一、GeoIPとGeoSiteが担う役割
Clashの分流ルール自体には地理データやサイトデータは内蔵されていません。ルール内のGEOIPとGEOSITEは単なる検索クエリであり、「このIPはどこに属するか」「このドメインはどのカテゴリか」に実際に答えているのは、内核の作業ディレクトリにあるデータベースファイルです。内核起動時にファイルがメモリに読み込まれ、ルールがヒットした際に検索が行われます。ファイルが欠落していたり長期間更新されていないと、分流結果に偏りが生じます。直接接続すべきものが代理を経由し、代理すべきものが直接接続になってしまうのです。
GeoIP:IPの帰属地で判定
GeoIPデータは「IPアドレス帯と地域コード」のマッピングです。ルールGEOIP,CN,DIRECTがヒットした場合、対象IPが中国本土のアドレス帯にあることを示し、接続はそのまま直接接続されます。リクエスト先がドメイン名の場合、内核は先にDNS解決を行ってからデータベースを検索します。ルール末尾にno-resolveを付けると解決処理をスキップでき、対象がすでにIPであるリクエストにのみ有効です。ルール1本のために毎回すべてのドメインを解決する事態を避けられます。mihomoはデフォルトでgeoip.metadb(mmdb形式)を使用し、geodata-modeをtrueに設定するとv2ray形式のgeoip.datに切り替わります。両形式は択一で、ルールの出所に応じて選び、混在させないようにします。
GeoSite:ドメインのカテゴリで判定
GeoSiteデータは「ドメインとカテゴリタグ」のマッピングで、コミュニティが管理するdomain-list-communityプロジェクトから生成され、その成果物がgeosite.datです。よく使われるカテゴリにはcn(中国本土のサイト)、geolocation-!cn(一般的な海外サイト)、google、github、telegram、private(社内ネットワーク・ローカルドメイン)などがあります。1つのカテゴリで数万件のドメインを網羅し、コミュニティの投稿により継続的に増補されるため、DOMAIN-SUFFIXルールを1件ずつ手書きするより効率的で、漏れも少なくなります。
ヒント
GEOSITEルールはドメインのみに一致し、解決処理は発生しません。GEOIPルールはIPのみを対象とします。両者は役割を補い合うため、実際の設定では組み合わせて使うのが一般的です。ドメインは先にGeoSiteで判定し、ヒットしなかった分をGeoIPで帰属地判定にフォールバックさせます。
二、データベースファイルとダウンロード元
mihomoのGEOデータファイルは内核の作業ディレクトリに置かれ、通常config.yamlと同じディレクトリにあります。主なファイルは以下の通りです。
| ファイル | 形式 | 用途 |
|---|---|---|
| geoip.metadb | mmdb | デフォルトのIP帰属地データベース。geodata-modeを有効にしない場合に使用 |
| geoip.dat | v2ray geodata | geodata-mode有効時のIP帰属地データベース |
| geosite.dat | v2ray geodata | GEOSITEルール用のドメインカテゴリデータベース |
| country.mmdb | mmdb | 任意。MaxMind形式の国・地域データベースで、metadbの代替として使用可能 |
| GeoLite2-ASN.mmdb | mmdb | 任意。IP-ASNルールで自治システム(AS)単位に分流する場合に使用 |
デフォルトのダウンロード元はMetaCubeX/meta-rules-datリポジトリのReleaseで、日次ビルドされています。アドレスを変更する場合は、設定内でgeox-urlを指定します。
# config.yaml の一部
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/geoip.metadb"
GitHubに直接接続しづらいネットワーク環境では、到達可能なミラーアドレスに置き換えれば問題ありません。フィールドを空にした場合はデフォルトアドレスにフォールバックします。メモリが限られる環境ではgeodata-loader: memconservativeを別途設定すると、データベース常駐によるメモリ使用量を抑えられます。
三、更新方法:手動と自動
自動更新
geo-auto-update: true
geo-update-interval: 24
geo-auto-updateを有効にすると、内核がgeo-update-intervalで指定した間隔(単位:時間)ごとに最新データベースを自動チェック・ダウンロードし、ダウンロード完了と同時にホットロードされるため再起動は不要です。間隔は24時間で十分です。コミュニティリポジトリは日次ビルドなので、1日1回の更新で追いつけます。間隔を短くしても同じファイルを繰り返しダウンロードするだけで、メリットはありません。
手動更新
- リリースページから
geoip.metadb(geodataモードの場合はgeoip.dat)とgeosite.datをダウンロードし、ファイル名はそのまま保持します。 - 内核の作業ディレクトリに配置します。デスクトップクライアントでは各自の設定ディレクトリ内の内核作業ディレクトリが一般的です。コマンドライン環境ではデフォルトで
~/.config/mihomo/となり、config.yamlと同じディレクトリです。 - 内核を再起動して新しいデータベースを反映させます。パネル上の「Geoデータベース更新」ボタンをクリックするか、外部コントローラーAPIの
PUT /configs/geoを呼び出すことでも、内核に即時再ダウンロード・再読み込みさせられます。
注意
更新失敗の最も多い原因はダウンロード元に到達できないことです。まず現在のネットワークでgeox-urlに指定したアドレスに直接アクセスできるか確認してください。アクセスできない場合はミラーに切り替えるか、手動更新に切り替えます。更新後はログを確認し、geositeとgeoipの読み込み件数が正常かチェックしてください。件数が0またはエラーが出ている場合は、ファイルが破損しているか、ファイル形式がgeodata-modeの設定と一致していないことを示しています。
四、rulesでのGEOデータ参照
ルールの書式はGEOSITE,カテゴリ,ポリシーとGEOIP,地域コード,ポリシーに固定されており、後者は4番目のパラメータとしてno-resolveを任意で追加できます。地域コードは2文字のアルファベットで、例えばCN、US、JPのように記述します。よく使われる例は以下の通りです。
| ルール例 | 意味 |
|---|---|
| GEOSITE,private,DIRECT | 社内ネットワークとローカルドメインは直接接続 |
| GEOSITE,cn,DIRECT | 中国本土のサイトは直接接続 |
| GEOSITE,geolocation-!cn,PROXY | 一般的な海外サイトは代理経由 |
| GEOSITE,github,PROXY | GitHub関連ドメインは代理経由 |
| GEOIP,CN,DIRECT,no-resolve | 対象がすでにIPで、中国本土に帰属する場合は直接接続 |
| GEOIP,CN,DIRECT | ドメインを先に解決し、中国本土に帰属する場合は直接接続 |
マッチング順序は上から下で、ヒットした時点で終了します。ドメイン系ルール(GEOSITE、DOMAIN系)は前方に、GEOIPは後方に配置します。GEOIPを前方に置くと、多数のドメインリクエストが先にDNS解決を強いられ、初回応答が遅くなり、本来不要な解決リクエストも増えてしまいます。「中国本土は直接接続、海外は代理」というよくある末尾の書き方は以下の通りです。
rules:
- GEOSITE,private,DIRECT
- GEOSITE,cn,DIRECT
- GEOSITE,geolocation-!cn,PROXY
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
最後の2行の意味:対象がすでにIPで中国本土に帰属する場合は直接接続、それ以外はすべて代理経由です。「ドメイン解決後に中国本土に帰属する場合も直接接続にしたい」場合は、GEOIPの行のno-resolveを外してください。代償として、前のルールにヒットしなかったすべてのドメインが解決処理されるようになります。
データ量の多いカテゴリはルールセットに切り替えることもできます。meta-rules-datはmrs形式のルールセットファイルも公開しており、rule-providersで必要に応じて参照すれば、読み込みが速く、負荷も低くなります。
rule-providers:
geosite-cn:
type: http
behavior: domain
format: mrs
interval: 86400
path: ./ruleset/geosite-cn.mrs
url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/cn.mrs"
rules:
- RULE-SET,geosite-cn,DIRECT
五、よくある質問
GeoIPとGeoSiteは同時に有効にする必要がありますか?
必須ではありません。ルールにGEOIPしか記述していない場合はgeosite.datは不要です。GEOSITEルールを使う場合のみgeosite.datを用意する必要があります。多くの分流方式では両者を組み合わせて使用します。ドメインリクエストを先にGeoSiteで判定し、ヒットしなかった分をGeoIPで帰属地判定にフォールバックさせます。
自動更新の間隔はどのくらいが適切ですか?
24時間が適切です。コミュニティのデータベースは日次でビルド・公開されているため、1日1回の更新で十分新鮮な状態を保てます。間隔を短くしても同じファイルを繰り返しダウンロードするだけで、実質的なメリットはありません。
更新後も分流結果に変化がない場合は?
順番に確認してください。まず内核を再起動するか設定を再読み込みします。次にファイルが内核が実際に読み込む作業ディレクトリに配置されているか(ブラウザのダウンロードフォルダではないか)を確認します。最後に起動ログでgeositeとgeoipの読み込み件数を確認してください。件数が0またはエラーが出ている場合は、ファイルが破損しているか、ファイル形式がgeodata-modeの設定と一致していないことを示しています。
サブスクリプション設定にgeo関連のフィールドがない場合、追加が必要ですか?
記述しなくても動作します。内核はデフォルトのアドレスから必要なデータベースを自動的にダウンロードします。ミラーアドレスを固定したい、更新間隔を調整したい場合には、オーバーライドまたはグローバル設定にgeox-urlとgeo-auto-updateを追加してください。
geodata-modeは有効にすべきですか?
使用するルールの出所によります。GEOIP、GEOSITEの通常の書き方のみを使う場合はデフォルトのmmdbモードで問題ありません。参照しているルールセットやチュートリアルでgeoip.datが明確に必要とされている場合のみ有効にしてください。有効にした場合はgeoip.datが必ず存在する必要があり、なければGEOIPルールが読み込めず、内核起動時にエラーになります。
六、まとめ
GeoIPはIPを、GeoSiteはドメインを管理します。ファイルを正しいディレクトリに配置し、ダウンロード元に到達可能で、ルールの順序が正しければ分流は安定します。1日1回の自動更新を維持し、コミュニティデータベースの更新に応じてルールの書き方を適宜見直せば十分です。クライアントと内核はプラットフォーム別にダウンロードセンターにまとめてあり、基本設定手順は使用チュートリアルをご覧ください。