原来用的 dnspod-sr 这个 DNS 作为内部 DNS 服务的,然而这货并不稳定并且不维护了,然后就造了个轮子。
最近把科学上网改为 用户---->DNS---->goproxy(HTTP,80,443) 的方式,想着这 DNS 服务应该还有人用得着,于是就开源了。
开源地址见:fpdns
特性:
会先从命令行参数-conf_dir
指定的配置目录中读取resolv.conf
文件,如果文件不存在,则从/etc/resolv.conf
读取。
resolv.conf
文件里面配置多个 DNS Server 的时候,fpdns 会从上往下每隔 1 秒逐个请求,并返回最早响应的解析结果。
自定义的 DNS 记录配置只需在命令行参数-conf_dir
指定的配置目录中添加以.dns-conf
后缀结尾的文件即可。可以分多个文件,也可以是在子目录里面,只要是以.dns-conf
后缀结尾就行。
可以根据不同需求组织目录和文件,例如:
conf
├── k8s
│ └── qa-k8s.dns-conf
├── mydomain.com.dns-conf
├── resolv.conf
└── test.dns-conf
fpdns 解析 dns 请求的时候,会按照以下逻辑进行处理:
1. .dns-conf 配置文件是否配置了对应记录
2. 是:
3. 返回配置的记录
4. 否:
5. 检查缓存中是否有对应的缓存记录
6. 是:
7. 检查缓存记录是否过期
8. 已过期,跳到 11
9. 未过期,返回缓存的记录值
10. 否:
11. 查询 resolv.conf 配置的上游 DNS 服务器
A 记录配置格式为:
域名. TTL(Time-To-Live,单位秒) IN A 目标 IP 地址
A 记录配置参考以下示例:
about.fpdns.cn. 600 IN A 192.168.2.19
同一个域名添加多个 A 记录的时候,就会开启 DNS 负载均衡。
例如以下配置:
about.fpdns.cn. 600 IN A 192.168.2.19
about.fpdns.cn. 600 IN A 192.168.2.20
about.fpdns.cn. 600 IN A 192.168.2.21
因不少应用会直接拿 DNS 解析结果的第一个 IP 来使用,所以 sfdns 每次解析的时候,都会随机乱序返回。
支持 A 记录泛解析,例如:
*.github.com. 600 IN A 192.168.1.253
以上的配置会对 github.com
的所有子域名(包括多级子域名)都生效,例如 a.github.com
, b.a.github.com
, c.b.a.github.com
,但不包括 github.com
。
CNAME 记录配置格式为:
域名. TTL(Time-To-Live,单位秒) IN CNAME 目标域名
CNAME 记录配置参考以下示例:
www.baidu.com. 172800 IN CNAME www.a.shifen.com
当需要某个域名直接去查询 resolv.conf
里面的上游 DNS 服务的时候,可以配置为 CNAME DIRECT
,则该记录会查询上游 DNS 服务器。
例如以下配置:
*.test1.com. 172800 IN A 192.168.2.22
up.test1.com. 172800 IN CNAME DIRECT
以上配置 *.test1.com
会将所有子域名都解析到 192.168.2.22
,但是 up.test1.com
会使用上游 DNS 服务器进行解析,而不是解析到 192.168.2.22
。
DNS 反向查询 PTR,就是例如dig -x 8.8.8.8 +short
返回google-public-dns-a.google.com.
,通过 IP 查询对应的域名。
示例配置文件:
# 注意这里是 PTR 记录 而不是 A 记录
192.168.3.253. 172800 IN PTR c253.fpdns.cn
192.168.3.254. 172800 IN PTR c254.fpdns.cn
上面的配置文件中PTR
类型的 c253.fpdns.cn.
和 c254.fpdns.cn.
可以支持 DNS 反向查询,就是dig -x 192.168.3.253 +short
会返回 c253.fpdns.cn.
。
打印一些调试信息。
curl "http://host:port/debug"
响应内容:
Local config cache len:
[class:IN, type:A]: 1028
Resolv cache len: 2656
DNS Query QPS: 101.200000
修改 *.dns-conf
配置文件后,调用这个接口可以重新加载配置
,而不需要重启服务。
curl "http://host:port/reload_conf"
响应内容:
reload dns conf done.
dns conf add: 4
add new1new.web.: class:IN, type:A
add new-new.web.: class:IN, type:A
add c252.fpdns.cn.: class:IN, type:A
add c254.fpdns.cn.: class:IN, type:A
dns conf delete: 2
delete newnew.web.: class:IN, type:A
delete new2new.web.: class:IN, type:A
dns conf change: 2
change about.fpdns.com.: class:IN, type:A
change hello.fpdns.com.: class:IN, type:A
1
Acoffice 2021-04-05 12:47:45 +08:00 via Android
支持一下开源精神
|
2
gesse 2021-04-05 14:54:18 +08:00
这确实是轮子,辛苦了。
|
3
dorothyREN 2021-04-06 12:03:22 +08:00
说明一下,你这个叫 DNS 递归服务器。
|