Pages

Saturday, 25 November 2023

SmartDNS

 

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。

pymumu.github.io/smartdns/ 

SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。 SmartDNS 同时支持指定特定域名 IP 地址,并高性匹配,可达到过滤广告的效果; 支持DOT(DNS over TLS)和DOH(DNS over HTTPS),更好的保护隐私。

与 DNSmasq 的 all-servers 不同,SmartDNS 返回的是访问速度最快的解析结果。

支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。

使用指导

SmartDNS官网:https://pymumu.github.io/smartdns

软件效果展示

阿里 DNS
使用阿里 DNS 查询百度IP,并检测结果。

$ nslookup www.baidu.com 223.5.5.5
Server:         223.5.5.5
Address:        223.5.5.5#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 180.97.33.108
Name:   www.a.shifen.com
Address: 180.97.33.107

$ ping 180.97.33.107 -c 2
PING 180.97.33.107 (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107: icmp_seq=1 ttl=55 time=24.3 ms
64 bytes from 180.97.33.107: icmp_seq=2 ttl=55 time=24.2 ms

--- 180.97.33.107 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 24.275/24.327/24.380/0.164 ms
pi@raspberrypi:~/code/smartdns_build $ ping 180.97.33.108 -c 2
PING 180.97.33.108 (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=55 time=31.1 ms
64 bytes from 180.97.33.108: icmp_seq=2 ttl=55 time=31.0 ms

--- 180.97.33.108 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 31.014/31.094/31.175/0.193 ms

SmartDNS
使用 SmartDNS 查询百度 IP,并检测结果。

$ nslookup www.baidu.com
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 14.215.177.39

$ ping 14.215.177.39 -c 2
PING 14.215.177.39 (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39: icmp_seq=1 ttl=56 time=6.31 ms
64 bytes from 14.215.177.39: icmp_seq=2 ttl=56 time=5.95 ms

--- 14.215.177.39 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 5.954/6.133/6.313/0.195 ms

从对比看出,SmartDNS 找到了访问 www.baidu.com 最快的 IP 地址,比阿里 DNS 速度快了 5 倍。

特性

  1. 多 DNS 上游服务器
    支持配置多个上游 DNS 服务器,并同时进行查询,即使其中有 DNS 服务器异常,也不会影响查询。

  2. 返回最快 IP 地址
    支持从域名所属 IP 地址列表中查找到访问速度最快的 IP 地址,并返回给客户端,提高网络访问速度。

  3. 支持多种查询协议
    支持 UDP、TCP、DOT 和 DOH 查询及服务,以及非 53 端口查询;支持通过socks5,HTTP代理查询;

  4. 特定域名 IP 地址指定
    支持指定域名的 IP 地址,达到广告过滤效果、避免恶意网站的效果。

  5. 域名高性能后缀匹配
    支持域名后缀匹配模式,简化过滤配置,过滤 20 万条记录时间 < 1ms。

  6. 域名分流
    支持域名分流,不同类型的域名向不同的 DNS 服务器查询,支持iptable和nftable更好的分流;支持测速失败的情况下设置域名结果到对应ipset和nftset集合。

  7. Windows / Linux 多平台支持
    支持标准 Linux 系统(树莓派)、OpenWrt 系统各种固件和华硕路由器原生固件。同时还支持 WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)。

  8. 支持 IPv4、IPv6 双栈
    支持 IPv4 和 IPV 6网络,支持查询 A 和 AAAA 记录,支持双栈 IP 速度优化,并支持完全禁用 IPv6 AAAA 解析。

  9. 支持DNS64
    支持DNS64转换。

  10. 高性能、占用资源少
    多线程异步 IO 模式,cache 缓存查询结果。

  11. 主流系统官方支持
    主流路由系统官方软件源安装smartdns。

架构

Architecture

  1. SmartDNS 接收本地网络设备的DNS 查询请求,如 PC、手机的查询请求;
  2. 然后将查询请求发送到多个上游 DNS 服务器,可支持 UDP 标准端口或非标准端口查询,以及 TCP 查询;
  3. 上游 DNS 服务器返回域名对应的服务器 IP 地址列表,SmartDNS 则会检测从本地网络访问速度最快的服务器 IP;
  4. 最后将访问速度最快的服务器 IP 返回给本地客户端。

编译

  • 代码编译:

    SmartDNS 提供了编译软件包的脚本(package/build-pkg.sh),支持编译 LuCI、Debian、OpenWrt 和 Optware 安装包。

  • 文档编译:

    文档分支为doc,安装mkdocs工具后,执行mkdocs build编译。

    from https://github.com/pymumu/smartdns

    ------------------------------------------------------

    Linux安装

    • 下载配套安装包,并上传到 Linux 系统中, 标准 Linux 系统(X86 / X86_64)请执行如下命令安装:
    tar zxf smartdns.1.yyyy.MM.dd-REL.x86_64-linux-all.tar.gz
    cd smartdns
    chmod +x ./install
    ./install -i
    
    • 树莓派或其他 Debian 系系统(ARM / ARM64)请执行如下命令安装:
    dpkg -i smartdns.1.yyyy.MM.dd-REL.arm-debian-all.deb
    

    注意

    1. ubuntu系统下,systemd-resolved会占用TCP53和UDP53端口, 你需要手动解决端口占用问题或者修改smartdns监听端口。
    2. 日志文件在/var/log/smartdns/smartdns.log

    修改配置

    安装完成后,可配置 SmartDNS 的上游服务器信息,一般情况下,只需要增加 server[IP]:portserver-tcp[IP]:port 配置项,请尽可能配置多个上游 DNS 服务器,包括国内外的服务器。具体配置参数请参考配置文件说明

    • 配置文件
    vi /etc/smartdns/smartdns.conf
    

    /etc/smartdns/smartdns.conf配置包含如下基本内容:

    # 指定监听的端口号
    bind []:53 
    # 指定上游服务器
    server 1.1.1.1
    server-tls 8.8.8.8
    # 指定域名规则
    address /example.com/1.2.3.4
    domain-rules /example.com/ -address 1.2.3.4
    

    启动服务

    systemctl enable smartdns
    systemctl start smartdns
    

    将 DNS 请求转发到 SmartDNS 解析

    修改本地路由器的 DNS 服务器,将 DNS 服务器配置为 SmartDNS。

    • 登录到本地网络的路由器中,配置树莓派,分配其静态 IP 地址。
    • 修改 WAN 口或者 DHCP DNS 为树莓派 IP 地址。

      注意:
      1. 每款路由器配置方法不尽相同,请在网络上搜索对应配置方法。 1. 华为等路由器可能不支持配置 DNS 为本地 IP,可修改电脑端或手机端的 DNS 服务器为树莓派 IP。

    检测服务是否配置成功

    • 执行
    nslookup -querytype=ptr smartdns
    
    • 查看命令结果中的 name 是否为 smartdns 或你的主机名,如果是则表示生效
    $ nslookup -querytype=ptr smartdns
    Server:         192.168.1.1
    Address:        192.168.1.1#53
    
    Non-authoritative answer:
    smartdns        name = smartdns.
    from https://pymumu.github.io/smartdns/install/linux/ 

     

 

No comments:

Post a Comment