一个 DNS 转发器。

Overview

mosdns-cn

一个 DNS 转发器。

  • 上游服务器支持 UDP/TCP/DoT/DoH 协议。支持 socks5 代理。
  • 自带本地/远程 DNS 分流功能。可以根据域名和 IP 分流。
    • 数据可以直接从 v2ray dat 文件载入。
  • 无需配置。一键安装。开箱即用。

参数

  -s, --server:           (必需) 监听地址。会同时监听 UDP 和 TCP。
  -c, --cache:            (可选) 缓存大小。单位: 条。(默认无缓存)
      --min-ttl:          (可选) 应答的最小 TTL。单位: 秒。
      --max-ttl:          (可选) 应答的最大 TTL。单位: 秒。
      --hosts:            (可选) Hosts 表。这个参数可出现多次,会从多个表载入数据。
      --arbitrary:        (可选) Arbitrary 表。这个参数可出现多次,会从多个表载入数据。
      --blacklist-domain: (可选) 黑名单域名表。这些域名会被 NXDOMAIN 屏蔽。这个参数可出现多次,会从多个表载入数据。
      
  # 如果无需分流,配置这个参数:
      --upstream:         (必需) 上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
  
  # 如果需要分流,配置以下参数:
      --local-upstream:   (必需) 本地上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
      --local-ip:         (必需) 本地 IP 地址表。这个参数可出现多次,会从多个表载入数据。
      --local-domain:     (可选) 本地域名表。这些域名会被本地上游解析。这个参数可出现多次,会从多个表载入数据。
      --local-latency:    (可选) 本地上游服务器延时,单位毫秒。指示性参数,防止本地上游被远程上游抢答。
      --remote-upstream:  (必需) 远程上游服务器。这个参数可出现多次来配置多个上游。会并发请求所有上游。
      --remote-domain:    (可选) 远程域名表。这些域名会被远程上游解析。这个参数可出现多次,会从多个表载入数据。

  -v, --debug             更详细的 log。
      --log-file:         将日志写入文件。
      --dir:              工作目录。
      --cd2exe            自动将可执行文件的目录作为工作目录。
      --service:[install|uninstall|start|stop|restart] 控制系统服务。
      --insecure          跳过 TLS 服务器证书验证。
      --ca:               指定 CA 证书(PEM 格式)。这个参数可出现多次。

上游

上游支持 4 种协议。

  • UDP: 8.8.8.8, 208.67.222.222:443
  • TCP: tcp://8.8.8.8
  • DoT: tls://8.8.8.8, tls://dns.google
  • DoH: https://8.8.8.8/dns-query, https://dns.google/dns-query

还支持 3 个格外参数:

  • netaddr 可以手动指定服务器实际网络地址(ip:port)。e.g. tls://dns.google?netaddr=8.8.8.8:853
  • socks5 指定 socks5 代理服务器。UDP 协议暂不支持。e.g. tls://dns.google?socks5=127.0.0.1:1080
  • keepalive 连接复用空连接保持时间。单位: 秒。不同协议默认值不同。DoH: 30,TCP/DoT: 0 (默认禁用连接复用)。
    • 启用连接复用后,只有第一个请求需要建立连接和握手,接下来的请求会在同一连接中直接传送。所以平均请求延时会和 UDP 一样低。
    • 不是什么黑科技,是 RFC 标准。绝大多数知名的公共 DNS 提供商都支持连接复用。比如 Cloudflare,Google,AliDNS。
    • DoH 的连接复用会由 HTTP 自动协商,用户无需手动设置,已启用连接复用支持。
    • 但对于 TCP/DoT 协议,这个选项默认禁用,需手动启用。你可以尝试开启 keepalive,然后用 dig 之类的测试工具观察第一次请求和后续请求的延时变化,判断服务器是否支持连接复用。
    • e.g. tls://dns.google?keepalive=10
  • 如需同时使用多个参数,在地址后加 ? 然后参数之间用 & 分隔
    • e.g. tls://dns.google?netaddr=8.8.8.8:853&keepalive=10&socks5=127.0.0.1:1080

