树莓派安装SmartDNS

更新一下6月30:
现在已经改回运营商的dns了,之前认为smartdns 会为我解析出连接最快的、ping值最低的ip,用了一段时间以后发现,ipv4地址确实是找到最快的那个,但是也只是返回了一个ip地址,App Store,一些bt下载什么的 感觉只是获取到一个ip,不能完成多并发下载,导致下载速度一直很慢,所以决定放弃使用了


 

SmartDNS是一个运行在本地的DNS服务器,SmartDNS接受本地客户端的DNS查询请求,从多个上游DNS服务器获取DNS查询结果,并将访问速度最快的结果返回给客户端,避免DNS污染,提高网络访问速度。 同时支持指定特定域名IP地址,并高性匹配,达到过滤广告的效果。
与dnsmasq的all-servers不同,smartdns返回的是访问速度最快的解析结果。

支持树莓派,openwrt,华硕路由器,windows等设备。

项目地址: https://github.com/pymumu/smartdns

下载地址:https://github.com/pymumu/smartdns/releases

 

特性

  1. 多DNS上游服务器
    支持配置多个上游DNS服务器,并同时进行查询,即使其中有DNS服务器异常,也不会影响查询。
  2. 返回最快IP地址
    支持从域名所属IP地址列表中查找到访问速度最快的IP地址,并返回给客户端,避免DNS污染,提高网络访问速度。
  3. 支持多种查询协议
    支持UDP,TCP,TLS查询,以及非53端口查询,有效避免DNS污染。
  4. 特定域名IP地址指定
    支持指定域名的IP地址,达到广告过滤效果,避免恶意网站的效果。
  5. 域名高性能后缀匹配
    支持域名后缀匹配模式,简化过滤配置,过滤20万条记录时间<1ms
  6. 域名分流
    支持域名分流,不同类型的域名到不同的DNS服务器查询。
  7. Linux/Windows多平台支持
    支持标准Linux系统(树莓派),openwrt系统各种固件,华硕路由器原生固件。以及支持Windows 10 WSL (Windows Subsystem for Linux)。
  8. 支持IPV4, IPV6双栈
    支持IPV4,IPV6网络,支持查询A, AAAA记录,支持双栈IP速度优化。
  9. 高性能,占用资源少
    多线程异步IO模式,cache缓存查询结果。

 

