1. CIDR 掩码原理:怎样看懂 192.168.0.0/16?
CIDR(Classless Inter-Domain Routing)是现代网络路由的通用计数法:
- `IP-CIDR,127.0.0.1/32,DIRECT`:`/32` 代表掩码前 32 位全匹配,即**仅仅代表 127.0.0.1 这一个单一 IP**;
- `IP-CIDR,192.168.1.0/24,DIRECT`:`/24` 代表前 24 位匹配,涵盖 `192.168.1.1` 至 `192.168.1.254` 共 254 个主机地址(常见家庭局域网);
- `IP-CIDR,10.0.0.0/8,DIRECT`:`/8` 代表前 8 位匹配,涵盖整个 A 类内网 1600 万个 IP 地址;
- **匹配算法**:Mihomo 使用 **最长前缀匹配树(LPM)**,查找耗时仅需数十纳秒。
💡 在自定义局域网直连网段时,必须准确计算子网掩码,避免写得过大误伤公网 IP。
2. GEOIP 数据库的工作机制与离线查询
在规则中写下 `GEOIP,CN,DIRECT`,内核是如何知道一个 IP 属不属于中国的?
1. **依赖本地数据库(Country.mmdb)**:
工作目录中的 mmdb 文件由 MaxMind 官方维护,预先收录了全球数十亿个 IPv4/IPv6 地址块的国家代码;
2. **纯离线检索**:
查询过程完全在本地内存中完成,**不需要向互联网发起任何网络请求**;
3. **缺陷与盲区**:
对于新分配的跨境 BGP Anycast IP,数据库更新可能存在数周的滞后;部分海外机房的 IP 若被错误标记为 CN,可能导致该机房被错误直连。
yaml
# 生产级 IP-CIDR 与 GEOIP 规范标准写法范例
rules:
# 必须添加 no-resolve 防止域名请求被迫在本地触发多余的 DNS 解析
- IP-CIDR,127.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
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
# 国内 IP 兜底直连
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY 3. no-resolve 参数的底层性能与安全价值
重申 `no-resolve` 的不可替代性:
- 如果没有加 `no-resolve`,当你访问一个从未见过的海外域名时,分流引擎在遍历到 `GEOIP,CN` 时,**为了判定该域名对应的 IP 属不属于中国,被迫在本地发起一次 DNS 查询**;
- 这一多余动作会向本地运营商暴露你正在访问的域名;
- 加上 `no-resolve` 后,内核对于域名请求直接跳过该 IP 规则,让域名继续往下走到最后的 `MATCH,PROXY`,由远端香港或日本节点在远端机房发起干净解析,**兼顾了隐私安全与极速响应**!
❓ 常见疑问与排查步骤
为什么加了 GEOIP,CN,DIRECT 后,有些国内软件还是走代理?
因为那些国内软件在发起连接时使用的是特定的海外 CDN 域名(例如国内某些 App 使用了 AWS 或 Cloudflare 的海外服务),域名规则如果被归类到了海外,会在到达 GEOIP 之前就被拦截送走。
GEOIP 规则支持其他国家代码吗?比如美国或日本?
支持。可以写 `GEOIP,US,美国策略组` 或 `GEOIP,JP,日本策略组`,实现跨国维度的粗粒度地理路由。
Country.mmdb 文件损坏会导致什么后果?
若 mmdb 文件损坏或格式错误,内核在启动时将直接报错闪退。重新下载官方的 mmdb 文件覆盖即可恢复。