一个 DNS 转发/代理软件。
wiki: https://irine-sistiana.gitbook.io/mosproxy-wiki/
支持 Loyalsoldier/v2ray-rules-dat
等使用 V2Ray protobuf 格式的本地 geosite.dat 和 geoip.dat 文件。
先将文件下载到本机,再在 router 配置中引用:
servers:
- tag: local
protocol: udp
listen: 127.0.0.1:5353
upstreams:
- tag: domestic
addr: udp://223.5.5.5:53
- tag: default
addr: udp://1.1.1.1:53
domain_sets:
- tag: cn
geosite:
- file: /etc/mosproxy/geosite.dat
codes: [cn, "google@cn"]
- tag: ads
geosite:
- file: /etc/mosproxy/geosite.dat
codes: [category-ads-all]
rules:
- domain: ads
reject: 3 # NXDOMAIN
- domain: cn
forward: domestic
- forward: default
# 秒。配置 dat 后,0(默认)表示每 30 秒检查一次。
# 正数:指定间隔,并检查所有已注册的规则文件;-1:关闭自动检查。
reload_interval: 30
# 可选:仅监听可信的本机地址,接口没有身份验证。
api:
addr: 127.0.0.1:8080domain_sets[].files 仍支持原有文本规则,可与 geosite 同时使用;
多个文件、多个 codes 取并集。分类名不区分大小写,支持
分类@属性、分类@!属性,多个 @属性 表示同时满足;属性按是否存在筛选。
支持完整域名、根域名(包括子域名)、关键字和正则四种规则。
文件路径与原有 files 一致,相对路径以进程工作目录为基准。
geoip.dat 可用于 ECS 区域标记(不是 DNS 应答 IP 分流):
ecs:
enabled: true
geoip:
- file: /etc/mosproxy/geoip.dat
codes: [cn, us]ECS 区域名为小写分类名,可供原有 zone_overwrite 使用。
同一 GeoIP 数据源中选择的 CIDR 不能重叠,否则加载失败;
不要把国家分类和包含这些网段的运营商分类混在同一数据源中。
不支持将 inverse_match 分类用作 ECS 区域。
原有 ecs.ip_zone 文本文件仍受支持,优先于 geoip 数据源匹配。
自动检查读取文件内容并比较 SHA-256,因此支持同名替换、符号链接目标变化,
以及保留时间戳的更新。所有数据加载成功后才提交;任一文件读取或解析失败时,
继续使用上次成功加载的数据并记录错误,下次检查会重试。
查询无需等待解析完成,各文件通过原子指针切换;多个文件不保证在同一查询时刻同时切换。
未配置 dat 且 reload_interval 为 0 时,保持原有手动重载行为。
也可以随时调用原有接口立即重载:
curl --fail http://127.0.0.1:8080/ctl/reloadmosproxy 不自动从远程下载更新。外部定时任务下载完成并校验后,
应在同一目录用 mv 原子替换正式文件,避免读到下载中的不完整内容:
cd /etc/mosproxy
curl --fail --location --output geosite.dat.new \
https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat && \
mv geosite.dat.new geosite.dat热重载更新规则数据,不重读 YAML 配置。分类、路径、间隔等配置变更仍需重启。 已在处理的请求可以使用旧规则;DNS 缓存遵循现有缓存策略,不会因重载自动清空。
开发验证:go test ./... 与 go test -race ./app/router ./internal/geodata。
如需验证真实文件,将 geosite.dat、geoip.dat 分别保存为
mosproxy-geosite.dat、mosproxy-geoip.dat,然后运行
MOSPROXY_DAT_TEST_DIR=/path/to/files go test ./internal/geodata -run TestRealDat。