littlebot
Published on 2025-04-12 / 1 Visits
0

【源码】基于 C 语言的智能 DNS 服务器系统

项目简介

本项目是运行在本地的智能 DNS 服务器系统,采用 C 语言开发。该系统接收本地客户端的 DNS 查询请求,从多个上游 DNS 服务器获取查询结果,将访问速度最快的结果返回给客户端,以此提高网络访问速度。此外,它支持指定特定域名的 IP 地址,实现高性能匹配,达到过滤广告的效果。此系统具备多平台支持能力,适用于树莓派、openwrt、华硕路由器、Windows 等设备。

项目的主要特性和功能

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

安装使用步骤

假设用户已经下载了本项目的源码文件,以下是不同系统的安装使用步骤:

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

  1. 安装:下载配套安装包 smartdns.xxxxxxxx.arm - debian - all.deb 并上传到 Linux 系统,执行 dpkg -i smartdns.xxxxxxxx.arm - debian - all.deb 安装;x86 系统下载配套安装包 smartdns.xxxxxxxx.x86_64 - linux - all.tar.gz 并上传,执行 tar zxf smartdns.xxxxxxxx.x86_64 - linux - all.tar.gzcd smartdnschmod +x./install./install -i 进行安装。
  2. 修改配置:安装完成后,可配置 smartdns 的上游服务器信息。一般增加 server [IP]:portserver - tcp [IP]:port 配置项,尽可能配置多个上游 DNS 服务器,包括国内外的服务器。使用 vi /etc/smartdns/smartdns.conf 进行配置修改。
  3. 启动服务:执行 systemctl enable smartdnssystemctl start smartdns 启动服务。
  4. 将 DNS 请求转发到 SmartDNS 解析:修改本地路由器的 DNS 服务器,将其配置为 SmartDNS。登录到本地网络的路由器,配置树莓派分配静态 IP 地址,修改 WAN 口或者 DHCP DNS 为树莓派 IP 地址。若路由器不支持配置 DNS 为本地 IP,则修改 PC 端、手机端 DNS 服务器为树莓派 IP。
  5. 检测服务是否配置成功:使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效。

openwrt

  1. 安装:将软件使用 winscp 上传到路由器的 /root 目录,执行 opkg install smartdns.xxxxxxxx.xxxx.ipkopkg install luci - app - smartdns.xxxxxxxx.xxxx.all.ipk 进行安装。注意,19.07 之前的版本,请安装 luci - app - smartdns.xxxxxxxxx.all - luci - compat - all 界面。
  2. 修改配置:登录 openwrt 管理页面,打开 Services -> SmartDNS 进行配置。在 Upstream Servers 增加上游 DNS 服务器配置,建议配置多个国内外 DNS 服务器;在 Domain Address 指定特定域名的 IP 地址,可用于广告屏蔽。
  3. 启用服务:SmartDNS 服务生效方法有两种,可根据需求选择。
    • 启用方法一:作为主 DNS(默认方案)
      • 登录路由器,点击 Services -> SmartDNS -> redirect,选择 重定向 53 端口到 SmartDNS 启用 53 端口转发。
      • 使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效。
      • 若界面提示重定向失败,可检查 iptable、ip6table 命令是否正确安装;openwrt 15.01 系统不支持 IPV6 重定向,若网络需要支持 IPV6,可将 DNSMASQ 上游改为 smartdns,或把 smartdns 的端口改为 53 并停用 dnsmasq;LEDE 之后系统,需安装 IPV6 的 nat 转发驱动,点击 system -> Software,点击 update lists 更新软件列表后,安装 ip6tables - mod - nat;使用 iptables -t nat -L PREROUTING | grep REDIRECT 检查路由规则是否生效。如转发功能不正常,可使用方法二。
    • 方法二:作为 DNSMASQ 的上游
      • 登录路由器,点击 Services -> SmartDNS -> redirect,选择 作为 dnsmasq 的上游服务器 设置 dnsmasq 的上游服务器为 smartdns。
      • 检测上游服务是否配置成功,方法一:使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效;方法二:使用 nslookup 查询 www.baidu.com 域名,查看结果中百度的 IP 地址是否只有一个,如有多个 IP 地址返回,则表示未生效,请多尝试几个域名检查。
  4. 启动服务:勾选配置页面中的 Enable(启用) 来启动 SmartDNS。
  5. 注意:如已经安装 chinaDNS,建议将 chinaDNS 的上游配置为 SmartDNS。SmartDNS 默认情况,将 53 端口的请求转发到 SmartDNS 的本地端口,由 Redirect 配置选项控制。