标准Linux系统安装/树莓派/X86_64系统


  1. 安装下载配套安装包smartdns.xxxxxxxx.armhf.deb,并上传到Linux系统中。 执行如下命令安装
    dpkg -i smartdns.xxxxxxxx.armhf.deb
  2. 修改配置安装完成后,可配置smartdns的上游服务器信息。具体配置参数参考配置参数说明。
    一般情况下,只需要增加server [IP]:portserver-tcp [IP]:port配置项, 尽可能配置多个上游DNS服务器,包括国内外的服务器。配置参数请查看配置参数章节。

    vi /etc/smartdns/smartdns.conf
  3. 启动服务
    systemctl enable smartdns
    systemctl start smartdns
  4. 将DNS请求转发的SmartDNS解析。修改本地路由器的DNS服务器,将DNS服务器配置为SmartDNS。
    • 登录到本地网络的路由器中,配置树莓派分配静态IP地址。
    • 修改WAN口或者DHCP DNS为树莓派IP地址。
      注意:
      I. 每款路由器配置方法不尽相同,请百度搜索相关的配置方法。
      II.华为等路由器可能不支持配置DNS为本地IP,请修改PC端,手机端DNS服务器为树莓派IP。
  5. 检测服务是否配置成功。使用nslookup -querytype=ptr 0.0.0.0查询域名
    看命令结果中的name项目是否显示为smartdns主机名,如smartdns则表示生效

    pi@raspberrypi:~/code/smartdns_build $ nslookup -querytype=ptr 0.0.0.0
    Server:         192.168.1.1
    Address:        192.168.1.1#53
    
    Non-authoritative answer:
    0.0.0.0.in-addr.arpa  name = smartdns.
    
    
    
    

    配置参数

    参数 功能 默认值 配置值 例子
    server-name DNS服务器名称 操作系统主机名/smartdns 符合主机名规格的字符串 server-name smartdns
    bind DNS监听端口号 [::]:53 IP:PORT bind 192.168.1.1:53
    bind-tcp TCP模式DNS监听端口号 [::]:53 IP:PORT bind-tcp 192.168.1.1:53
    cache-size 域名结果缓存个数 512 数字 cache-size 512
    tcp-idle-time TCP链接空闲超时时间 120 数字 tcp-idle-time 120
    rr-ttl 域名结果TTL 远程查询结果 大于0的数字 rr-ttl 600
    rr-ttl-min 允许的最小TTL值 远程查询结果 大于0的数字 rr-ttl-min 60
    rr-ttl-max 允许的最大TTL值 远程查询结果 大于0的数字 rr-ttl-max 600
    log-level 设置日志级别 error fatal,error,warn,notice,info,debug log-level error
    log-file 日志文件路径 /var/log/smartdns.log 路径 log-file /var/log/smartdns.log
    log-size 日志大小 128K 数字+K,M,G log-size 128K
    log-num 日志归档个数 2 数字 log-num 2
    audit-enable 设置审计启用 no [yes|no] audit-enable yes
    audit-file 审计文件路径 /var/log/smartdns-audit.log 路径 audit-file /var/log/smartdns-audit.log
    audit-size 审计大小 128K 数字+K,M,G audit-size 128K
    audit-num 审计归档个数 2 数字 audit-num 2
    conf-file 附加配置文件 文件路径 conf-file /etc/smartdns/smartdns.more.conf
    server 上游UDP DNS 可重复
    [ip][:port]:服务器IP,端口可选。
    [-blacklist-ip]:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
    [-check-edns]:edns过滤。
    [-group [group] ...]:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
    [-exclude-default-group]:将DNS服务器从默认组中排除
    server 8.8.8.8:53 -blacklist-ip -check-edns -group g1
    server-tcp 上游TCP DNS 可重复
    [ip][:port]:服务器IP,端口可选。
    [-blacklist-ip]:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
    [-group [group] ...]:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
    [-exclude-default-group]:将DNS服务器从默认组中排除
    server-tcp 8.8.8.8:53
    server-tls 上游TLS DNS 可重复
    [ip][:port]:服务器IP,端口可选。
    [-spki-pin [sha256-pin]]: TLS合法性校验SPKI值,base64编码的sha256 SPKI pin值
    [-blacklist-ip]:blacklist-ip参数指定使用blacklist-ip配置IP过滤结果。
    [-group [group] ...]:DNS服务器所属组,比如office, foreign,和nameserver配套使用。
    [-exclude-default-group]:将DNS服务器从默认组中排除
    server-tls 8.8.8.8:853
    address 指定域名IP地址 address /domain/[ip|-|-4|-6|#|#4|#6]
    -表示忽略
    #表示返回SOA
    4表示IPV4
    6表示IPV6
    address /www.example.com/1.2.3.4
    nameserver 指定域名使用server组解析 nameserver /domain/[group|-], group为组名,-表示忽略此规则,配套server中的-group参数使用 nameserver /www.example.com/office
    ipset 域名IPSET None ipset /domain/[ipset|-], -表示忽略 ipset /www.example.com/pass
    ipset-timeout 设置IPSET超时功能启用 auto [yes] ipset-timeout yes
    bogus-nxdomain 假冒IP地址过滤 [ip/subnet],可重复 bogus-nxdomain 1.2.3.4/16
    ignore-ip 忽略IP地址 [ip/subnet],可重复 ignore-ip 1.2.3.4/16
    blacklist-ip 黑名单IP地址 [ip/subnet],可重复 blacklist-ip 1.2.3.4/16
    force-AAAA-SOA 强制AAAA地址返回SOA no [yes|no] force-AAAA-SOA yes
    prefetch-domain 域名预先获取功能 no [yes|no] prefetch-domain yes
    dualstack-ip-selection 双栈IP优选 no [yes|no] dualstack-ip-selection yes
    dualstack-ip-selection-threshold 双栈IP优选阈值 30ms 毫秒 dualstack-ip-selection-threshold [0-1000]

    FAQ

    1. SmartDNS和DNSMASQ有什么区别
      SMARTDNS在设计上并不是替换DNSMASQ的,MARTDNS主要功能集中在DNS解析增强上,增强部分有

      • 多上游服务器并发请求,对结果进行测速后,返回最佳结果;
      • address,ipset域名匹配采用高效算法,查询匹配更加快速高效,路由器设备依然高效。
      • 域名匹配支持忽略特定域名,可单独匹配IPv4, IPV6,支持多样化定制。
      • 针对广告屏蔽功能做增强,返回SOA,屏蔽广告效果更佳;
      • IPV4,IPV6双栈IP优选机制,在双网情况下,选择最快的网络通讯。
      • 支持最新的TLS协议,提供安全的DNS查询能力。
      • DNS防抢答机制,及多种机制避免DNS污染。
      • ECS支持,是查询结果更佳准确。
      • IP黑名单,忽略IP机制,使域名查询更佳准确。
      • 域名预查询,访问常用网站更加快速。
      • 域名TTL可指定,使访问更快速。
      • 高速缓存机制,使访问更快速。
      • 异步日志,审计机制,在记录信息的同时不影响DNS查询性能。
      • 域名组(group)机制,特定域名使用特定上游服务器组查询,避免隐私泄漏。
    2. 如何配置上游服务器最佳。
      smartdns有测速机制,在配置上游服务器时,建议配置多个上游DNS服务器,包含多个不同区域的服务器,但总数建议在10个左右。推荐配置

      • 运营商DNS。
      • 国内公共DNS,如119.29.29.29223.5.5.5
      • 国外公共DNS,如8.8.8.88.8.4.4

      对于特定的域名,如果有污染情况,可以启用防污染机制。

    3. 如何启用审计日志
      审计日志记录客户端请求的域名,记录信息包括,请求时间,请求IP,请求域名,请求类型,如果要启用审计日志,在配置界面配置audit-enable yes启用,audit-sizeaudit-fileaudit-num分别配置审计日志文件大小,审计日志文件路径,和审计日志文件个数。审计日志文件将会压缩存储以节省空间。
    4. 如何避免隐私泄漏
      smartdns默认情况下,会将请求发送到所有配置的DNS服务器,若上游DNS服务器使用DNS,或记录日志,将会导致隐私泄漏。为避免隐私泄漏,请尽量:

      • 配置使用可信的DNS服务器。
      • 优先使用TLS查询。
      • 设置上游DNS服务器组。
    5. 如何屏蔽广告
      smartdns具备高性能域名匹配算法,通过域名方式过滤广告非常高效,如要屏蔽广告,只需要配置类似如下记录即可,如,屏蔽*.ad.com,则配置:

      address /ad.com/#

      域名的使后缀模式,过滤*.ad.com,#表示返回SOA,使屏蔽广告更加高效,如果要单独屏蔽IPV4, 或IPV6, 在#后面增加数字,如#4表示对IPV4生效。若想忽略特定子域名的屏蔽,可配置如下,如忽略pass.ad.com,可配置如下:

      address /pass.ad.com/-
    6. 如何使用DNS查询分流
      某些情况下,需要将有些域名使用特定的DNS服务器来查询来做到DNS分流。比如。

      .home -> 192.168.1.1
      .office -> 10.0.0.1

      .home 结尾的域名发送到192.168.1.1解析
      .office 结尾的域名发送到10.0.0.1解析 其他域名采用默认的模式解析。 这种情况的分流配置如下:

      #配置上游,用-group指定组名,用-exclude-default-group将服务器从默认组中排除。
      server 192.168.1.1 -group home -exclude-default-group
      server 10.0.0.1 -group office -exclude-default-group
      server 8.8.8.8
      
      #配置解析的域名
      nameserver /.home/home
      nameserver /.office/office

      通过上述配置即可实现DNS解析分流

    7. 双栈IP优选功能如何使用
      目前IPV6已经开始普及,但IPV6网络在速度上,某些情况下还不如IPV4,为在双栈网络下获得较好的体验,smartdns提供来双栈IP优选机制,同一个域名,若IPV4的速度远快与IPV6,那么smartdns就会阻止IPV6的解析,让PC使用IPV4访问,具体配置文件通过dualstack-ip-selection yes启用此功能,通过dualstack-ip-selection-threshold [time]来修改阈值。
    8. 如何提高cache效率,加快访问速度
      smartdns提供了域名缓存机制,对查询的域名,进行缓存,缓存时间符合DNS TTL规范。为提高缓存命中率,可采用如下措施:

      • 适当增大cache的记录数
        通过cache-size来设置缓存记录数。
        查询压力大的环境下,并且有内存大的机器的情况下,可适当调大。
      • 适当设置最小TTL值
        通过rr-ttl-min将最低DNS TTL时间设置为一个合理值,延长缓存时间。
        建议是超时时间设置在10~30分钟,避免服务器域名变化时,查询到失效域名。
      • 开启域名预获取功能
        通过prefetch-domain yes来启用域名预先获取功能,提高查询命中率。
        配合上述ttl超时时间,smartdns将在域名ttl即将超时使,再次发送查询请求,并缓存查询结果供后续使用。频繁访问的域名将会持续缓存。此功能将在空闲时消耗更多的CPU。

     

项目地址: https://github.com/pymumu/smartdns

Momostudent
Momostudent
因为喜欢所以折腾。。。