科学上网 / 系统运维

玩转路由器:自建DNS实现国内外分流,网络体验全新升级

浅时光博客 · 7月18日 · 2023年 · · 27758次已读

一、前提说明

本文紧密结合之前关于 Redmi AX6000 路由器的内容,旨在实现一个关键目标:通过国内外DNS分流优化,解决DNS污染问题。我们采用了 mosdns 进行实际操作并进行了详细测试。经过一段时间的实际应用,我们发现这一方法在性能表现上表现不俗,符合预期效果

提示:请参考上面的文章解锁SSH,不然下面的操作无法进行。

二、mosdns介绍

mosdns 是一个插件化的 DNS 转发器。用户可以按需定制自己的 DNS 处理逻辑。

mosdns 自带的功能:

  • 匹配器:
    • 匹配请求的特性。域名,类型,来源 IP 等。
    • 匹配应答的特性。应答 IP,CNAME 等。
  • 功能:
    • 启动 UDP, TCP, DoT, DoH 服务器。
    • 转发请求至上游服务器。支持 UDP, TCP, DoT, DoH 。
    • 缓存原文链接:https://www.dqzboy.com应答。
    • 自动判断域名是否是双栈域名然后屏蔽 IPv4/6 请求,不会影响纯 IPv6/4 域名。
    • 在请求上附加预设 ECS。
    • 修改应答的 TTL。
    • 为域名设定 IP。(hosts)
    • 返回包含特定 IP 应答。(blackhole)
    • 替换(重定向)请求的域名。请求域名 A,但返回域名 B 的记录。(redirect)
    • 手动构建包含任意记录的应答。(arbitrary)
    • 用 IP 反查经过 mosdns 处理的域名。可响应 PTR 请求,也可通过 HTTP 接口查询。(reverse_lookup)
    • 动态路由: 将应答 IP 写入 ipsetnftables

三、mosdns安装

2.1:下载安装文件

  • 首先下载 mosdns 压缩包,在电脑上解压并压缩,然后通过winscp或者scp传到路由器

2.2:压缩执行文件

.\upx --best C:\Users\dqzboy\Desktop\mosdns

2.3:安装配置mosdns

2.3.文章来源(Source):https://www.dqzboy.com1:上传执行文件

  • 将上面压缩后的mosdns执行文件上传到路由器,或者不知道如何上传,也可以把执行文件上传到第三方的存储中,然后在路由器上通过 wget 方式下载下来
mkdir -p /data/mosdns
cd /data/mosdns

2.3.2:添加规则配置

实现按域名分流,直连的使用阿里、腾讯DNS,并且开启乐观缓存,匹配到GFW的转发到clash并且不缓存,由clash管理fake-ip持久化;使用广告域名列表实现去广告;fallback的可以根据解析出来的IP决定是直连还是转发给clash。直连的那些域名,用阿里、腾讯的IPV4解析,fallbackr的由阿里腾讯的doh解析。clash只管代理GFW

vim config.yaml

# 日志
log:
  level: info

# 缓存
plugins:
  - tag: lazy_cache
    type: cache
    args:
      size: 20000
      lazy_cache_ttl: 172800
      dump_file: ./cache.dump
      dump_interval: 300

  # 直连域名使用的DNS服务器
  - tag: local
    type: forward
    args:
      concurrent: 2
      upstreams:
        - addr: 223.5.5.5
        - addr: 119.29.29.29

  # fallback的由doh类型DNS服务器解析
  - tag: local_fallback
    type: forward
    args:
      concurrent: 2
      upstreams:
        - tag: ali_doh
          addr: "https://dns.alidns.com/dns-query"
          bootstrap: "223.5.5.5"
          enable_pipeline: true
          max_conns: 10
        - tag: tencent_doh
          addr: "https://doh.pub/dns-query"
          bootstrap: "119.29.29.29" 
          enable_pipeline: true
          max_conns: 10

  # 转发至clash;这里我的clash启用DNS,监听端口设置为1053
  # https://lancellc.gitbook.io/clash/clash-config-file/dns
  - tag: clash
    type: forward
    args:
      upstreams:
        - addr: :1053

  # 直连域名列表清单
  - tag: direct_domains
    type: domain_set
    args:
      files: ./direct-list.txt

  # gfw 域名列表清单
  - tag: gfw_domains
    type: domain_set
    args:
      files: ./gfw.txt

  # 广告域名列表清单
  - tag: ad_domains
    type: domain_set
    args:
      files: ./reject-list.txt

  # CN-IP
    # direct domains
  - tag: cn_ip
    type: ip_set
    args:
      files: ./china_ip_list.txt  

  # 直连域名序列,使用阿里、腾讯,并使用乐观缓存
  - tag: direct
    type: sequence
    args:
      - exec: $lazy_cache
      - matches: has_resp
        exec: accept
      - exec: $local
      - matches: has_resp
        exec: accept

  # gfw域名序列,交由clash解析代理
  - tag: gfw
    type: sequence
    args:
      - exec: $clash
      - exec: ttl 0
      - matches: has_resp
        exec: accept
  
  # fallback primary
  - tag: fallback
    type: sequence
    args:
      - exec: $lazy_cache
      - matches: has_resp
        exec: accept
      - exec: $local_fallback
      - matches: "!resp_ip $cn_ip"
        exec: goto gfw
      - exec: accept  

  # 主运行序列
  - tag: main_sequence
    type: sequence
    args:
      # 去广告
      - matches:
          - qname $ad_domains
        exec: reject

      # 命中direct.txt的域名本地解析
      - matches:
          - qname $direct_domains
        exec: jump direct    

      # 命中gfw.txt的域名直接转发到clash dns
      - matches: 
          - qname $gfw_domains
        exec: jump gfw

      # 其他的fallback      
      - exec: $fallback


  # 启动监听服务
  - tag: udp_server
    type: udp_server
    args:
      entry: main_sequence
      listen: :5353

  - tag: tcp_server
    type: tcp_server
    args:
      entry: main_sequence
      listen: :5353

2.4:执行安装程序

cd /data/mosdns/

# 添加执行权限
chmod +x mosdns

# 执行安装,安装完成则自动启动
/data/mosdns/mosdns start -c /data/mosdns/config.yaml -d /data/mosdns > /dev/null 2>&1 &

# 检查服务进程和监听端口
ss -tunlp|grep 5353

# 检查程序进程
ps -wl|grep mosdns

2.5:配置端口转发

iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353

# 使用下面的命令检查规则是否存在
iptables -t nat -v --list 和 ip6tables -t nat -v --list

四、验证分流效果

通过本机去ping国内外域名,预期实现的效果是,国内直接解析出真实的IPV4地址,而国外域名则是fake-ip,也就是假IP地址


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/14377.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站提供的内容仅限于个人学习和研究使用;禁止将内容用于商业或非法用途。下载后请在24小时内彻底删除,否则后果由用户承担。访问和下载本站内容即表示您已同意上述条款 。

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!