IrineSistiana / mosdns-cn

A simple DNS forwarder that can make life easier. (Not maintained)
GNU General Public License v3.0
323 stars 46 forks source link
chinadns dns dns-over-https dns-over-tls mosdns

mosdns-cn

一个 DNS 转发器。

参数和命令

  -s, --server:           (必需) 监听地址。会同时监听 UDP 和 TCP。

  -c, --cache:            内置内存缓存大小。单位: 条。
      --redis-cache:      Redis 外部缓存地址。
                          TCP 连接: `redis://<user>:<password>@<host>:<port>/<db_number>`
                          Unix 连接: `unix://<user>:<password>@</path/to/redis.sock>?db=<db_number>`
      --lazy-cache-ttl:   Lazy cache 生存时间。单位: 秒。大于零会启用 lazy cache 缓存机制。
                          建议值: 86400(1天)~ 259200(3天)
      --lazy-cache-reply-ttl: Lazy cache 返回的过期应答的 TTL。单位: 秒。默认 30。

      --min-ttl:          应答的最小 TTL。单位: 秒。
      --max-ttl:          应答的最大 TTL。单位: 秒。

      --hosts:            Hosts 表。这个参数可出现多次,会从多个表载入数据。
      --blacklist-domain: 黑名单域名表。这些域名会被 NXDOMAIN 屏蔽。这个参数可出现多次,会从多个表载入数据。
      --ca:               指定验证服务器身份的 CA 证书。PEM 格式,可以是证书包(bundle)。这个参数可出现多次来载入多个文件。
      --insecure          跳过 TLS 服务器身份验证。谨慎使用。
  -v, --debug             更详细的调试 log。可以看到每个域名的分流的过程。
      --log-file:         将日志写入文件。

  # 上游
  # 如果无需分流,只需配置下面这个参数:
      --upstream:         (必需) 上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
  # 如果需要分流,配置以下参数:
      --local-upstream:   (必需) 本地上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
      --local-ip:         本地 IP 地址表。这个参数可出现多次,会从多个表载入数据。
      --local-domain:     本地域名表。这个参数可出现多次,会从多个表载入数据。
      --local-latency:    本地上游服务器延时,单位毫秒。默认: 50。指示性参数,保护本地上游不被远程上游抢答。
      --remote-upstream:  (必需) 远程上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
      --remote-domain:    远程域名表。这个参数可出现多次,会从多个表载入数据。

   # 其他
      --config:           从 yaml 配置文件载入参数。
      --dir:              工作目录。
      --cd2exe            自动将可执行文件的目录作为工作目录。

   # 小工具命令
      --service [install|uninstall|start|stop|restart] 控制系统服务。
      --gen-config:       生成一个 yaml 配置文件模板到指定位置。
      --version           打印程序版本。

yaml 配置支持以下参数:

server_addr: ""
cache_size: 0
lazy_cache_ttl: 0
lazy_cache_reply_ttl: 0
redis_cache: ""
min_ttl: 0
max_ttl: 0
hosts: []
blacklist_domain: []
insecure: false
ca: []
debug: false
log_file: ""
upstream: []
local_upstream: []
local_ip: []
local_domain: []
local_latency: 50
remote_upstream: []
remote_domain: []
working_dir: ""
cd2exe: false

使用示例

仅转发,不分流:

mosdns-cn -s :53 --upstream https://8.8.8.8/dns-query

根据 V2Ray 路由规则文件加强版geosite.dat 域名和 geoip.dat IP 资源分流本地/远程域名并且屏蔽广告域名。下载这两个文件放在 mosdns-cn 的目录以下命令就可以直接使用了。

mosdns-cn -s :53 --blacklist-domain "geosite.dat:category-ads-all" --local-upstream https://1.12.12.12/dns-query --local-domain "geosite.dat:cn" --local-ip "geoip.dat:cn" --remote-upstream https://8.8.8.8/dns-query --remote-domain "geosite.dat:geolocation-!cn"

使用配置文件:

# 生成一个配置文件模板到当前目录。
mosdns-cn --gen-config ./my-config.yaml
# 编辑配置。
# 载入配置文件。
mosdns-cn --config ./my-config.yaml

使用 --service 将 mosdns-cn 注册到系统服务实现开机自启

示例:

# 安装成系统服务(注册启动项) 
# mosdns-cn --service install [+其他参数...]
mosdns-cn --service install -s :53 --upstream https://8.8.8.8/dns-query

# 安装成功后需手动启动服务才能使用。因为服务只会跟随系统自启,安装成功后并不会。
mosdns-cn --service start

# 卸载
mosdns-cn --service stop
mosdns-cn --service uninstall

详细参数说明

lazy cache 缓存

lazy cache 的设计参考了 RFC 8767。应答会在缓存中存留 --lazy-cache-ttl 秒。应答自身的 TTL 仍然有效,如果请求命中过期的应答,则缓存会立即返回 TTL 为 --lazy-cache-reply-ttl 的应答,然后自动在后台发送请求更新数据。

相比强行修改增加应答自身的 TTL 的方法,lazy cache 能提高命中率,同时还能保持数据新鲜度。

上游 upstream

省略协议默认为 UDP 协议。省略端口号会使用协议默认值。

地址 URL 中还可以设定以下参数:

域名表

IP 表

Hosts 表

注: 虽然都叫 hosts,但 mosdns-cn 所用的格式和平常 Win,Linux 系统内的那个 hosts 文件不一样。

格式:

格式示例:

# [域名匹配规则] [IP...]
dns.google 8.8.8.8 2001:4860:4860::8888 ...

程序运行顺序

  1. 查找 hosts
  2. 查找 blacklist-domain 域名黑名单
  3. 查找 cache 缓存
  4. 转发至上游/进行分流

分流模式

mosdns-cn 会根据用户提供的数据采用以下分流模式。

配置了 --local-ip 本地 IP

  1. 如果请求的域名匹配到 --local-domain 本地域名。则直接使用 --local-upstream 本地上游。结束。
  2. 如果请求的域名匹配到 --remote-domain 远程域名。则直接使用--remote-upstream 远程上游。结束。
  3. 非 A/AAAA 类型的请求将直接使用 --local-upstream 本地上游。结束。
  4. 同时转发至本地和远程上游获取应答。
  5. 如果本地上游的应答包含 --local-ip 本地 IP。则直接采用本地上游的结果。结束。
  6. 否则采用远程上游的结果。结束。

只配置了 --local-domain 本地域名

  1. 如果请求的域名匹配到 --local-domain 本地域名。则直接使用 --local-upstream 本地上游。结束。
  2. 其他所有请求会使用 --remote-upstream 远程上游。结束。

只配置了 --remote-domain 远程域名

  1. 如果请求的域名匹配到 --remote-domain 远程域名。则直接使用--remote-upstream 远程上游。结束。
  2. 其他所有请求会使用 --local-upstream 本地上游。结束。

域名匹配规则

域名规则有多个匹配方式 (和 v2fly/domain-list-community 一致):

匹配优先级(和 v2ray 优先级逻辑一致): full > domain > regexp > keyword

更多功能

如果需要更多功能,比如自定义分流策略,配合 ipset/nftable 实现动态路由等,请使用 mosdns

Open Source Components / Libraries / Reference

依赖