域名表

  • 可以是 v2ray geosite.dat 文件。需用 : 指明类别。
  • 可以是文本文件。一个域名一行。默认子域名匹配。其他匹配规则:
    • domain: 开头或省略,子域名匹配。
    • keyword: 开头,关键字匹配。
    • regexp: 开头,正则匹配(Golang 标准)。
    • full: 开头,完整匹配。

IP 表

  • 可以是 v2ray geoip.dat 文件。需用 : 指明类别。
  • 可以是文本文件。每行一个 IP 或 CIDR,支持 IPv6。

Hosts 表

域名在前,IP 在后。支持多 IP,支持 IPv6。域名默认是完整匹配。

其他匹配规则:

  • full: 开头或省略,完整匹配。
  • domain: 开头,子域名匹配。
  • keyword: 开头,关键字匹配。
  • regexp: 开头,正则匹配(Golang 标准)。

示例:

dns.google 8.8.8.8 2001:4860:4860::8888

Arbitrary 表

Arbitrary 可以构建任意应答。

格式示例:

# [qName]   [qClass]  [qType] [section] [RFC 1035 resource record]
dns.google  IN        A       ANSWER    dns.google. IN A 8.8.8.8
dns.google  IN        A       ANSWER    dns.google. IN A 8.8.4.4
dns.google  IN        AAAA    ANSWER    dns.google. IN AAAA 2001:4860:4860::8888
example.com IN        A       NA        example.com.  IN  SOA   ns.example.com. username.example.com. ( 2020091025 7200 3600 1209600 3600 )
  • qName: 请求的域名。默认是完整匹配。其他匹配规则:
    • full: 开头或省略,完整匹配。
    • domain: 开头,子域名匹配。
    • keyword: 开头,关键字匹配。
    • regexp: 开头,正则匹配(Golang 标准)。
  • qClass, qType: 请求的类型。可以是字符,必须大写,支持绝大数的类型。如不支持,也可以是数字。
  • section: 该资源记录在应答的位置。可以是 ANSWER, NS, EXTRA
  • RFC 1035 resource record: RFC 1035 格式的资源记录 (resource record) 。不支持换行,域名不支持缩写。具体格式可以参考 Zone file 或自行搜索。

如果 qName, qClass, qType 成功匹配请求,则将对应的 RFC 1035 resource record 的记录放在应答 section 部分。然后返回应答。

运行

命令行启动

示例:

mosdns-cn -s :53 --local-upstream https://223.5.5.5/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'

使用 --service 将 mosdns-cn 安装到系统服务

  • 可用于 Windows XP+, Linux/(systemd | Upstart | SysV), and OSX/Launchd 平台。
  • 需要管理员或 root 权限。
  • install--dir 参数时会默认使用程序所在的目录作为工作目录。
  • 安装成功后需手动 mosdns-cn --service start 启动服务。(只需手动启动一次。因为服务虽然会跟随系统自启,但安装成功后并不会)
  • 如需卸载,mosdns-cn --service stop + mosdns-cn --service uninstall

示例:

# 安装
mosdns-cn --service install -s :53 --local-upstream https://223.5.5.5/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 --service start
# 卸载
mosdns-cn --service stop
mosdns-cn --service uninstall

相关连接

Open Source Components / Libraries / Reference

依赖

Issues
  • 关于 apple,google 的一些站点分流逻辑问题

    关于 apple,google 的一些站点分流逻辑问题

    使用目前的配置,查询 a100.phobos.apple.com,得不到国内 IP。而这个地址应该是包含在 geosite.dat:apple-cn 里面的:

    https://github.com/felixonmars/dnsmasq-china-list/blob/51948e34ab9378fc7c9479784a00a185fff09aa0/apple.china.conf#L98

    查询日志:

    2021-12-22T07:55:16.938+0800	debug	cache	cache/cache.go:109	skipped	{"query": "a100.phobos.apple.com. IN A 64617 1 192.168.2.1:44677"}
    2021-12-22T07:55:17.566+0800	debug	remote_upstream	bundled_upstream/bundled_upstream.go:68	response received	{"query": "a100.phobos.apple.com. IN A 64617 1 192.168.2.1:44677", "from": "udp://127.0.0.1:4433"}
    2021-12-22T07:55:17.567+0800	debug	dns_handler/server_handler.go:94	entry returned	{"query": "a100.phobos.apple.com. IN A 64617 1 192.168.2.1:44677", "status": "responded"}
    

    mosdns-cn 并未从 local_upstream 查询?

    注释掉: #remote_domain: ['/root/cfg/geosite.dat:geolocation-!cn'] 则可以返回国内 IP。

    目前不知道 a100.phobos.apple.com 在 geosite.dat:geolocation-!cn 和 geosite.dat:apple-cn 中是怎么个包含关系,导致 mosdns-cn 会直接用 remote_upsteam 查询。

    mosdns-cn 配置片段:

    local_upstream: [127.0.0.1:533]
    local_ip: ['/root/cfg/geoip-only-cn-private.dat:cn']
    local_domain: ['/root/cfg/geosite.dat:cn', '/root/cfg/geosite.dat:apple-cn', '/root/cfg/geosite.dat:google-cn']
    local_latency: 10
    remote_upstream: [127.0.0.1:4433]
    remote_domain: ['/root/cfg/geosite.dat:geolocation-!cn']
    

    说明: 之前我并没有使用 '/root/cfg/geosite.dat:apple-cn', '/root/cfg/geosite.dat:google-cn' 这两个列表,发现有问题,添加了,也没解决。

    geosite 说明:

    @felixonmars/dnsmasq-china-list/apple.china.conf 加入到 geosite:geolocation-!cn 类别中(如希望本文件中的 Apple 域名直连,请参考下面 geosite 的 Routing 配置方式) @felixonmars/dnsmasq-china-list/google.china.conf 加入到 geosite:geolocation-!cn 类别中(如希望本文件中的 Google 域名直连,请参考下面 geosite 的 Routing 配置方式)

    geosite:apple-cn:包含 @felixonmars/dnsmasq-china-list/apple.china.conf 文件里的域名,供希望 Apple 域名直连(不走代理)的用户使用。 geosite:google-cn:包含 @felixonmars/dnsmasq-china-list/google.china.conf 文件里的域名,供希望 Google 域名直连(不走代理)的用户使用。

    mosdns-cn 目前分流逻辑:

    分流模式中上游的转发顺序:

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

    按照这个顺序,"同时转发至本地上游获取应答。" 如果指的是无论是否匹配到 --local-domain--remote-domain 都会执行,那么即使不添加 geosite.dat:apple-cn , 应该也可以返回国内 IP的? 还是这个 " 同时转发至本地上游获取应答。" 只发生在请求域名不匹配两个列表的情况下才会执行? 实际日志中并没有 local_upsteam 的查询动作。

    opened by rampageX 10
  • v1.1 remotedns不生效

    v1.1 remotedns不生效

    同样的规则,1.0.1正常, 1.1 本应该走remote解析的走local解析 mosdns-cn-linux-amd64 用的参数 ./mosdns-cn -s :53 --hosts hosts.txt --local-domain local.txt --remote-domain remote.txt --blacklist-domain blocklist.txt --local-upstream https://223.5.5.5/dns-query?netaddr=223.5.5.5:443 --local-upstream https://doh.pub/dns-query?netaddr=162.14.21.56:443 --local-domain geosite.dat:cn --local-ip geoip.dat:cn --remote-upstream https://***/*?netaddr=****: --remote-domain geosite.dat:geolocation-!cn

    opened by ylx2016 5
  • 请问为什么 --service 可以install done,但无法start?另外 geosite.dat:geolocation-!cn 必须用单引号,如果用双引号就提示 cn event not found。

    请问为什么 --service 可以install done,但无法start?另外 geosite.dat:geolocation-!cn 必须用单引号,如果用双引号就提示 cn event not found。

    ./mosdns-cn --service install -s :5353 -c 512 --blacklist-domain "geosite.dat:category-ads-all" --local-upstream https://223.5.5.5/dns-query --local-domain "geosite.dat:cn" --local-ip "geoip-cn.dat:cn" --remote-upstream 127.0.0.0:7913 --remote-domain 'geosite.dat:geolocation-!cn'

    2021-12-15T04:20:22.143Z info mosdns-cn/main.go:164 install: done

    ./mosdns-cn --service start

    2021-12-15T04:20:30.861Z fatal mosdns-cn/main.go:162 start: "service" failed: exec: "service": executable file not found in $PATH

    opened by jerrell851 3
  • 匹配顺序远程优先 bug?

    匹配顺序远程优先 bug?

    运行命令如下 : ./mosdns-cn -s :7053 -c 1024 --local-upstream 127.0.0.1 --local-domain 'geosite.dat:cn' --local-domain 'geosite.dat:apple-cn' --local-domain 'geosite.dat:google-cn' --local-ip 'geoip.dat:cn' --remote-upstream https://8.8.8.8/dns-query --remote-domain 'geosite.dat:geolocation-!cn' -v

    结果如下: debug mosdns-cn/handler.go:90 [tools.l.google.com. IN A 38689 1] query is remote domain

    geosite.dat:cn 和 geosite.dat:google-cn 里面都是包含域名 tools.l.google.com 的,为什么还会使用远程解析呢?难道远程优先?

    opened by swordsmile 2
  • Openwrt 下 --service start 出错

    Openwrt 下 --service start 出错

    型号:FriendlyElec NanoPi R2S 架构 : ARMv8 Processor rev 4 固件版本:OpenWrt 21.02.1

    直接用预编译版本: mosdns-cn-linux-arm64.zip v1.2.3

    错误提示: [email protected]:~# mosdns-cn --service start 2022-05-23T14:10:49.574Z fatal mosdns-cn/main.go:198 start: "service" failed: exec: "service": executable file not found in $PATH

    但是通过 /etc/init.d/mosdns-cn start 可以顺利启动 mosdns-cn

    另外,请问如何在 Android 下进行? 谢谢!!!

    opened by hzqim 1
  • googleapis.cn被local_upstream抢答到北京电信

    googleapis.cn被local_upstream抢答到北京电信

    配置文件部分如下 local_ip: [geoip.dat:cn] local_domain: [geosite.dat:cn] remote_domain: [geosite.dat:geolocation-!cn,remotedomain.txt]

    我把googleapis.cn写进了remotedomain.txt里面,但是在nslookup查询的时候,依旧被解析到北京电信,查看了log,是被本地电信dns解析了,nslookup services.googleapis.cn 1.1.1.1就是解析到美国谷歌云,导致google play下载的时候一直在pending 请问有什么办法能解决这个问题

    opened by Moebyte 1
  • fix usage for windows os

    fix usage for windows os

    示例的命令在 Windows 系统 cmd 中执行会报错:

    mosdns-cn -s :53 --blacklist-domain 'geosite.dat:category-ads-all' --local-upstream https://223.6.6.6/dns-query --local-domain 'geosite.dat:cn' --local-ip 'geoip.dat:cn' --remote-upstream https://1.1.1.1/dns-query --remote-domain 'geosite.dat:geolocation-!cn'
    2021-12-07T11:28:31.050+0800    info    mosdns-cn/main.go:190   mosdns-cn ver: 1.1.3
    2021-12-07T11:28:31.062+0800    info    mosdns-cn/main.go:191   arch: amd64, os: windows, go: go1.16.10
    2021-12-07T11:28:31.063+0800    fatal   mosdns-cn/main.go:195   failed to init entry, failed to init blacklist, failed to load file 'geosite.dat:category-ads-all': open 'geosite.dat: The system cannot find the file specified.
    

    原因是单引号被当成了路径的一部分。

    改成双引号后可以解决问题。

    mosdns-cn -s :53 --blacklist-domain "geosite.dat:category-ads-all" --local-upstream https://223.6.6.6/dns-query --local-domain "geosite.dat:cn" --local-ip "geoip.dat:cn" --remote-upstream https://1.1.1.1/dns-query --remote-domain "geosite.dat:geolocation-!cn"
    2021-12-07T11:39:58.105+0800    info    mosdns-cn/main.go:190   mosdns-cn ver: 1.1.3
    2021-12-07T11:39:58.118+0800    info    mosdns-cn/main.go:191   arch: amd64, os: windows, go: go1.16.10
    2021-12-07T11:39:58.388+0800    info    mosdns-cn/main.go:218   server started
    

    此修改应该不会影响其他系统,但限于我没有环境,所以 没有测试

    opened by imaegoo 1
  • 嘿嘿,尾行~小 Bug,-c 参数不指定默认无缓存

    嘿嘿,尾行~小 Bug,-c 参数不指定默认无缓存

    如题,设计就是默认没有缓存?

    还有范例中: --remote-domain geosite.dat:geolocation-!cn

    这个后面不加引号在 bash 下运行会出错 -bash: !cn: event not found,应该为: --remote-domain 'geosite.dat:geolocation-!cn'

    opened by rampageX 1
  • 1.3.0 载入 geosite.dat 出错

    1.3.0 载入 geosite.dat 出错

    fatal mosdns-cn/main.go:251 failed to init entry, failed to load local domain file, failed to load entry /root/cfg/geosite.dat:cn: unsupported match type [/root/cfg/geosite.dat]

    返回 1.2.3 正常

    opened by rampageX 0
  • 国内的域名为什么需要等待国外组的返回?是BUG还是原本的设计逻辑就是这样?

    国内的域名为什么需要等待国外组的返回?是BUG还是原本的设计逻辑就是这样?

    实测如下: 配置了国外组2个服务器8.8.8.8,8.8.4.4,国内组2个服务器114.114.114.114,119.29.29.29,禁用缓存,国内组加上chnroute列表,版本V1.2.3,上级路由挂上美国VPN,按目的地分流国外IP自动走VPN。 国内组添加1个域名:qq.com 国外组添加1个域名:google.com 测试qq.com和google.com都正常,各组内的2个服务器是并行请求,在上级路由封掉其中1个也都能正常反回,即是并行请求,最快反回的立即采用。

    但如果测试的是baidu.com问题就来了:

    1. 延时变大,请求延时是VPN 延时200+MS
    2. 在上级路由禁掉国外的2组服务器后DNS解释失败了

    这情况不是可以直接采用国内组反回的结果吗??? 国内域名等待国外组反回会变得很慢,有时候VPN断了直接就解释不出来了。。。

    opened by hleungg 0
  • 把 mosdns-cn 放到 AUR 上了

    把 mosdns-cn 放到 AUR 上了

    看到 AUR 上只有 mosdns,没有 mosdns-cn,就把 mosdns-cn 放在 AUR 上了。

    • https://aur.archlinux.org/packages/mosdns-cn/
    • https://aur.archlinux.org/packages/mosdns-cn-bin/
    opened by fenprace 0
