先给一个总图:
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 Type(RR 类型):
例如:
| 类型 | 作用 | 例子 |
|---|---|---|
| A | IPv4地址 | www → 10.0.0.1 |
| AAAA | IPv6地址 | www → 2001::1 |
| CNAME | 别名 | api → www |
| MX | 邮件服务器 | |
| TXT | 文本 | SPF |
| NS | 域名服务器 | ns1 |
| SOA | 区域权威信息 | |
| 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 可以理解:
- A
- AAAA
- MX
- TXT
- SRV
- CNAME
- PTR
- DNSSEC记录
所以叫:
全类型。
Wide IP 只有6种是什么意思?
Wide IP 是 F5 GTM/DNS 的概念。
它不是普通 DNS 记录。
普通 DNS:
www.example.com ↓ A记录 ↓ 10.0.0.1F5:
www.example.com ↓ Wide IP ↓ Pool ↓ Virtual Server ↓ 10.0.0.1Wide IP 类似:
一个智能 DNS 调度入口。
F5 不只是返回IP,而是:
用户请求 www.xxx.com | | 判断: 哪个机房健康? 哪个服务器负载低? 哪个地域最近? | | 返回最佳IP所以 Wide IP 类型比较少:
例如:
| Wide IP类型 | 对应DNS |
|---|---|
| A | IPv4 |
| AAAA | IPv6 |
| CNAME | 别名 |
| 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,三条路径是什么?
CRUD:
Create Read Update DeleteDNS记录增删改查。
三条路径通常指:
F5管理DNS有三种方式:
路径1:ZoneRunner
直接改 BIND zone file。
例如:
example.com.zone增加:
www A 10.0.0.1路径2:BIND标准动态更新
通过:
nsupdate发送动态DNS更新。
流程:
nsupdate ↓ named ↓ zone file路径3:REST包装zrsh
也就是你看的文档:
REST API ↓ bash ↓ zrsh ↓ BINDF5 原本没有REST,所以绕一层。
5. DNSSEC签名有什么作用?
不要抽象理解。
没有DNSSEC:
攻击者:
用户问: www.bank.com是多少? 攻击者伪造: www.bank.com=8.8.8.8用户被骗。
DNSSEC:
服务器返回:
IP地址 + 数字签名客户端:
验证:
这个IP是不是域名主人发布的?类似:
HTTPS:
网站证书证明: 我是googleDNSSEC:
DNS记录证明: 我是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是什么?
Profile:
F5设备行为模板。
类似:
nginx server配置。
例如:
DNS Profile可以设置:
- 是否递归
- cache大小
- DNSSEC
- logging
- timeout
8. DNS Express是什么?
这是F5提高DNS性能的功能。
普通:
DNS请求 ↓ BIND(named) ↓ zone file读取DNS Express:
zone 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)
例如:
三个A:
www.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 ]所以:
你的API:
REPLACE 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加载
- DNSSEC
ZoneRunner
F5包装BIND的一层。
原始BIND:
改文件 reloadF5:
GUI CLI zrsh 管理BIND12. rndc/nsupdate是什么?
rndc
Remote 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是什么?
TMSH:
Traffic Management ShellF5自己的CLI。
类似:
Linux:
bashF5:
tmsh例如:
查看DNS:
tmsh list gtm wideip创建对象:
tmsh create gtm pool14. arr/drr/dz/azf/delz是什么?
这些都是zrsh命令。
来源文档 Appendix A。
arr
Add Resource Record
增加记录。
例如:
arr example.com www A 10.0.0.1drr
Delete Resource Record
删除记录。
dz
Display Zone
显示zone。
返回:
整个zone文件。
azf
Add Zone File
增加zone文件。
delz
Delete 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例如:
zone:
www 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 是干什么的?
rndc:
Remote Name Daemon Control中文:
远程控制 named 服务。
注意:
它控制的是named 进程。
例如:
查看状态:
rndc status告诉 BIND:
重新加载配置:
rndc reload清缓存:
rndc flush类似:
Linux:
systemctl 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:
提供:
GUI
CLI
zrsh
让管理员不用直接操作 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 动态更新。
区别:
| zrsh | nsupdate | |
|---|---|---|
| 来源 | F5 | BIND官方 |
| 作用 | 管理ZoneRunner | 动态更新DNS |
| 协议 | 本地命令 | DNS UPDATE协议 |
| 对象 | zone文件 | DNS数据 |
| F5支持 | 有 | 底层支持 |
六、TMSH 又是什么?
TMSH:
Traffic Management Shell它也是 F5 CLI。
但是它管理:
F5设备配置。
例如:
查看 pool:
tmsh list ltm pool查看 DNS Wide IP:
tmsh list gtm wideip创建 DNS pool:
tmsh create gtm pool注意:
TMSH 管:
F5对象例如:
Wide IP Pool Virtual Server Listener DNS Profile iRule而不是:
zone file举个例子。
你有:
www.example.com在 F5 里可能有两套东西:
第一套:Wide IP
TMSH管理:
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 ↓ 成功 ↓ 没有输出类似:
Linux:
mkdir test成功:
屏幕什么都没有。
所以:
返回:
{"commandResult":"\n"}意思:
命令成功,但是没有输出。
九、那为什么 dz 有输出?
因为:
dz:
Display 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"}]}]}这是结构化数据。
所以:
PowerDNS:
API直接理解DNS对象F5:
API只是执行命令,然后吐文本这就是为什么你之前设计:
OpenResty + PDNS API + RRSet + 锁比 F5 ZoneRunner 更像云 DNS 控制面。