/CerDNS

A chain-based DNS forwarder designed to be used in mixed network environment.

Primary LanguageJavaMIT LicenseMIT

CerDNS

Usage

$ cerdns
启动服务器并从 config.json 加载配置

$ cerdns [configFile]
启动服务器并从 configFile 加载配置

项目简介

在混合出口网络中,DNS 往往是一大问题。CerDNS 通过并发向多个 DNS 请求并根据规则匹配结果,得到最准确的 IP 地址。

使用场景

鼓楼最差宿舍楼的某一间宿舍拥有教育网、联通混合出口,并使用了隧道技术对国外的网站进行加速。该宿舍此前使用 ChinaDNS 作为 DNS 转发器,但存在以下几个问题:

  1. ChinaDNS 只支持 2 个上游服务器,而实际上需要 3 个(校园网 / 联通 / 国外)。
  2. 由于上述原因,在访问某些教育网内存在 CDN 的域名时,只能得到联通的 IP,无法达到最高速度。
  3. 当国外 DNS 不可用时,所有地址在国外的域名均无法解析,严重影响正常上网。

使用 CerDNS 可以方便地解决上述几个问题。

设计

CerDNS 使用链式(Chain)设计,链中有多个节点(Node)。但查询时并非逐个向链中的节点查询,而是并发向所有服务器查询后再进行逐个匹配。

发出并发查询请求后,CerDNS 会从链中的第一个节点开始取结果,并与给定的地址范围进行匹配。若结果匹配则直接返回,否则继续匹配链中的下一个节点。

若链中所有节点均超时或无正确匹配的结果,则返回最接近节点的结果,以保证服务的高可用性。

配置文件

{
  // 应用到所有查询的超时,单位 ms
  "timeout": 1000,
  
  // 对于非 A 记录的查询所使用的上游服务器
  "defaultServer": {
    "server": "114.114.114.114",
    "port": 53
  },
  
  // 链中节点配置
  "chain": [
    {
      "server": "210.28.129.251",
      "port": 53,
      // 对结果进行匹配的地址列表,对该节点仅允许列表中的地址返回,留空表示允许所有地址
      "matchList": "nju"
    },
    {
      "server": "119.29.29.29",
      "port": 53,
      "matchList": "chinaip"
    },
    {
      "server": "127.0.0.1",
      "port": 5300,
      "matchList": ""
    }
  ],
  
  // 地址列表配置 (CIDR 格式)
  "addressLists": {
    "nju": [
      "172.16.0.0/12",
      ......
    ],
    "chinaip": [
      "1.0.1.0/24",
      ......
    ]
  }
}