三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

F5 答疑

F5 答疑

先给一个总图:

DNS 客户端 | | DNS 请求(Query) | +------------+-------------+ | | F5 DNS PowerDNS | | BIG-IP DNS模块 pdns_auth | | BIND(named) 数据库RR | ZoneRunner | zone file

F5 DNS 本质:

用 F5 做 DNS 流量控制,用 BIND 存储 DNS 数据。


1. ZoneRunner/BIND 全类型;Wide IP 仅6种是什么意思?

DNS 标准里面有很多 Resource Record Type(RR 类型):

例如:

类型作用例子
AIPv4地址www → 10.0.0.1
AAAAIPv6地址www → 2001::1
CNAME别名api → www
MX邮件服务器mail
TXT文本SPF
NS域名服务器ns1
SOA区域权威信息
SRV服务发现

这些叫:

DNS Resource Record Type

简称:

RR Type

ZoneRunner/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.1

F5:

www.example.com ↓ Wide IP ↓ Pool ↓ Virtual Server ↓ 10.0.0.1

Wide IP 类似:

一个智能 DNS 调度入口。

F5 不只是返回IP,而是:

用户请求 www.xxx.com | | 判断: 哪个机房健康? 哪个服务器负载低? 哪个地域最近? | | 返回最佳IP

所以 Wide IP 类型比较少:

例如:

Wide IP类型对应DNS
AIPv4
AAAAIPv6
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 Delete

DNS记录增删改查。

三条路径通常指:

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 ↓ BIND

F5 原本没有REST,所以绕一层。


5. DNSSEC签名有什么作用?

不要抽象理解。

没有DNSSEC:

攻击者:

用户问: www.bank.com是多少? 攻击者伪造: www.bank.com=8.8.8.8

用户被骗。


DNSSEC:

服务器返回:

IP地址 + 数字签名

客户端:

验证:

这个IP是不是域名主人发布的?

类似:

HTTPS:

网站证书证明: 我是google

DNSSEC:

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 + rsh

ZoneRunner Shell。

就是:

F5提供管理BIND zone的命令行。

类似:

Linux:

mysql>

进入数据库。

F5:

ZoneRunner%

里面:

输入:

arr drr dz

11. BIND9(named)、Zone Runner分别是什么?

BIND9

全称:

Berkeley Internet Name Domain

世界最老牌DNS服务器。

进程:

named

所以:

看到:

named

就是BIND服务。

负责:

  • DNS查询
  • zone加载
  • DNSSEC

ZoneRunner

F5包装BIND的一层。

原始BIND:

改文件 reload

F5:

GUI CLI zrsh 管理BIND

12. 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 Shell

F5自己的CLI。

类似:

Linux:

bash

F5:

tmsh

例如:

查看DNS:

tmsh list gtm wideip

创建对象:

tmsh create gtm pool

14. arr/drr/dz/azf/delz是什么?

这些都是zrsh命令。

来源文档 Appendix A。

arr

Add Resource Record

增加记录。

例如:

arr example.com www A 10.0.0.1

drr

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 delz

15. 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.1

named 读取这个文件。


但是:

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.1

rndc 不负责。

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 reload

F5:

提供:

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 动态更新。


区别:

zrshnsupdate
来源F5BIND官方
作用管理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 | zrsh

zrsh执行:

读取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 控制面。


← 返回列表