开源一个 DNS 服务器工具

2021-04-05 11:08:48 +08:00
 QLeelulu

原来用的 dnspod-sr 这个 DNS 作为内部 DNS 服务的,然而这货并不稳定并且不维护了,然后就造了个轮子。

最近把科学上网改为 用户---->DNS---->goproxy(HTTP,80,443) 的方式,想着这 DNS 服务应该还有人用得着,于是就开源了。

开源地址见:fpdns

特性:

配置文件

resolv.conf

会先从命令行参数-conf_dir指定的配置目录中读取resolv.conf文件,如果文件不存在,则从/etc/resolv.conf读取。

resolv.conf文件里面配置多个 DNS Server 的时候,fpdns 会从上往下每隔 1 秒逐个请求,并返回最早响应的解析结果。

DNS 记录配置

自定义的 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 记录配置

A 记录配置格式为:

域名. TTL(Time-To-Live,单位秒) IN A 目标 IP 地址

A 记录配置参考以下示例:

about.fpdns.cn. 600  IN  A  192.168.2.19

自定义 A 记录负载均衡

同一个域名添加多个 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 记录配置

CNAME 记录配置格式为:

域名. TTL(Time-To-Live,单位秒) IN CNAME 目标域名

CNAME 记录配置参考以下示例:

www.baidu.com. 172800  IN  CNAME  www.a.shifen.com

DIRECT 记录

当需要某个域名直接去查询 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 反向查询

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.

HTTP 接口

/debug 接口

打印一些调试信息。

curl "http://host:port/debug"

响应内容:

Local config cache len:
	[class:IN, type:A]: 1028
Resolv cache len: 2656
DNS Query QPS: 101.200000

/reload_conf 接口

修改 *.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
991 次点击
所在节点    分享创造
3 条回复
Acoffice
2021-04-05 12:47:45 +08:00
支持一下开源精神
gesse
2021-04-05 14:54:18 +08:00
这确实是轮子,辛苦了。
dorothyREN
2021-04-06 12:03:22 +08:00
说明一下,你这个叫 DNS 递归服务器。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/768066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX