$ cerdns
启动服务器并从 config.json 加载配置
$ cerdns [configFile]
启动服务器并从 configFile 加载配置
在混合出口网络中,DNS 往往是一大问题。CerDNS 通过并发向多个 DNS 请求并根据规则匹配结果,得到最准确的 IP 地址。
鼓楼最差宿舍楼的某一间宿舍拥有教育网、联通混合出口,并使用了隧道技术对国外的网站进行加速。该宿舍此前使用 ChinaDNS 作为 DNS 转发器,但存在以下几个问题:
- ChinaDNS 只支持 2 个上游服务器,而实际上需要 3 个(校园网 / 联通 / 国外)。
- 由于上述原因,在访问某些教育网内存在 CDN 的域名时,只能得到联通的 IP,无法达到最高速度。
- 当国外 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",
......
]
}
}