华硕路由器原生固件/梅林固件

  1. 准备:使用此软件时,需确认路由器是否支持 U 盘,并准备好 U 盘一个。
  2. 启用 SSH 登录:登录管理界面,点击 系统管理 -> 点击 系统设置,配置 Enable SSHLan Only。SSH 登录用户名密码与管理界面相同。
  3. 下载 Download Master:在管理界面点击 USB 相关应用 -> 点击 Download Master 下载。下载完成后,启用 Download Master,若不需要下载功能,可卸载 Download Master,但要保证卸载前 Download Master 是启用的。
  4. 安装 SmartDNS:将软件使用 winscp 上传到路由器的 /tmp/mnt/sda1 目录(或网上邻居复制到 sda1 共享目录),执行 ipkg install smartdns.xxxxxxx.mipsbig.ipk 安装。
  5. 重启路由器生效服务:待路由器启动后,使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效。
  6. 额外说明:上述过程中,smartdns 将安装到 U 盘根目录,采用 optware 的模式运行。如需修改配置,可 ssh 登录路由器,使用 vi /opt/etc/smartdns/smartdns.conf 修改;也可通过网上邻居修改,在 文件管理器 中输入 \\192.168.1.1\sda1\asusware.mipsbig\etc\init.d 访问。

optware/entware

  1. 准备:使用此软件时,需确认路由器是否支持 U 盘,并准备好 U 盘一个。
  2. 安装 SmartDNS:将软件使用 winscp 上传到路由器的 /tmp 目录,执行 ipkg install smartdns.xxxxxxx.mipsbig.ipk 安装。
  3. 修改 smartdns 配置:执行 vi /opt/etc/smartdns/smartdns.conf 修改配置。如需支持 IPV6,可设置工作模式为 2,将 dnsmasq 的 DNS 服务禁用,smartdns 为主用 DNS 服务器。将文件 /opt/etc/smartdns/smartdns - opt.conf 中的 SMARTDNS_WORKMODE 修改为 2。
  4. 重启路由器生效服务:待路由器启动后,使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效。注意,若服务没有自动启动,则需要设置 optwre/entware 自动启动,具体方法参考 optware/entware 的文档。

Windows 10 WSL 安装/WSL ubuntu

  1. 安装 Windows 10 WSL ubuntu 系统:安装 Windows 10 WSL 运行环境,发行版本选择 ubuntu 系统。安装步骤请参考 WSL 安装说明
  2. 安装 smartdns:下载安装包 smartdns.xxxxxxxx.x86 - linux - all.tar.gz,并解压到 D 盘根目录。双击 D:\smartdns\package\windows 目录下的 install.bat 进行安装,要求输入密码时,请输入 WLS ubuntu 的密码。
  3. 修改配置:使用记事本打开 D:\smartdns\etc\smartdns 目录中的 smartdns.conf 配置文件配置 smartdns。一般增加 server [IP]:portserver - tcp [IP]:port 配置项,尽可能配置多个上游 DNS 服务器,包括国内外的服务器。
  4. 重新加载配置:双击 D:\smartdns\package\windows 目录下的 reload.bat 进行安装,要求输入密码时,请输入 WLS ubuntu 的密码。
  5. 将 DNS 请求转发到 SmartDNS 解析:将 Windows 的默认 DNS 服务器修改为 127.0.0.1,具体步骤参考 IP 配置
  6. 检测服务是否配置成功:使用 nslookup -querytype = ptr smartdns 查询域名,若命令结果中的 name 项目显示为 smartdns主机名,则表示生效。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】