
先给一个总图DNS 客户端 | | DNS 请求(Query) | ------------------------- | | F5 DNS PowerDNS | | BIG-IP DNS模块 pdns_auth | | BIND(named) 数据库RR | ZoneRunner | zone fileF5 DNS 本质用 F5 做 DNS 流量控制用 BIND 存储 DNS 数据。1. ZoneRunner/BIND 全类型Wide IP 仅6种是什么意思DNS 标准里面有很多 Resource Record TypeRR 类型例如类型作用例子AIPv4地址www → 10.0.0.1AAAAIPv6地址www → 2001::1CNAME别名api → wwwMX邮件服务器mailTXT文本SPFNS域名服务器ns1SOA区域权威信息SRV服务发现这些叫DNS Resource Record Type简称RR TypeZoneRunner/BIND 支持全部 DNS RR 类型因为它直接管理 BIND zone file。例如zone 文件example.com. IN SOA ns1.example.com. example.com. IN NS ns1.example.com. www.example.com. IN A 10.0.0.1 mail.example.com. IN MX 10 mail.example.com. _test._tcp.example.com. IN SRV 10 5 443 service.example.com.BIND 可以理解AAAAAMXTXTSRVCNAMEPTRDNSSEC记录所以叫全类型。Wide IP 只有6种是什么意思Wide IP 是 F5 GTM/DNS 的概念。它不是普通 DNS 记录。普通 DNSwww.example.com ↓ A记录 ↓ 10.0.0.1F5www.example.com ↓ Wide IP ↓ Pool ↓ Virtual Server ↓ 10.0.0.1Wide IP 类似一个智能 DNS 调度入口。F5 不只是返回IP而是用户请求 www.xxx.com | | 判断 哪个机房健康 哪个服务器负载低 哪个地域最近 | | 返回最佳IP所以 Wide IP 类型比较少例如Wide IP类型对应DNSAIPv4AAAAIPv6CNAME别名MX邮件NAPTR号码映射SRV服务发现所以ZoneRunner DNS服务器 Wide IP F5智能调度对象2. 什么叫记录类型覆盖意思一个 DNS 管理系统支持多少种 RR Type。例如PowerDNS支持A AAAA TXT MX SRV CAA TLSA DS DNSKEY ...如果一个系统只能A AAAA CNAME那么说RR 类型覆盖低。举例你的业务_acme-challenge.example.com TXT xxx用于 Let’s Encrypt。如果 DNS API 不支持 TXT证书申请失败。所以记录类型覆盖 DNS能力范围。3. 权威记录 CRUD三条路径是什么CRUDCreate Read Update DeleteDNS记录增删改查。三条路径通常指F5管理DNS有三种方式路径1ZoneRunner直接改 BIND zone file。例如example.com.zone增加www A 10.0.0.1路径2BIND标准动态更新通过nsupdate发送动态DNS更新。流程nsupdate ↓ named ↓ zone file路径3REST包装zrsh也就是你看的文档REST API ↓ bash ↓ zrsh ↓ BINDF5 原本没有REST所以绕一层。5. DNSSEC签名有什么作用不要抽象理解。没有DNSSEC攻击者用户问 www.bank.com是多少 攻击者伪造 www.bank.com8.8.8.8用户被骗。DNSSEC服务器返回IP地址 数字签名客户端验证这个IP是不是域名主人发布的类似HTTPS网站证书证明 我是googleDNSSECDNS记录证明 我是example.com主人注意DNSSEC防篡改不是加密。6. DNS iRules是什么iRule 是 F5 自己的脚本语言。类似nginx lua或者iptables规则可以写逻辑。例如用户来自中国返回1.1.1.1用户来自美国返回2.2.2.2例如when DNS_REQUEST { if client_ip in China { return cn_pool } }7. DNS Profile是什么ProfileF5设备行为模板。类似nginx server配置。例如DNS Profile可以设置是否递归cache大小DNSSECloggingtimeout8. DNS Express是什么这是F5提高DNS性能的功能。普通DNS请求 ↓ BIND(named) ↓ zone file读取DNS Expresszone file ↓ F5内存数据库 ↓ 直接回答类似nginx缓存静态文件作用提高QPS延迟适合大流量权威DNS。9. rrset是什么这是PowerDNS核心概念。DNS传统看一条记录www.example.com A 10.0.0.1但是DNS协议里面实际上www.example.com | | A类型集合 | ---10.0.0.1 ---10.0.0.2这个整体叫RRSet(Resource Record Set)例如三个Awww.example.com A 10.0.0.1 www.example.com A 10.0.0.2 www.example.com A 10.0.0.3不是三个对象。而是RRSet: name: www.example.com type: A records: [ 10.0.0.1, 10.0.0.2, 10.0.0.3 ]所以你的APIREPLACE RRSet不是替换一条A记录。而是替换整个A集合。10. F5 zrsh是什么拆开z rshZoneRunner Shell。就是F5提供管理BIND zone的命令行。类似Linux:mysql进入数据库。F5:ZoneRunner%里面输入arr drr dz11. BIND9(named)、Zone Runner分别是什么BIND9全称Berkeley Internet Name Domain世界最老牌DNS服务器。进程named所以看到named就是BIND服务。负责DNS查询zone加载DNSSECZoneRunnerF5包装BIND的一层。原始BIND改文件 reloadF5GUI CLI zrsh 管理BIND12. rndc/nsupdate是什么rndcRemote Name Daemon Control。管理named。例如查看状态rndc status重新加载rndc reload清缓存rndc flush类似systemctl restart nginx但是针对DNS。nsupdate动态更新DNS记录工具。例如nsupdate server dns.example.com update add www.example.com A 10.0.0.1 send不用改zone文件。13. TMSH是什么TMSHTraffic Management ShellF5自己的CLI。类似Linux:bashF5:tmsh例如查看DNStmsh list gtm wideip创建对象tmsh create gtm pool14. arr/drr/dz/azf/delz是什么这些都是zrsh命令。来源文档 Appendix A。arrAdd Resource Record增加记录。例如arr example.com www A 10.0.0.1drrDelete Resource Record删除记录。dzDisplay Zone显示zone。返回整个zone文件。azfAdd Zone File增加zone文件。delzDelete Zone删除zone。所以“把 azf/delz 包一遍”意思现在REST只包装arr drr dz如果想REST管理zone还需要新增REST ↓ zrsh azf REST ↓ zrsh delz15. drr必须知道ttl/rdata是什么意思因为删除不是删除www而是精确删除www.example.com. 300 IN A 10.0.0.1例如zonewww A 10.0.0.1 www A 10.0.0.2执行drr www A不知道删哪个。所以需要ttl type rdata完整匹配。你问的这几个东西容易混在一起因为它们都能“改 DNS”但是它们处于完全不同的层级。先给结论F5 BIG-IP DNS | ---------------------- | | TMSH ZoneRunner | | 管理F5对象 管理BIND DNS数据 | -------------------------- | | zrsh命令 BIND原生命令 | -------------------- | | rndc nsupdate简单理解TMSH管 F5 设备对象ZoneRunner/zrsh管 F5 里面的 BIND zone 数据rndc管 BIND 服务进程nsupdate给 BIND 动态提交 DNS 记录修改它们不是一套命令。一、先理解 BIND 本身BIND 是 DNS 服务程序。进程named负责加载 zone 文件接收 DNS 请求返回 DNS 查询结果例如/var/named/example.com.zone里面example.com. SOA ... www.example.com. A 10.0.0.1named 读取这个文件。但是BIND 本身需要有人管理它。于是有几个工具。二、rndc 是干什么的rndcRemote Name Daemon Control中文远程控制 named 服务。注意它控制的是named 进程。例如查看状态rndc status告诉 BIND重新加载配置rndc reload清缓存rndc flush类似Linuxsystemctl restart nginx但是针对 DNS。rndc 能不能添加记录一般不能。例如你想添加www.example.com A 10.0.0.1rndc 不负责。rndc 负责控制DNS服务器不是修改DNS数据三、nsupdate 是干什么的nsupdate动态修改 DNS 记录。例如不用登录服务器。执行nsupdate输入server dns.example.com update add www.example.com 300 A 10.0.0.1 send效果修改zone: example.com 增加: www A 10.0.0.1它走的是DNS Dynamic Update 协议。链路nsupdate | | DNS UPDATE协议 | | named | | zone数据四、那 ZoneRunner 是什么ZoneRunner 是 F5 对 BIND 的管理层。原始 BIND你可能需要vim zone文件 rndc reloadF5提供GUICLIzrsh让管理员不用直接操作 BIND 文件。结构F5 BIG-IP | | ZoneRunner | | BIND named | | zone file五、zrsh 和 nsupdate 是不是一样不是。这是最容易混淆的地方。zrsh全称ZoneRunner Shell是F5自己提供的管理命令。例如进入ZoneRunner%执行arr增加记录。drr删除记录。dz查看zone。这些命令是 F5 自己设计的。nsupdate是BIND官方工具。不是 F5 的。标准 DNS 动态更新。区别zrshnsupdate来源F5BIND官方作用管理ZoneRunner动态更新DNS协议本地命令DNS UPDATE协议对象zone文件DNS数据F5支持有底层支持六、TMSH 又是什么TMSHTraffic Management Shell它也是 F5 CLI。但是它管理F5设备配置。例如查看 pooltmsh list ltm pool查看 DNS Wide IPtmsh list gtm wideip创建 DNS pooltmsh create gtm pool注意TMSH 管F5对象例如Wide IP Pool Virtual Server Listener DNS Profile iRule而不是zone file举个例子。你有www.example.com在 F5 里可能有两套东西第一套Wide IPTMSH管理tmsh create gtm wideip a www.example.com表示www.example.com | | F5智能调度 | | pool第二套Zone记录ZoneRunner管理zrsh arr example.com www.example.com 300 A 10.0.0.1表示DNS zone里面有一条记录所以TMSH | 管F5 DNS逻辑 ZoneRunner/zrsh | 管BIND zone数据七、几个命令的关系图完整F5 BIG-IP DNS | -------------------- | | tmsh ZoneRunner | | | | F5对象配置 zrsh命令 | | | | Wide IP/Pools zone记录 | | BIND | ----------- | | rndc nsupdate | | named服务八、再解释 commandResult 为什么一个为空一个是zone文本这个和 REST 包装有关。你的 F5 REST API实际上不是一个 DNS API。它做的是HTTP ↓ 执行Linux命令 ↓ 返回命令输出也就是说REST只是包了一层shell。例如调用arr增加记录。命令echo arr f5demo.com web5 A 10.0.0.1 | zrsh执行过程zrsh收到命令 ↓ 修改zone ↓ 成功 ↓ 没有输出类似Linuxmkdir test成功屏幕什么都没有。所以返回{commandResult:\n}意思命令成功但是没有输出。九、那为什么 dz 有输出因为dzDisplay Zone它本来就是查看。比如执行echo dz f5demo.com | zrshzrsh执行读取zone文件然后打印$ORIGIN f5demo.com. SOA ... NS ... www A 10.0.0.1 mail MX ...所以 REST 返回{commandResult:f5demo.comSOA...wwwA10.0.0.1...}十、为什么说客户端需要自己解析文本因为 F5 返回的是完整 zone 文件。例如返回example.com. SOA ns1.example.com. example.com. NS ns1.example.com. www.example.com. A 10.0.0.1 api.example.com. A 10.0.0.2 mail.example.com. MX mail.example.com.但是你的程序想知道www.example.com 的A记录是多少F5不会返回{name:www.example.com,type:A,value:10.0.0.1}而是给你一大段文本所以你必须自己写 parser读取文本 ↓ 匹配: www.example.com. ↓ 提取: A ↓ 提取: 10.0.0.1十一、对应到你的 PowerDNS API就非常明显你的GET /zones/example.com.返回{rrsets:[{name:www.example.com.,type:A,records:[{content:10.0.0.1}]}]}这是结构化数据。所以PowerDNSAPI直接理解DNS对象F5API只是执行命令然后吐文本这就是为什么你之前设计OpenResty PDNS API RRSet 锁比 F5 ZoneRunner 更像云 DNS 控制面。