V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
QLeelulu
V2EX  ›  分享创造

开源一个 DNS 服务器工具

  •  
  •   QLeelulu · 2021-04-05 11:08:48 +08:00 · 969 次点击
    这是一个创建于 1088 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    开源地址见:fpdns

    特性:

    • A 记录
    • CNAME
    • 泛解析
    • DNS 负载均衡
    • 缓存 DNS 解析结果
    • 上游同时多 DNS Server 查询

    配置文件

    resolv.conf

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

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

    • 第 0 秒请求第一个 DNS Server,如果 1 秒内获得解析结果,则返回结果;
    • 第 0 秒请求第一个 DNS Server,如果超过 1 秒还未获得解析结果,则在 1 秒后开始请求第 2 个 DNS Server,并返回最快获得的解析结果;
    • 以此类推;

    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
    
    3 条回复    2021-04-06 12:03:22 +08:00
    Acoffice
        1
    Acoffice  
       2021-04-05 12:47:45 +08:00 via Android
    支持一下开源精神
    gesse
        2
    gesse  
       2021-04-05 14:54:18 +08:00
    这确实是轮子,辛苦了。
    dorothyREN
        3
    dorothyREN  
       2021-04-06 12:03:22 +08:00
    说明一下,你这个叫 DNS 递归服务器。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3392 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:18 · PVG 19:18 · LAX 04:18 · JFK 07:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.