Releases(v1.4.0)
Owner
Irine Sistiana
lived, existed, loved.
Irine Sistiana
DNS Ping: to check packet loss and latency issues with DNS servers

DNSping DNS Ping checks packet loss and latency issues with DNS servers Installation If you have golang, easiest install is go get -u fortio.org/dnspi

Fortio (Φορτίο) 55 May 30, 2022
Verify IP addresses of respectful crawlers like Googlebot by reverse dns and forward dns lookups

goodbots - trust but verify goodbots verifies the IP addresses of respectful crawlers like Googlebot by performing reverse dns and forward dns lookups

Eric Wu 29 Jun 21, 2022
The Dual-Stack Dynamic DNS client, the world's first dynamic DNS client built for IPv6.

dsddns DsDDNS is the Dual-Stack Dynamic DNS client. A dynamic DNS client keeps your DNS records in sync with the IP addresses associated with your hom

Ryan Young 10 Jun 20, 2022
netcup DNS module for caddy: dns.providers.netcup

netcup DNS module for Caddy This package contains a DNS provider module for Caddy. It can be used to manage DNS records with the netcup DNS API using

null 6 Mar 3, 2022
A fork on miekg/dns (since I've already forked zmap/dns)

Alternative (more granular) approach to a DNS library Less is more. Complete and usable DNS library. All Resource Records are supported, including the

null 0 Jan 19, 2022
A simple DNS forwarder that forwards DNS queries to various upstreams

A simple DNS forwarder that forwards DNS queries to various upstreams. If an upstream returns NXDomain, the next upstream is tried.

null 1 May 10, 2022
DNS library in Go

Alternative (more granular) approach to a DNS library Less is more. Complete and usable DNS library. All Resource Records are supported, including the

Miek Gieben 6.4k Jun 30, 2022
A client software for acme-dns with emphasis on usability and guidance through setup and additional security safeguard mechanisms

acme-dns-client A client software for acme-dns with emphasis on usability and guidance through setup and additional security safeguard mechanisms. It

null 60 Jun 9, 2022
Network-wide ads & trackers blocking DNS server

Privacy protection center for you and your devices Free and open source, powerful network-wide ads & trackers blocking DNS server. AdGuard.com | Wiki

AdGuard 11.9k Jun 21, 2022
A tiny command line DNS client with support for UDP, DoT, DoH, and DoQ.

q A tiny command line DNS client with support for UDP, DoT, DoH, and DoQ. Usage q command line DNS client (https://github.com/natesales/q) Usage: q

Nate Sales 665 Jun 21, 2022
Fast Private DNS,提供自定义的DNS记录配置和DNS解析缓存。

fpdns Fast Private DNS,提供自定义的DNS记录配置和DNS解析缓存。 特性: A记录 CNAME 泛解析 DNS负载均衡 缓存DNS解析结果 上游同时多DNS Server查询 各系统测试情况 Linux: 已稳定运行3年多 Darwin: 已开发测试 Windows: 未测试

QLeelulu 24 Nov 4, 2021
Information Gathering tool - DNS / Subdomains / Ports / Directories enumeration

Information Gathering tool - DNS / Subdomains / Ports / Directories enumeration

gilfoyle97 464 Jun 28, 2022
Privacy important, fast, recursive dns resolver server with dnssec support

?? Privacy important, fast, recursive dns resolver server with dnssec support Installation go get github.com/semihalev/sdns Pre-build Binaries Downloa

Yasar Alev 704 Jun 27, 2022
IONOS DNS module for caddy

This package contains a DNS provider module for Caddy. It is used to manage DNS records with the IONOS DNS API using libdns-ionos..

null 5 May 19, 2022
sonarbyte is a simple and fast subdomain scanner written in go to extract subdomain from Rapid7's DNS Database using omnisint's api.

sonarbyte Description Sonarbyte is a simple and fast subdomain scanner written in go to extract subdomains from Rapid7's DNS Database using omnisint's

Chan Nyein Wai 24 Mar 31, 2022
A simple tool to detect WAN IP changes and updates your cloudflare DNS entries.

Cloudflare IP Updater A simple tool to detect WAN IP changes and updates your cloudflare DNS entries. Usage Create a new Cloudflare API token Copy the

AJ 11 Dec 10, 2021
Designed to support DNS brute-forcing with a minimal number of network connections

Fast Use of DNS Resolvers Designed to support DNS brute-forcing with a minimal number of network connections. Installation go get -v -u github.com/caf

Jeff Foley 28 Jun 24, 2022
High performance DNS over HTTPS client & server

DNS-over-HTTPS Client and server software to query DNS over HTTPS, using Google DNS-over-HTTPS protocol and IETF DNS-over-HTTPS (RFC 8484). Guides Tut

Star Brilliant 1.5k Jun 25, 2022
dynflare is a tool to automatically update dns records at Cloudflare, when the ip changes.

dynflare dynflare is a tool to automatically update dns records at Cloudflare, when the ip changes. How it works The current ips are determined by ask

Lukas Dietrich 0 Dec 7, 2021