起因

由于近期dns污染严重,域名解析不正常,故设置doh,dns分流进行dns解析。

配置

dnsmasq

通过dnsmasq-china-list进行dns分流

安装

git clone https://github.com/felixonmars/dnsmasq-china-list

cd dnsmasq-china-list&&bash install.sh

sudo systemctl restart dnsmasq //重启dnsmasq

效果

重启dnsmasq太慢,且解析速度下降

mosdns+dnsmasq

安装

mosdns

wget https://github.com/IrineSistiana/mosdns/releases/download/v4.1.9/mosdns-linux-amd64.zip

unzip mosdns-linux-amd64.zip

sudo mkdir /etc/mosdns

sudo cp mosdns /usr/bin

sudo cp config.yaml /etc/mosdns //配置文件

wget --no-check-certificate https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -O /etc/mosdns/geosite.dat 

wget --no-check-certificate https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat -O /etc/mosdns/geoip-only-cn-private.dat //中国ip名单

配置文件

log:
  level: warn
  file: "mosdns.log"

data_providers:
- tag: geosite
  file: ./geosite.dat
  auto_reload: true
- tag: geoip
  file: ./geoip-only-cn-private.dat
  auto_reload: true

plugins:
# 缓存
- tag: cache
  type: cache
  args:
    size: 4096
    lazy_cache_ttl: 172800

# 转发至本地服务器的插件
- tag: forward_local
  type: fast_forward
  args:
    upstream:
      - addr: tls://223.6.6.6:853 #alidns
        enable_pipeline: true

      - addr: tls://119.29.29.29:853 #dnspod
        idle_timeout: 8
        trusted: true

# 转发至远程服务器的插件
- tag: forward_remote
  type: fast_forward
  args:
    upstream:
      - addr: https://1.1.1.1/dns-query #cloudflare
        enable_pipeline: true

      - addr: https://dns.google/dns-query #google
        enable_pipeline: true
        trusted: true


# 匹配本地域名的插件
- tag: query_is_local_domain
  type: query_matcher
  args:
    domain:
      - 'provider:geosite:apple-cn'
      - 'provider:geosite:cn'

# 匹配非本地域名的插件
- tag: query_is_non_local_domain
  type: query_matcher
  args:
    domain:
      - 'provider:geosite:geolocation-!cn'

# 匹配广告域名的插件
- tag: query_is_ad_domain
  type: query_matcher
  args:
    domain:
      - 'provider:geosite:category-ads-all'

# 匹配本地 IP 的插件
- tag: response_has_local_ip
  type: response_matcher
  args:
    ip:
      - 'provider:geoip:cn'

# 主要的运行逻辑插件
# sequence 插件中调用的插件 tag 必须在 sequence 前定义,
# 否则 sequence 找不到对应插件。
- tag: main_sequence
  type: sequence
  args:
    exec:
      # 缓存
      - cache

      # 屏蔽广告域名
      - if: query_is_ad_domain
        exec:
          - _new_nxdomain_response
          - _return

      # 已知的本地域名用本地服务器解析
      - if: query_is_local_domain
        exec:
          - forward_local
          - _return

      # 已知的非本地域名用远程服务器解析
      - if: query_is_non_local_domain
        exec:
          - forward_remote
          - _return

        # 剩下的未知域名用 IP 分流。
        # primary 从本地服务器获取应答,丢弃非本地 IP 的结果。
      - primary:
          - forward_local
          - if: "(! response_has_local_ip) && [_response_valid_answer]"
            exec:
              - _drop_response
        # secondary 从远程服务器获取应答。
        secondary:
          - forward_remote
        # 这里建议设置成 local 服务器正常延时的 2~5 倍。
        # 这个延时保证了 local 延时偶尔变高时,其结果不会被 remote 抢答。
        # 如果 local 超过这个延时还没响应,可以假设 local 出现了问题。
        # 这时用就采用 remote 的应答。单位: 毫秒。
        fast_fallback: 200

servers:
- exec: main_sequence
  listeners:
    - protocol: udp
      addr: 127.0.0.1:1053 #监听1053端口
    - protocol: tcp
      addr: 127.0.0.1:1053

新建systemd服务

[Unit]
Description=mosdns Service
Documentation=https://irine-sistiana.gitbook.io/mosdns-wiki/
After=network.target

[Service]
NoNewPrivileges=true
ExecStart=/usr/bin/mosdns start -c /etc/mosdns/config.yaml -d /etc/mosdns/
Restart=on-failure

[Install]
WantedBy=multi-user.target

dnsmasq

配置文件

sudo vim /etc/dnsmasq.d/local.conf
no-hosts
no-resolv
server=127.0.0.1#1053 #将dns请求转发到1053端口

重启dnsmasq

sudo systemctl restart dnsmasq

效果

还行,过一段时间试试