mosdns是一个简单的dns转发器,这里我用它来配置我的内网dns。

clash配置

这里mosdns并不是单兵作战,我搭配了ShellClash一起使用,下面简单说一下clash的配置,详细教程可以参考这里

  1. 使用meta内核
  2. clash运行模式为TUN模式
  3. DNS运行模式使用fakeip
  4. 取消53端口劫持

在没有配置mosdns之前,如果我们启用53端口的劫持,那么也是可以正常使用的。只不过这种情况下,我们查询所有地址都会返回一个fakeip,这在某些情况下是不必要的,如果某个域名是直连的,那么dns就会多查询一次(fakeip和真正的dns查询)。具体可以参考这篇文章:https://blog.skk.moe/post/what-happend-to-dns-in-proxy/

mosdns配置

那么为了避免这种不必要的查询,我们可以自己搭建一个dns转发服务,设置白名单或者黑名单,来控制哪些域名可以直接查询,哪些域名需要代理查询。这里使用mosdns作为我们的内网dns服务器。我使用的mosdns版本为v5.1.3-0-gac99eb1 ,主机是Hyper-V下的Debian11虚拟机。具体的安装步骤就省略了,下面这份配置参考了这里,并修改了比较多的部分:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
log:
  level: warn

plugins:
  # 缓存
  - tag: cache
    type: cache
    args:
      size: 10240
      lazy_cache_ttl: 86400

  # 转发至国内DNS,并发查询,自己可以根据实际情况修改并发数量
  - tag: forward_local
    type: forward
    args:
      concurrent: 4
      upstreams:
        - addr: udp://202.103.24.68 # 这里填的是宽带运营商的DNS
        - addr: udp://119.29.29.29
        - addr: udp://223.5.5.5
        - addr: udp://114.114.114.114

  # 转发至clashDNS,返回FakeIP
  - tag: forward_fakeip
    type: forward
    args:
      concurrent: 1
      upstreams:
        - addr: udp://127.0.0.1:1053 # 这里mosdns在同一台机器并且使用clash的默认dns端口

  # 自定义hosts
  - tag: hosts
    type: hosts
    args:
      files:
        - "/etc/mosdns/hosts"

  # 主运行序列
  - tag: main
    type: sequence
    args:
      - exec: debug_print query # 记录一下查询日志,可删除
      - exec: query_summary summary # 同上

      - exec: $hosts
      - matches:
          - has_resp
        exec: accept

      - matches:
          - qtype 65
        exec: reject 3

      - matches:
          - qname &/etc/mosdns/reject-list.txt &/etc/mosdns/my-reject-list.txt
        exec: reject 3

      # 为自己的DDNS域名单独设置存活时间
      - matches:
          - qname yourddnsdomain
        exec: ttl 10
      # DDNS域名不查询缓存
      - matches: "!qname yourddnsdomain"
        exec: $cache
      - matches:
          - has_resp
        exec: accept

      - matches:
          - qname &/etc/mosdns/direct-list.txt &/etc/mosdns/my-direct-list.txt
        exec: $forward_local
      - matches:
          - has_resp
        exec: accept

      - exec: $forward_fakeip

  # 启动 udp 和 tcp 服务器
  - type: udp_server
    args:
      entry: main
      listen: :53
  - type: tcp_server
    args:
      entry: main
      listen: :53

除了这份config.yaml配置文件,你的/etc/mosdns目录下还需要有以下文件:

  • hosts mosdns的hosts,和Linux、Windows等系统中的hosts文件的格式不一样,参考这里
  • direct-list.txt 直连域名,我的是来自这里
  • my-direct-list.txt 自定义的直连域名,格式同上
  • reject-list.txt 广告域名,我的是来自这里
  • my-reject-list.txt 自定义广告域名,格式同上

简单解释

下面简单解释一下上述配置,先查hosts,然后过滤广告,然后查缓存(自己的DDNS域名不查),然后检查是否是直连域名,最后没有匹配上述情况的一律转发到clash的内置dns,也就是会返回一个fakeip。

我使用的是白名单的方式,不过我这里是存在误杀的,也就是会有部分直连域名会查询一个fakeip然后再查询一次真正的dns。原因是clash中的直连规则和这里的域名没有保持统一,后面我有时间再优化一下,理论上是可以做到完美匹配的。

你也可以使用黑名单的方式,设置一个代理列表,然后只有这个列表里面的才转发的clash的内置dns。

总结

这份配置是昨天配好的,目前使用没有遇到什么问题,用起来很舒服,后面如果遇到其他问题再优化好了。